+void
+Staff_symbol_engraver::derived_mark () const
+{
+ for (LEFT_and_RIGHT (d))
+ {
+ if (span_events_[d])
+ scm_gc_mark (span_events_[d]->self_scm ());
+ }
+}
+
+Staff_symbol_engraver::~Staff_symbol_engraver ()
+{
+ if (span_)
+ {
+ // Somehow finalize() was not called?
+ programming_error ("Have a pending spanner in destructor.");
+ }
+}
+
+Staff_symbol_engraver::Staff_symbol_engraver (Context *c)
+ : Engraver (c)
+{
+ finished_span_ = 0;
+ first_start_ = true;
+ span_ = 0;
+ span_events_.set (0, 0);
+}
+
+void
+Staff_symbol_engraver::listen_staff_span (Stream_event *ev)
+{
+ Direction d = to_dir (ev->get_property ("span-direction"));
+ if (d)
+ ASSIGN_EVENT_ONCE (span_events_[d], ev);
+ else
+ programming_error ("staff-span event has no direction");
+}