Moment music_start_mom () const;
Music_iterator ();
void report_event (Music *);
- Context *get_outlet () const;
- void set_context (Context *);
+ virtual Context *get_outlet () const;
+ virtual void set_context (Context *);
static SCM get_static_get_iterator (Music *mus);
void init_context (Music *, Context *);
void quit ();
Music_wrapper_iterator ();
DECLARE_CLASSNAME (Music_wrapper_iterator);
+ virtual Context *get_outlet () const;
+ virtual void set_context (Context *trans);
virtual void derived_substitute (Context *f, Context *t);
virtual void derived_mark () const;
virtual void construct_children ();
Careful with GC, although we intend the following as pointers
only, we _must_ mark them.
*/
- if (mus->get_outlet ())
- scm_gc_mark (mus->get_outlet ()->self_scm ());
+ /* Use handle_ directly as get_outlet is a virtual function and we
+ need to protect the context until Music_iterator::quit is being
+ run. */
+ if (mus->handle_.get_context ())
+ scm_gc_mark (mus->handle_.get_context ()->self_scm ());
if (mus->music_)
scm_gc_mark (mus->music_->self_scm ());
return Music_iterator::pending_moment ();
}
+Context *
+Music_wrapper_iterator::get_outlet () const
+{
+ if (child_iter_)
+ return child_iter_->get_outlet ();
+ return Music_iterator::get_outlet ();
+}
+
+void
+Music_wrapper_iterator::set_context (Context *trans)
+{
+ if (child_iter_)
+ child_iter_->set_context (trans);
+ Music_iterator::set_context (trans);
+}
+
IMPLEMENT_CTOR_CALLBACK (Music_wrapper_iterator);
bool