scm_gc_unprotect_object (child_iter_->self_scm());
}
+void
+Chord_tremolo_iterator::do_quit()
+{
+ if (child_iter_)
+ child_iter_->quit();
+}
+
void
Chord_tremolo_iterator::derived_mark () const
{
{
return main_iter_ || alternative_iter_;
}
+void
+Folded_repeat_iterator::do_quit()
+{
+ if (main_iter_)main_iter_->quit();
+ if (alternative_iter_)alternative_iter_->quit();
+}
Folded_repeat_iterator::Folded_repeat_iterator (Folded_repeat_iterator const &src)
: Music_iterator (src)
alternative_iter_->process (m - main_length_mom_);
if (!alternative_iter_->ok ())
{
+ alternative_iter_->quit();
alternative_iter_ =0;
}
}
{
Repeated_music * mus = dynamic_cast<Repeated_music *> (get_music ());
+ main_iter_->quit ();
main_iter_ = 0;
main_length_mom_ += mus->body ()->length_mom ();
}
protected:
virtual void derived_mark () const;
virtual Moment pending_moment () const;
+ virtual void do_quit();
virtual void construct_children () ;
virtual bool ok () const;
virtual void process (Moment) ;
virtual void derived_mark () const;
virtual void construct_children ();
virtual Moment pending_moment () const;
+ virtual void do_quit();
virtual bool ok () const;
protected:
Interpretation_context_handle (Interpretation_context_handle const&);
Translator_group * report_to () const;
+ void quit ();
private:
Translator_group * report_to_;
void down ();
protected:
virtual void construct_children ();
virtual Moment pending_moment () const;
+ virtual void do_quit();
virtual void process (Moment);
virtual Music_iterator *try_music_in_children (Music *) const;
*/
static SCM get_static_get_iterator (Music * mus);
void init_translator (Music *, Translator_group *);
+void quit ();
+
virtual Moment pending_moment () const;
virtual bool ok () const;
virtual SCM get_pending_events (Moment until)const;
virtual void process (Moment until);
virtual void skip (Moment until);
virtual void derived_mark ()const;
+ virtual void construct_children ();
/**
Construct sub-iterators, and set the translator to
report to.
*/
- virtual void construct_children ();
+
DECLARE_SCHEME_CALLBACK(constructor, ());
/**
virtual Music_iterator* try_music_in_children (Music *) const;
Music * get_music () const;
+protected:
+ virtual void do_quit();
private:
Interpretation_context_handle handle_;
Music * music_;
virtual void derived_mark () const;
virtual void construct_children () ;
virtual Moment pending_moment () const;
+ virtual void do_quit();
virtual bool ok () const;
virtual SCM get_pending_events (Moment)const;
virtual void skip (Moment);
Part_combine_music_iterator (Part_combine_music_iterator const &);
virtual void construct_children ();
virtual Moment pending_moment () const;
+ virtual void do_quit();
virtual void process (Moment);
virtual SCM get_pending_events (Moment)const;
virtual Music_iterator *try_music_in_children (Music *) const;
protected:
virtual void derived_mark () const;
virtual Moment pending_moment () const;
+ virtual void do_quit();
virtual void construct_children () ;
virtual bool ok () const;
virtual void process (Moment) ;
virtual void construct_children ();
virtual Moment pending_moment () const;
+ virtual void do_quit();
virtual bool ok () const;
virtual void skip (Moment);
virtual SCM get_pending_events (Moment)const;
virtual void process (Moment);
virtual bool ok ()const;
virtual Moment pending_moment ()const;
+
virtual void skip (Moment);
};
virtual void construct_children ();
virtual Moment pending_moment () const;
+ virtual void do_quit();
virtual bool ok () const;
virtual SCM get_pending_events (Moment)const;
virtual void skip (Moment);
Interpretation_context_handle::~Interpretation_context_handle ()
{
- if (report_to_)
- down ();
+ /*
+ Don't do
+
+ if (report_to_)
+ down ();
+
+ with GC, this is asynchronous.
+ */
}
void
report_to_ = 0;
}
+void
+Interpretation_context_handle::quit ()
+{
+ if (report_to_) report_to_->iterator_count_ --;
+}
+
+
bool
Interpretation_context_handle::try_music (Music *m)
{
Translator_group*
Interpretation_context_handle::report_to ()const
{
+
return report_to_;
}
int n;
char * str = gulp_file (s, &n);
String result (str);
- delete str;
+ delete[] str;
if (verbose_global_b)
progress_indication ("]");
melisma_playing_req = new Melisma_playing_req;
melisma_stop_req = new Melisma_req;
melisma_start_req = new Melisma_req;
+ melisma_start_req->set_span_dir (START);
+ melisma_stop_req->set_span_dir (STOP);
}
- melisma_start_req->set_span_dir (START);
- melisma_stop_req->set_span_dir (STOP);
music_iter_ =0;
lyric_iter_ =0;
music_iter_ = unsmob_iterator (get_iterator (m->get_music ()));
lyric_iter_ = unsmob_iterator (get_iterator (m->get_lyrics ()));
-
- scm_gc_unprotect_object (music_iter_->self_scm());
- scm_gc_unprotect_object (lyric_iter_->self_scm());
}
bool
}
}
-
-
+void
+Lyric_combine_music_iterator::do_quit ()
+{
+ if (music_iter_) music_iter_->quit();
+ if (lyric_iter_) lyric_iter_->quit();
+
+}
Lyric_combine_music_iterator::Lyric_combine_music_iterator (Lyric_combine_music_iterator const & src)
: Music_iterator (src)
{
music_iter_ = src.music_iter_ ? src.music_iter_->clone () : 0;
if (lyric_iter_)
- scm_gc_unprotect_object (music_iter_->self_scm());
- if (music_iter_)
scm_gc_unprotect_object (lyric_iter_->self_scm());
+ if (music_iter_)
+ scm_gc_unprotect_object (music_iter_->self_scm());
}
Music_iterator*
Music_iterator::mark_smob (SCM smob)
{
Music_iterator * mus = (Music_iterator *)SCM_CELL_WORD_1 (smob);
+
mus->derived_mark ();
+ /*
+ Careful with GC, although we intend the following as pointers
+ only, we _must_ mark them.
+ */
+ if (mus->report_to())
+ scm_gc_mark (mus->report_to()->self_scm());
+ if (mus->music_)
+ scm_gc_mark (mus->music_->self_scm());
+
+
return SCM_EOL;
}
Music_iterator::derived_mark()const
{
}
+
+void
+Music_iterator::quit ()
+{
+ handle_.quit ();
+ do_quit ();
+}
+
+void
+Music_iterator::do_quit()
+{
+}
scm_gc_unprotect_object (child_iter_->self_scm());
}
+void
+Music_wrapper_iterator::do_quit()
+{
+ child_iter_->quit();
+}
+
void
Music_wrapper_iterator::derived_mark()const
{
scm_gc_mark(second_iter_->self_scm());
}
+void
+Part_combine_music_iterator::do_quit ()
+{
+ if (first_iter_) first_iter_->quit();
+ if (second_iter_) second_iter_->quit();
+}
Part_combine_music_iterator::Part_combine_music_iterator (Part_combine_music_iterator const &src)
: Music_iterator (src)
**** Tried this, but won't work:
- Consider thread switching: threads "one", "two" and "both".
+s Consider thread switching: threads "one", "two" and "both".
User can't pre-set the (most important) stem direction at
thread level!
*/
}
+void
+Percent_repeat_iterator::do_quit()
+{
+ if (child_iter_) child_iter_->quit();
+}
Percent_repeat_iterator::Percent_repeat_iterator (Percent_repeat_iterator const & p)
: Music_iterator (p)
{
trans->start ();
trans->run_iterator_on_me (iter);
+ iter->quit();
scm_remember_upto_here_1 (protected_iter);
trans->finish ();
return SCM_EOL;
}
+void
+Sequential_iterator::do_quit ()
+{
+ if (iter_) iter_->quit();
+}
+
+
Sequential_iterator::Sequential_iterator (Sequential_iterator const &src)
: Music_iterator (src)
{
if (gh_pair_p (cursor_))
{
Music *m =unsmob_music (ly_car (cursor_));
- iter_ = unsmob_iterator ( get_iterator (m));
+ iter_ = unsmob_iterator (get_iterator (m));
}
while (iter_ && !iter_->ok ())
cursor_ = ly_cdr (cursor_);
+ iter_->quit();
if (gh_pair_p (cursor_))
iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_))));
else
SCM
Sequential_music_iterator::get_music_list()const
{
- return dynamic_cast<Music_sequence const*> (get_music ())->music_list ();
+ return dynamic_cast<Music_sequence const*> (get_music ())->music_list ();
}
*tail = scm_cons (scm_iter, *tail);
tail = SCM_CDRLOC (*tail);
}
+ else
+ mi->set_translator (0);
}
}
-
void
Simultaneous_music_iterator::process (Moment until)
{
return b;
}
+void
+Simultaneous_music_iterator::do_quit ()
+{
+ for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s))
+ unsmob_iterator (gh_car (s))->quit();
+}
IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator);
{
delete istream_;
istream_ = 0;
- delete contents_str0_;
+ delete[] contents_str0_;
}
Slice