From: Han-Wen Nienhuys Date: Sun, 8 Sep 2002 00:52:56 +0000 (+0000) Subject: * lily/include/simultaneous-music-iterator.hh (class X-Git-Tag: release/1.6.3~34 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=697ccb90395ee375cd2339fe95f648dfe7728dd9;p=lilypond.git * lily/include/simultaneous-music-iterator.hh (class Simultaneous_music_iterator): use SCM list for list of iterators. * lily/cxx-function-smob.cc: remove file. * lily/include/cxx-function-smob.hh: remove file. * lily/include/music-iterator.hh (class Music_iterator): smobify music-iterator; many changes throughout. They are now constructed through procedures that return the smobbed iterator. * lily/syllable-group.cc (set_lyric_align): remove conditional again. * Documentation/bibliography/computer-notation.bib (note): add Beyond MIDI and The Virtual Score. --- diff --git a/ChangeLog b/ChangeLog index 5ccc5eb03b..923b253d21 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2002-09-08 Han-Wen Nienhuys + + * lily/include/simultaneous-music-iterator.hh (class + Simultaneous_music_iterator): use SCM list for list of iterators. + + * lily/cxx-function-smob.cc: remove file. + + * lily/include/cxx-function-smob.hh: remove file. + + * lily/include/music-iterator.hh (class Music_iterator): smobify + music-iterator; many changes throughout. They are now constructed + through procedures that return the smobbed iterator. + + * lily/include/*.hh: all derived_mark() functions are now const. + + * lily/syllable-group.cc (set_lyric_align): remove conditional + again. + + * Documentation/bibliography/computer-notation.bib (note): add + Beyond MIDI and The Virtual Score. + 2002-09-07 Rune Zedeler * input/sondag-morgen/*.ly: Tablature fixes @@ -8,14 +29,17 @@ * lily/musical-request.cc (String_number_req): Added - * lily/tab-note-heads-engraver.cc: Use String_number_req instead of Text_script_req; - read properties stringOneTopmost and highStringOne. + * lily/tab-note-heads-engraver.cc: Use String_number_req instead + of Text_script_req; read properties stringOneTopmost and + highStringOne. * ly/engraver-init.ly (tabStaffContext): Bugfix: remove Key_engraver set stringOneTopmost and highStringOne to #t * scm/output-lib.scm (tablature-stem-attachment-function): Changed (guitar-tunings): List added + ((every-nth-bar-number-visible n) barnum): Instead of + default-bar-number-visibility ((every-nth-bar-number-visible n) barnum): added * scm/grob-description.scm (TabNoteHead): Extra-offset added (UGH!) diff --git a/Documentation/bibliography/computer-notation.bib b/Documentation/bibliography/computer-notation.bib index b368d6fc30..7f60599f76 100644 --- a/Documentation/bibliography/computer-notation.bib +++ b/Documentation/bibliography/computer-notation.bib @@ -219,6 +219,33 @@ note = {A no-science-here review of Encore. HWN} } +@Book{selfridge-field97:_beyon_midi, + editor = {Eleanor Selfridge-Field}, + title = {Beyond MIDI}, + publisher = {MIT Press}, + year = 1997, + note = {Description of various music interchange formats.} +} + + +@Book{hewlett01:_virtual_score, + editor = {Walter B. Hewlett and Eleanor Selfridge-Field}, + title = {The Virtual Score; representation, retrieval and restoration}, + publisher = {MIT Press}, +series = {Computing in Musicology}, + year = 2001 +} + + + +@InProceedings{hoos98:_guido_music_notat_format, +title={The {GUIDO} Music Notation Format---A Novel Approach +for Adequately Representing Score-level Music}, +author = {H. H. Hoos and K. A. Hamel and K. Renz and J. Kilian}, +booktitle = {Proceedings of International Computer Music Conference}, +year = 1998, +pages = {451--454}, +} % LIME @Article {haken93, diff --git a/NEWS b/NEWS index 3666b32e1d..7030ee0f1f 100644 --- a/NEWS +++ b/NEWS @@ -10,8 +10,8 @@ now. * Completely rewritten MIDI import support. -* Completely rewritten grace note support. Practically speaking this means -that grace notes can be slurred to normal normal notes. +* Completely rewritten grace note support. Practically speaking this +means that grace notes can be slurred to normal normal notes. * Improved accidental handling and formatting: styles for producing cautionaries may vary, and complex collisions between accidentals of a diff --git a/input/regression/lyric-align.ly b/input/regression/lyric-align.ly index f93182b946..d709989dd7 100644 --- a/input/regression/lyric-align.ly +++ b/input/regression/lyric-align.ly @@ -11,8 +11,7 @@ %\paper { linewidth = -1. } \score { - \addlyrics - \context Voice = "v" \notes \relative c'' { +< \context Voice = "v" \notes \relative c'' { \property Staff.automaticMelismata = ##t \cadenzaOn a\breve \bar "||" a1 \bar "|" a \bar "|" a \bar "||" \break a \bar "|" a \bar "|" a \bar "|" a \bar "||" \break a \bar "|" a \bar "|." @@ -24,11 +23,10 @@ \property Lyrics . LyricText \override #'alignment = #-1 \property Lyrics . LyricText \override #'begin-alignment = #8 - "Particularly useful for reciting notes " - left + "Particularly useful for reciting notes "\breve + left1 \property Lyrics . LyricText \override #'alignment = #0 - centered \property Lyrics . LyricText \override #'alignment = #1 @@ -67,7 +65,13 @@ } \context LyricsVoice = "v-2" \lyrics { % \property LyricsVoice . stanza = "2:" - " with many syllables under them." l c r l l l x x x note' true' + " with many syllables under them."\breve + l1 c r1 l + l1 l x x x + + % note' true' + %% ? what are the last 2 for? } > + > } diff --git a/lily/auto-change-iterator.cc b/lily/auto-change-iterator.cc index e5ae076708..46f8f57c32 100644 --- a/lily/auto-change-iterator.cc +++ b/lily/auto-change-iterator.cc @@ -101,7 +101,6 @@ Auto_change_iterator::pending_pitch (Moment m) const m = iter->pending_moment (); } - delete iter; return ps; } diff --git a/lily/bar-check-iterator.cc b/lily/bar-check-iterator.cc index 6405496abc..af227ca0d9 100644 --- a/lily/bar-check-iterator.cc +++ b/lily/bar-check-iterator.cc @@ -22,15 +22,15 @@ public: VIRTUAL_COPY_CONS(Bar_check_iterator); virtual void process (Moment); Bar_check_iterator( ); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); }; -IMPLEMENT_CTOR_CALLBACK (Bar_check_iterator); +IMPLEMENT_CTOR_CALLBACK(Bar_check_iterator); Music * get_barcheck () { Music *bc = new Music; - bc->set_mus_property ("iterator-ctor", Bar_check_iterator::constructor_cxx_function); + bc->set_mus_property ("iterator-ctor", Bar_check_iterator::constructor_proc); return bc; } diff --git a/lily/bar-line.cc b/lily/bar-line.cc index d897133e21..03d8f61899 100644 --- a/lily/bar-line.cc +++ b/lily/bar-line.cc @@ -148,7 +148,6 @@ Bar_line::before_line_breaking (SCM smob) SCM proc = me->get_grob_property ("break-glyph-function"); g = gh_call2 (proc, g, scm_int2num (bsd)); } - if (!gh_string_p (g)) { diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc index 4f0a920dca..e580e17716 100644 --- a/lily/chord-tremolo-engraver.cc +++ b/lily/chord-tremolo-engraver.cc @@ -79,7 +79,7 @@ Chord_tremolo_engraver::try_music (Music * m) { Repeated_music * rp = dynamic_cast (m); if (rp - && rp->get_mus_property ("iterator-ctor") == Chord_tremolo_iterator::constructor_cxx_function + && rp->get_mus_property ("iterator-ctor") == Chord_tremolo_iterator::constructor_proc && !repeat_) { Moment l = rp->length_mom (); diff --git a/lily/chord-tremolo-iterator.cc b/lily/chord-tremolo-iterator.cc index 7cec33c302..4c602c8917 100644 --- a/lily/chord-tremolo-iterator.cc +++ b/lily/chord-tremolo-iterator.cc @@ -22,7 +22,7 @@ Chord_tremolo_iterator::construct_children () { Repeated_music * rep = dynamic_cast (get_music ()); factor_ = Moment (Rational(1, 1)); - child_iter_ = get_iterator (rep->body ()); + child_iter_ = unsmob_iterator (get_iterator (rep->body ())); } Chord_tremolo_iterator::Chord_tremolo_iterator () @@ -35,7 +35,16 @@ Chord_tremolo_iterator::Chord_tremolo_iterator (Chord_tremolo_iterator const &sr : Music_iterator (src) { factor_ = src.factor_; - child_iter_ = src.child_iter_ ? src.child_iter_->clone () : 0; + child_iter_ = src.child_iter_ ? src.child_iter_->clone () : 0; + if (child_iter_) + scm_gc_unprotect_object (child_iter_->self_scm()); +} + +void +Chord_tremolo_iterator::derived_mark () const +{ + if (child_iter_) + scm_gc_mark (child_iter_->self_scm()); } void @@ -65,11 +74,6 @@ Chord_tremolo_iterator::ok () const return child_iter_ && child_iter_->ok (); } -Chord_tremolo_iterator::~Chord_tremolo_iterator () -{ - delete child_iter_; -} - Music_iterator* Chord_tremolo_iterator::try_music_in_children (Music *m) const { diff --git a/lily/cxx-function-smob.cc b/lily/cxx-function-smob.cc index 4bdd4df701..e69de29bb2 100644 --- a/lily/cxx-function-smob.cc +++ b/lily/cxx-function-smob.cc @@ -1,67 +0,0 @@ -/* - grob-callback.cc -- implement Callback smob. - - source file of the GNU LilyPond music typesetter - - (c) 2000--2002 Han-Wen Nienhuys - - */ - -#include "cxx-function-smob.hh" -#include "ly-smobs.icc" - -static scm_t_bits callback_tag; - -static -SCM mark_smob (SCM) -{ - return SCM_EOL; -} - -static int -print_smob (SCM, SCM port, scm_print_state *) -{ - scm_puts ("#", port); - return 1; -} - -static size_t -free_smob (SCM) -{ - return 0; -} - -LY_DEFINE(cxx_function_type, "c++-function?", 1, 0, 0, (SCM x), - "Is this an encapsulated C++ function ?") -{ - return (SCM_CELL_TYPE (x)) == callback_tag ? SCM_BOOL_T : SCM_BOOL_F; -} - -void init_cxx_function_smobs () -{ - callback_tag = scm_make_smob_type ("callback", 0); - scm_set_smob_mark (callback_tag, mark_smob); - scm_set_smob_free (callback_tag, free_smob); - scm_set_smob_print (callback_tag, print_smob); - scm_set_smob_equalp (callback_tag, 0); -} - -SCM -smobify_cxx_function (Cxx_function cb) -{ - SCM z; - SCM_NEWSMOB(z,callback_tag, cb) ; - return z; -} - - -Cxx_function -unsmob_cxx_function (SCM x) -{ - - if (SCM_NIMP (x) && SCM_CELL_TYPE (x) == callback_tag) - return (Cxx_function) SCM_CELL_WORD_1 (x); - else - return 0; -} - diff --git a/lily/folded-repeat-iterator.cc b/lily/folded-repeat-iterator.cc index 016db26f40..92baa19021 100644 --- a/lily/folded-repeat-iterator.cc +++ b/lily/folded-repeat-iterator.cc @@ -31,18 +31,16 @@ Folded_repeat_iterator::ok () const return main_iter_ || alternative_iter_; } -Folded_repeat_iterator::~Folded_repeat_iterator () -{ - delete main_iter_; - delete alternative_iter_; -} - Folded_repeat_iterator::Folded_repeat_iterator (Folded_repeat_iterator const &src) : Music_iterator (src) { main_iter_ = src.main_iter_ ? src.main_iter_->clone () : 0; alternative_iter_ = src.alternative_iter_ ? src.alternative_iter_->clone () : 0; main_length_mom_ = src.main_length_mom_; + if (main_iter_) + scm_gc_unprotect_object (main_iter_->self_scm()); + if (alternative_iter_) + scm_gc_unprotect_object (alternative_iter_->self_scm()); } Moment @@ -60,7 +58,7 @@ void Folded_repeat_iterator::construct_children () { Repeated_music * mus = dynamic_cast (get_music ()); - main_iter_ = get_iterator (mus->body ()); + main_iter_ = unsmob_iterator (get_iterator (mus->body ())); if (!main_iter_->ok ()) { leave_body (); @@ -95,7 +93,6 @@ Folded_repeat_iterator::process (Moment m) alternative_iter_->process (m - main_length_mom_); if (!alternative_iter_->ok ()) { - delete alternative_iter_; alternative_iter_ =0; } } @@ -105,7 +102,7 @@ void Folded_repeat_iterator::leave_body () { Repeated_music * mus = dynamic_cast (get_music ()); - delete main_iter_; + main_iter_ = 0; main_length_mom_ += mus->body ()->length_mom (); } @@ -137,5 +134,12 @@ Folded_repeat_iterator::try_music_in_children (Music * m) const return alternative_iter_->try_music (m); return 0; } - +void +Folded_repeat_iterator::derived_mark()const +{ + if (main_iter_) + scm_gc_mark (main_iter_->self_scm()); + if (alternative_iter_) + scm_gc_mark (alternative_iter_->self_scm()); +} IMPLEMENT_CTOR_CALLBACK (Folded_repeat_iterator); diff --git a/lily/font-metric.cc b/lily/font-metric.cc index 5608420982..2a41c35dd5 100644 --- a/lily/font-metric.cc +++ b/lily/font-metric.cc @@ -104,7 +104,7 @@ Font_metric::get_char (int)const void -Font_metric::derived_mark () +Font_metric::derived_mark ()const { } diff --git a/lily/grace-iterator.cc b/lily/grace-iterator.cc index 4d99819fa6..9bfa7b3c69 100644 --- a/lily/grace-iterator.cc +++ b/lily/grace-iterator.cc @@ -14,13 +14,6 @@ #include "global-translator.hh" #include "warn.hh" - -Grace_iterator::~Grace_iterator () -{ - // child_iter_ = 0; -} - - void Grace_iterator::process (Moment m) { diff --git a/lily/grace-music.cc b/lily/grace-music.cc index 3aea71c706..516e02ce0e 100644 --- a/lily/grace-music.cc +++ b/lily/grace-music.cc @@ -36,14 +36,14 @@ Grace_music::start_mom () const Grace_music::Grace_music () { set_mus_property ("iterator-ctor", - Grace_iterator::constructor_cxx_function); + Grace_iterator::constructor_proc); } Grace_music::Grace_music (SCM p) : Music_wrapper (p) { set_mus_property ("iterator-ctor", - Grace_iterator::constructor_cxx_function); + Grace_iterator::constructor_proc); } ADD_MUSIC (Grace_music); diff --git a/lily/grob.cc b/lily/grob.cc index a30f020c8e..8119bedcbd 100644 --- a/lily/grob.cc +++ b/lily/grob.cc @@ -751,7 +751,7 @@ Grob::print_smob (SCM s, SCM port, scm_print_state *) } SCM -Grob::do_derived_mark () +Grob::do_derived_mark () const { return SCM_EOL; } diff --git a/lily/include/audio-item.hh b/lily/include/audio-item.hh index bd64140e19..9a742a7de0 100644 --- a/lily/include/audio-item.hh +++ b/lily/include/audio-item.hh @@ -17,10 +17,9 @@ #include "drul-array.hh" /** - Any piece of audio information. - We need virtual conclassors, - let's try decentralised factory for specific audio implemenations. - + + Any piece of audio information. We need virtual constructors, let's + try decentralised factory for specific audio implemenations. */ class Audio_item : public Audio_element { diff --git a/lily/include/auto-change-iterator.hh b/lily/include/auto-change-iterator.hh index cc54df7dd2..18a25aa406 100644 --- a/lily/include/auto-change-iterator.hh +++ b/lily/include/auto-change-iterator.hh @@ -17,7 +17,7 @@ class Auto_change_iterator : public Music_wrapper_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Auto_change_iterator (); diff --git a/lily/include/change-iterator.hh b/lily/include/change-iterator.hh index 65914db996..39e3f7a41d 100644 --- a/lily/include/change-iterator.hh +++ b/lily/include/change-iterator.hh @@ -19,7 +19,8 @@ public: VIRTUAL_COPY_CONS (Music_iterator); /* constructor is public */ virtual void process (Moment); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); + private: void error (String); }; diff --git a/lily/include/chord-tremolo-iterator.hh b/lily/include/chord-tremolo-iterator.hh index e9583bf704..ef8a753cd7 100644 --- a/lily/include/chord-tremolo-iterator.hh +++ b/lily/include/chord-tremolo-iterator.hh @@ -16,17 +16,16 @@ class Chord_tremolo_iterator : public Music_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Chord_tremolo_iterator (); Chord_tremolo_iterator (Chord_tremolo_iterator const & ); protected: - virtual ~Chord_tremolo_iterator (); + virtual void derived_mark () const; virtual Moment pending_moment () const; virtual void construct_children () ; virtual bool ok () const; virtual void process (Moment) ; virtual Music_iterator *try_music_in_children (Music *) const; - private: Moment factor_; Music_iterator * child_iter_; diff --git a/lily/include/cxx-function-smob.hh b/lily/include/cxx-function-smob.hh index 9a99f19848..e69de29bb2 100644 --- a/lily/include/cxx-function-smob.hh +++ b/lily/include/cxx-function-smob.hh @@ -1,21 +0,0 @@ -/* - cxx-function-smob.hh -- - source file of the GNU LilyPond music typesetter - - (c) 2000--2002 Han-Wen Nienhuys - - */ - -#ifndef CXX_FUNCT_SMOB_HH -#define CXX_FUNCT_SMOB_HH - -#include "lily-proto.hh" -#include "lily-guile.hh" - -typedef void * (*Cxx_function) (SCM param); -Cxx_function unsmob_cxx_function (SCM x); -SCM smobify_cxx_function (Cxx_function cb); - - -#endif /* CXX_FUNCT_SMOB_HH */ - diff --git a/lily/include/folded-repeat-iterator.hh b/lily/include/folded-repeat-iterator.hh index c5c087c94f..40fdedafd6 100644 --- a/lily/include/folded-repeat-iterator.hh +++ b/lily/include/folded-repeat-iterator.hh @@ -20,12 +20,11 @@ class Folded_repeat_iterator : public Music_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Folded_repeat_iterator (Folded_repeat_iterator const &src); Folded_repeat_iterator (); - ~Folded_repeat_iterator (); - + virtual void derived_mark () const; virtual void construct_children (); virtual Moment pending_moment () const; virtual bool ok () const; diff --git a/lily/include/font-metric.hh b/lily/include/font-metric.hh index 9e20283167..57cd47a75a 100644 --- a/lily/include/font-metric.hh +++ b/lily/include/font-metric.hh @@ -31,7 +31,7 @@ public: private: Font_metric (Font_metric const&); // no copy. protected: - virtual void derived_mark(); + virtual void derived_mark () const; Font_metric (); }; diff --git a/lily/include/grace-iterator.hh b/lily/include/grace-iterator.hh index b44bc8c41b..f3d33131fb 100644 --- a/lily/include/grace-iterator.hh +++ b/lily/include/grace-iterator.hh @@ -16,10 +16,9 @@ class Grace_iterator : public Music_wrapper_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - ~Grace_iterator (); virtual void construct_children () ; virtual void process (Moment); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Moment pending_moment () const; }; diff --git a/lily/include/grob.hh b/lily/include/grob.hh index 8f11341b25..ebc46be195 100644 --- a/lily/include/grob.hh +++ b/lily/include/grob.hh @@ -107,7 +107,7 @@ public: virtual void do_break_processing (); virtual Grob *find_broken_piece (System*) const; virtual void discretionary_processing (); - virtual SCM do_derived_mark (); + virtual SCM do_derived_mark () const; Molecule * get_molecule () const; SCM get_uncached_molecule () const; diff --git a/lily/include/item.hh b/lily/include/item.hh index 58c9969b62..8a0fd0b4b7 100644 --- a/lily/include/item.hh +++ b/lily/include/item.hh @@ -44,7 +44,7 @@ public: protected: virtual void discretionary_processing (); void copy_breakable_items (); - virtual SCM do_derived_mark (); + virtual SCM do_derived_mark () const; }; diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index be0f93997c..4a5e1d2ad5 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -275,19 +275,28 @@ public:\ } _ ## name ## _scm_initter; \ /* end define */ -#define LY_DEFINE(FNAME, PRIMNAME, REQ, OPT, VAR, ARGLIST, DOCSTRING) \ -SCM FNAME ARGLIST ; \ +#define LY_DEFINE_WITHOUT_DECL(INITPREFIX, FNAME, PRIMNAME, REQ, OPT, VAR, ARGLIST, DOCSTRING) \ SCM FNAME ## _proc;\ void \ -FNAME ## init ()\ +INITPREFIX ## init ()\ {\ FNAME ## _proc \ = scm_c_define_gsubr (PRIMNAME,REQ, OPT, VAR, (Scheme_function_unknown) FNAME);\ ly_add_function_documentation (PRIMNAME, #ARGLIST, DOCSTRING);\ }\ -ADD_SCM_INIT_FUNC (FNAME ## init_unique_prefix, FNAME ## init);\ +ADD_SCM_INIT_FUNC (INITPREFIX ## init_unique_prefix, INITPREFIX ## init);\ SCM \ FNAME ARGLIST\ +#define LY_DEFINE(FNAME, PRIMNAME, REQ, OPT, VAR, ARGLIST, DOCSTRING) \ +SCM FNAME ARGLIST ; \ +LY_DEFINE_WITHOUT_DECL(FNAME, FNAME, PRIMNAME, REQ, OPT, VAR, ARGLIST, DOCSTRING) + + +#define LY_DEFINE_MEMBER_FUNCTION(CLASS, FNAME, PRIMNAME, REQ, OPT, VAR, ARGLIST, DOCSTRING) \ +SCM FNAME ARGLIST ; \ +LY_DEFINE_WITHOUT_DECL(CLASS ## FNAME, CLASS::FNAME, PRIMNAME, REQ, OPT, VAR, ARGLIST, DOCSTRING) + + #endif /* LILY_GUILE_HH */ diff --git a/lily/include/lyric-combine-music-iterator.hh b/lily/include/lyric-combine-music-iterator.hh index 49251c0fe1..be19f67d27 100644 --- a/lily/include/lyric-combine-music-iterator.hh +++ b/lily/include/lyric-combine-music-iterator.hh @@ -19,7 +19,7 @@ public: VIRTUAL_COPY_CONS (Music_iterator); Lyric_combine_music_iterator (); Lyric_combine_music_iterator (Lyric_combine_music_iterator const&src); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); protected: virtual void construct_children (); virtual Moment pending_moment () const; @@ -27,8 +27,7 @@ protected: virtual Music_iterator *try_music_in_children (Music *) const; virtual bool ok () const; - virtual ~Lyric_combine_music_iterator (); - + virtual void derived_mark () const; private: bool get_busy_status ()const ; Music_iterator * music_iter_; diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index 759a55abb7..ae7c395d13 100644 --- a/lily/include/music-iterator.hh +++ b/lily/include/music-iterator.hh @@ -16,6 +16,7 @@ #include "virtual-methods.hh" #include "interpretation-context-handle.hh" #include "cxx-function-smob.hh" +#include "smobs.hh" /** --- @@ -62,14 +63,15 @@ class Music_iterator protected: Moment music_length_; Moment start_mom_; + + DECLARE_SMOBS (Music_iterator,dummy); public: VIRTUAL_COPY_CONS (Music_iterator); - + Moment music_length_mom () const; Moment music_start_mom () const; Music_iterator (); Music_iterator (Music_iterator const&); - virtual ~Music_iterator (); /** Do the reporting. Will try MUSIC_L_ in its own translator first, @@ -87,7 +89,7 @@ public: /** Get an iterator matching the type of MUS, and use TRANS to find an accompanying translation unit */ - static Music_iterator* get_static_get_iterator (Music * mus); + static SCM get_static_get_iterator (Music * mus); void init_translator (Music *, Translator_group *); virtual Moment pending_moment () const; @@ -95,18 +97,19 @@ public: virtual SCM get_pending_events (Moment until)const; virtual void process (Moment until); virtual void skip (Moment until); - + virtual void derived_mark ()const; + /** Construct sub-iterators, and set the translator to report to. */ virtual void construct_children (); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); /** Get an iterator for MUS, inheriting the translation unit from THIS. */ - Music_iterator* get_iterator (Music *) const; + SCM get_iterator (Music *) const; virtual Music_iterator* try_music_in_children (Music *) const; @@ -117,31 +120,17 @@ private: }; -/* - implement Class::constructor, a SCM function that - returns an encapsulated factory function. - */ #define IMPLEMENT_CTOR_CALLBACK(Class) \ -static void * \ -Class ## _ctor (SCM) \ +LY_DEFINE_MEMBER_FUNCTION(Class,constructor, #Class "::constructor",\ + 0,0,0,\ + (),\ + "Construct a " #Class " music iterator")\ { \ - return new Class ; \ + SCM val = (new Class)->self_scm(); \ + scm_gc_unprotect_object (val);\ + return val ; \ } \ -SCM Class :: constructor_cxx_function;\ -void \ -Class ## _constructor_init () \ -{ \ - SCM s = smobify_cxx_function (& Class ## _ctor); \ - scm_permanent_object (s);\ - gh_define (#Class "::constructor", s);\ - Class :: constructor_cxx_function = s;\ -}\ -ADD_SCM_INIT_FUNC (Class ## _ctor_init, Class ## _constructor_init); - - - - - +DECLARE_UNSMOB(Music_iterator, iterator); #endif // MUSIC_ITERATOR_HH diff --git a/lily/include/music-wrapper-iterator.hh b/lily/include/music-wrapper-iterator.hh index ad031f588d..d832a59ab9 100644 --- a/lily/include/music-wrapper-iterator.hh +++ b/lily/include/music-wrapper-iterator.hh @@ -22,11 +22,11 @@ class Music_wrapper_iterator : public Music_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Music_wrapper_iterator (); Music_wrapper_iterator (Music_wrapper_iterator const&); - ~Music_wrapper_iterator (); + virtual void derived_mark () const; virtual void construct_children () ; virtual Moment pending_moment () const; virtual bool ok () const; diff --git a/lily/include/output-property-music-iterator.hh b/lily/include/output-property-music-iterator.hh index 6677fb283e..b9cf40b015 100644 --- a/lily/include/output-property-music-iterator.hh +++ b/lily/include/output-property-music-iterator.hh @@ -15,7 +15,7 @@ class Output_property_music_iterator : public Simple_music_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); /* construction */ protected: virtual void process (Moment); diff --git a/lily/include/part-combine-music-iterator.hh b/lily/include/part-combine-music-iterator.hh index 713c333048..a2da0cabfd 100644 --- a/lily/include/part-combine-music-iterator.hh +++ b/lily/include/part-combine-music-iterator.hh @@ -19,9 +19,9 @@ public: Part_combine_music_iterator (); enum State { UNKNOWN, UNRELATED=1, SOLO1=2, SOLO2=4, UNIRHYTHM=8, UNISON=16, UNISILENCE=32, SPLIT_INTERVAL=64 }; - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); protected: - virtual ~Part_combine_music_iterator (); + virtual void derived_mark () const; Part_combine_music_iterator (Part_combine_music_iterator const &); virtual void construct_children (); virtual Moment pending_moment () const; diff --git a/lily/include/percent-repeat-iterator.hh b/lily/include/percent-repeat-iterator.hh index c73e995cb9..2d3effda54 100644 --- a/lily/include/percent-repeat-iterator.hh +++ b/lily/include/percent-repeat-iterator.hh @@ -16,11 +16,11 @@ class Percent_repeat_iterator : public Music_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Percent_repeat_iterator (); Percent_repeat_iterator (Percent_repeat_iterator const & ); protected: - virtual ~Percent_repeat_iterator (); + virtual void derived_mark () const; virtual Moment pending_moment () const; virtual void construct_children () ; virtual bool ok () const; diff --git a/lily/include/property-iterator.hh b/lily/include/property-iterator.hh index 9dd3b2cce0..c7c3cc5cda 100644 --- a/lily/include/property-iterator.hh +++ b/lily/include/property-iterator.hh @@ -22,7 +22,7 @@ class Property_iterator : public Simple_music_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); /* construction */ protected: virtual void process (Moment); @@ -38,7 +38,7 @@ class Property_unset_iterator : public Simple_music_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); /* construction */ protected: virtual void process (Moment); @@ -48,7 +48,7 @@ class Push_property_iterator : public Simple_music_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); protected: /* construction */ virtual void process (Moment); @@ -57,7 +57,7 @@ protected: class Pop_property_iterator : public Simple_music_iterator { public: - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); VIRTUAL_COPY_CONS (Music_iterator); protected: /* construction */ diff --git a/lily/include/request-chord-iterator.hh b/lily/include/request-chord-iterator.hh index 645b1c200b..b9eabca0da 100644 --- a/lily/include/request-chord-iterator.hh +++ b/lily/include/request-chord-iterator.hh @@ -31,7 +31,7 @@ class Request_chord_iterator : public Simple_music_iterator enum { NONE_DONE, START_DONE, END_DONE } status_; public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Request_chord_iterator (); Request_chord_iterator (Request_chord_iterator const&); diff --git a/lily/include/sequential-iterator.hh b/lily/include/sequential-iterator.hh index 09159dac36..3962136015 100644 --- a/lily/include/sequential-iterator.hh +++ b/lily/include/sequential-iterator.hh @@ -54,10 +54,10 @@ public: Grace_fixup * grace_fixups_; VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Sequential_iterator (); Sequential_iterator (Sequential_iterator const&); - virtual ~Sequential_iterator (); + virtual void derived_mark () const; virtual void construct_children (); virtual Moment pending_moment () const; diff --git a/lily/include/sequential-music-iterator.hh b/lily/include/sequential-music-iterator.hh index 31d4220927..b327fcfa96 100644 --- a/lily/include/sequential-music-iterator.hh +++ b/lily/include/sequential-music-iterator.hh @@ -19,7 +19,7 @@ class Sequential_music_iterator : public Sequential_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); private: virtual SCM get_music_list()const; virtual void descend_to_child (); diff --git a/lily/include/simple-music-iterator.hh b/lily/include/simple-music-iterator.hh index c969a3ba95..5fdb418261 100644 --- a/lily/include/simple-music-iterator.hh +++ b/lily/include/simple-music-iterator.hh @@ -23,7 +23,7 @@ protected: Moment last_processed_mom_; public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); Simple_music_iterator (); Simple_music_iterator (Simple_music_iterator const &); virtual void process (Moment); diff --git a/lily/include/simultaneous-music-iterator.hh b/lily/include/simultaneous-music-iterator.hh index 8d25491da1..78e7a941b5 100644 --- a/lily/include/simultaneous-music-iterator.hh +++ b/lily/include/simultaneous-music-iterator.hh @@ -11,7 +11,6 @@ #define SIMULTANEOUS_MUSIC_ITERATOR_HH #include "music-iterator.hh" -#include "cons.hh" class Simultaneous_music_iterator : public Music_iterator { @@ -19,8 +18,8 @@ public: VIRTUAL_COPY_CONS (Music_iterator); Simultaneous_music_iterator (); Simultaneous_music_iterator (Simultaneous_music_iterator const&); - virtual ~Simultaneous_music_iterator (); - static SCM constructor_cxx_function; + virtual void derived_mark () const; + DECLARE_SCHEME_CALLBACK(constructor, ()); /// make a new context for every child. bool separate_contexts_b_; @@ -37,7 +36,7 @@ protected: virtual Music_iterator *try_music_in_children (Music *) const; private: - Cons_list children_p_list_; + SCM children_list_; }; #endif // SIMULTANEOUS_MUSIC_ITERATOR_HH diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index c146182f17..e56560744e 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -55,7 +55,7 @@ public: static int compare (Spanner * const &,Spanner * const &); virtual Grob* find_broken_piece (System*) const; - virtual SCM do_derived_mark (); + virtual SCM do_derived_mark () const; static bool has_interface (Grob*); virtual System *get_system () const; protected: diff --git a/lily/include/time-scaled-music-iterator.hh b/lily/include/time-scaled-music-iterator.hh index 2ddcdf298c..2271908759 100644 --- a/lily/include/time-scaled-music-iterator.hh +++ b/lily/include/time-scaled-music-iterator.hh @@ -16,7 +16,7 @@ class Time_scaled_music_iterator : public Music_wrapper_iterator { public: VIRTUAL_COPY_CONS (Music_iterator); - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); /* construction */ protected: virtual void process (Moment); diff --git a/lily/include/virtual-font-metric.hh b/lily/include/virtual-font-metric.hh index 65bf6bdd13..13befc1c87 100644 --- a/lily/include/virtual-font-metric.hh +++ b/lily/include/virtual-font-metric.hh @@ -26,7 +26,7 @@ public: virtual Molecule find_by_name (String) const; protected: - virtual void derived_mark(); + virtual void derived_mark () const; }; diff --git a/lily/item.cc b/lily/item.cc index 12d4d48a47..77083104e0 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -174,7 +174,7 @@ Item::handle_prebroken_dependencies () } SCM -Item::do_derived_mark () +Item::do_derived_mark ()const { if (broken_to_drul_[LEFT]) scm_gc_mark (broken_to_drul_[LEFT]->self_scm ()); diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 7bf5e61783..2a3e3f19ef 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -193,8 +193,6 @@ void add_scm_init_func (void (*f) ()) scm_init_funcs_->push (f); } -extern void init_cxx_function_smobs (); - void ly_init_guile () @@ -202,7 +200,6 @@ ly_init_guile () SCM last_mod = scm_current_module (); scm_set_current_module (scm_c_resolve_module ("guile")); - init_cxx_function_smobs (); for (int i=scm_init_funcs_->size () ; i--;) (scm_init_funcs_->elem (i)) (); diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index 31439d1295..f47a60cbb2 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -52,14 +52,25 @@ Lyric_combine_music_iterator::ok () const return music_iter_->ok (); } +void +Lyric_combine_music_iterator::derived_mark()const +{ + if (music_iter_) + scm_gc_mark (music_iter_->self_scm()); + if (lyric_iter_) + scm_gc_mark (lyric_iter_->self_scm()); +} void Lyric_combine_music_iterator::construct_children () { Lyric_combine_music const * m = dynamic_cast (get_music ()); - music_iter_ = get_iterator (m->get_music ()); - lyric_iter_ = get_iterator (m->get_lyrics ()); + 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 @@ -117,17 +128,15 @@ Lyric_combine_music_iterator::process (Moment m) } -Lyric_combine_music_iterator::~Lyric_combine_music_iterator () -{ - delete lyric_iter_; - delete music_iter_; -} Lyric_combine_music_iterator::Lyric_combine_music_iterator (Lyric_combine_music_iterator const & src) : Music_iterator (src) { lyric_iter_ = src.lyric_iter_ ? src.lyric_iter_->clone () : 0; music_iter_ = src.music_iter_ ? src.music_iter_->clone () : 0; + + scm_gc_unprotect_object (music_iter_->self_scm()); + scm_gc_unprotect_object (lyric_iter_->self_scm()); } Music_iterator* diff --git a/lily/lyric-combine-music.cc b/lily/lyric-combine-music.cc index 861f2f1886..8e36faa674 100644 --- a/lily/lyric-combine-music.cc +++ b/lily/lyric-combine-music.cc @@ -15,7 +15,7 @@ Lyric_combine_music::Lyric_combine_music (SCM l) : Music (l) { set_mus_property ("iterator-ctor", - Lyric_combine_music_iterator::constructor_cxx_function); + Lyric_combine_music_iterator::constructor_proc); } diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc index dcb596a117..c2b4bd2cdc 100644 --- a/lily/music-iterator.cc +++ b/lily/music-iterator.cc @@ -17,8 +17,11 @@ #include "simple-music-iterator.hh" #include "context-specced-music.hh" +#include "ly-smobs.icc" + Music_iterator::Music_iterator () { + smobify_self (); } Music_iterator::Music_iterator (Music_iterator const& src) @@ -27,6 +30,7 @@ Music_iterator::Music_iterator (Music_iterator const& src) music_ = src.music_; music_length_ = src.music_length_; start_mom_ = src.start_mom_; + smobify_self (); } Music_iterator::~Music_iterator () @@ -42,7 +46,6 @@ Music_iterator::report_to () const return handle_.report_to (); } - void Music_iterator::set_translator (Translator_group *trans) { @@ -82,30 +85,34 @@ Music_iterator::get_pending_events (Moment)const return SCM_EOL; } -Music_iterator* +SCM Music_iterator::get_static_get_iterator (Music *m) { Music_iterator * p =0; SCM ctor = m->get_mus_property ("iterator-ctor") ; - if (unsmob_cxx_function (ctor)) + SCM iter = SCM_EOL; + if (gh_procedure_p (ctor)) { - Cxx_function f = unsmob_cxx_function (ctor); - - p = (Music_iterator*) (*f) (SCM_EOL); + iter = gh_call0 (ctor); + p = unsmob_iterator (iter); } - else if (dynamic_cast (m)) - p = new Music_wrapper_iterator; else { - p = new Simple_music_iterator ; + if (dynamic_cast (m)) + p = new Music_wrapper_iterator; + else + p = new Simple_music_iterator; + + iter = p->self_scm(); + scm_gc_unprotect_object (iter); } p->music_ = m; assert (m); p->music_length_ = m->length_mom (); p->start_mom_ = m->start_mom (); - return p; + return iter; } @@ -113,7 +120,6 @@ Moment Music_iterator::music_length_mom () const { return music_length_; - } Moment @@ -151,14 +157,16 @@ Music_iterator::init_translator (Music *m, Translator_group *report) } -Music_iterator* +SCM Music_iterator::get_iterator (Music *m) const { - Music_iterator*p = get_static_get_iterator (m); + SCM ip = get_static_get_iterator (m); + Music_iterator*p = unsmob_iterator (ip); + p->init_translator (m, report_to ()); p->construct_children (); - return p; + return ip; } /* @@ -166,7 +174,6 @@ Music_iterator::get_iterator (Music *m) const Iterator::try_music */ - Music_iterator* Music_iterator::try_music (Music *m) const { @@ -190,3 +197,29 @@ Music_iterator::get_music () const { return music_; } + +/****************************************************************/ + +IMPLEMENT_TYPE_P (Music_iterator, "ly-iterator?"); +IMPLEMENT_SMOBS(Music_iterator); +IMPLEMENT_DEFAULT_EQUAL_P(Music_iterator); + +SCM +Music_iterator::mark_smob (SCM smob) +{ + Music_iterator * mus = (Music_iterator *)SCM_CELL_WORD_1 (smob); + mus->derived_mark (); + return SCM_EOL; +} + +int +Music_iterator::print_smob (SCM , SCM port, scm_print_state*) +{ + scm_puts ("#", port); + return 1; +} + +void +Music_iterator::derived_mark()const +{ +} diff --git a/lily/music-wrapper-iterator.cc b/lily/music-wrapper-iterator.cc index 4980c9344f..e16787ac00 100644 --- a/lily/music-wrapper-iterator.cc +++ b/lily/music-wrapper-iterator.cc @@ -18,23 +18,24 @@ Music_wrapper_iterator::Music_wrapper_iterator () Music_wrapper_iterator::Music_wrapper_iterator (Music_wrapper_iterator const &src) : Music_iterator (src) { + child_iter_ = (src.child_iter_) ? src.child_iter_->clone () : 0; if (src.child_iter_) - child_iter_ = src.child_iter_->clone (); - else - child_iter_ = 0; + scm_gc_unprotect_object (child_iter_->self_scm()); } -Music_wrapper_iterator::~Music_wrapper_iterator () +void +Music_wrapper_iterator::derived_mark()const { - delete child_iter_; + if (child_iter_) + scm_gc_mark (child_iter_->self_scm()); } void Music_wrapper_iterator::construct_children () { - child_iter_ = - get_iterator (dynamic_cast (get_music ())->element ()); + Music * m = dynamic_cast (get_music ())-> element(); + child_iter_ = unsmob_iterator (get_iterator (m)); } bool diff --git a/lily/output-property-engraver.cc b/lily/output-property-engraver.cc index 2c494b8317..17b025423c 100644 --- a/lily/output-property-engraver.cc +++ b/lily/output-property-engraver.cc @@ -40,7 +40,7 @@ bool Output_property_engraver::try_music (Music* m) { if (m->get_mus_property ("iterator-ctor") == - Output_property_music_iterator::constructor_cxx_function) + Output_property_music_iterator::constructor_proc) { props_.push (m); return true; diff --git a/lily/parser.yy b/lily/parser.yy index 8586fe3d01..450fa77c5f 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -83,7 +83,7 @@ set_property_music (SCM sym, SCM value) Music * p = new Music (SCM_EOL); p->set_mus_property ("symbol", sym); p->set_mus_property ("iterator-ctor", - Property_iterator::constructor_cxx_function); + Property_iterator::constructor_proc); p->set_mus_property ("value", value); return p; @@ -811,7 +811,7 @@ Simple_music: m->set_mus_property ("grob-property", $3); m->set_mus_property ("grob-value", $5); m->set_mus_property ("iterator-ctor", - Output_property_music_iterator::constructor_cxx_function); + Output_property_music_iterator::constructor_proc); $$ = m; } @@ -839,7 +839,7 @@ Composite_music: | AUTOCHANGE STRING Music { Music * chm = new Music_wrapper (SCM_EOL); chm->set_mus_property ("element", $3->self_scm ()); - chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_cxx_function); + chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_proc); scm_gc_unprotect_object ($3->self_scm ()); chm->set_mus_property ("what", $2); @@ -1028,7 +1028,7 @@ translator_change: TRANSLATOR STRING '=' STRING { Music * t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", - Change_iterator::constructor_cxx_function); + Change_iterator::constructor_proc); t-> set_mus_property ("change-to-type", $2); t-> set_mus_property ("change-to-id", $4); @@ -1055,7 +1055,7 @@ property_def: Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", - Property_unset_iterator::constructor_cxx_function); + Property_unset_iterator::constructor_proc); t->set_mus_property ("symbol", scm_string_to_symbol ($4)); Context_specced_music *csm = new Context_specced_music (SCM_EOL); @@ -1073,7 +1073,7 @@ property_def: bool itc = internal_type_checking_global_b; Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", - Push_property_iterator::constructor_cxx_function); + Push_property_iterator::constructor_proc); t->set_mus_property ("symbol", scm_string_to_symbol ($4)); t->set_mus_property ("pop-first", SCM_BOOL_T); if (autobeam) @@ -1100,7 +1100,7 @@ property_def: Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", - Push_property_iterator::constructor_cxx_function); + Push_property_iterator::constructor_proc); t->set_mus_property ("symbol", scm_string_to_symbol ($4)); if (autobeam) @@ -1126,7 +1126,7 @@ property_def: bool itc = internal_type_checking_global_b; t->set_mus_property ("iterator-ctor", - Pop_property_iterator::constructor_cxx_function); + Pop_property_iterator::constructor_proc); t->set_mus_property ("symbol", scm_string_to_symbol ($4)); if (autobeam) internal_type_checking_global_b = false; diff --git a/lily/part-combine-music-iterator.cc b/lily/part-combine-music-iterator.cc index 7a871bc815..4d5682d06e 100644 --- a/lily/part-combine-music-iterator.cc +++ b/lily/part-combine-music-iterator.cc @@ -22,10 +22,13 @@ Part_combine_music_iterator::Part_combine_music_iterator () second_until_ = 0; } -Part_combine_music_iterator::~Part_combine_music_iterator () +void +Part_combine_music_iterator::derived_mark () const { - delete second_iter_; - delete first_iter_; + if (first_iter_) + scm_gc_mark (first_iter_->self_scm()); + if (second_iter_) + scm_gc_mark(second_iter_->self_scm()); } Part_combine_music_iterator::Part_combine_music_iterator (Part_combine_music_iterator const &src) @@ -38,6 +41,11 @@ Part_combine_music_iterator::Part_combine_music_iterator (Part_combine_music_ite second_until_ = src.second_until_; state_ = src.state_; suffix_ = src.suffix_; + + if (first_iter_) + scm_gc_unprotect_object (first_iter_->self_scm()); + if (second_iter_) + scm_gc_unprotect_object (second_iter_->self_scm()); } Moment @@ -64,8 +72,8 @@ Part_combine_music_iterator::construct_children () { Part_combine_music const * m = dynamic_cast (get_music ()); - first_iter_ = get_iterator (m->get_first ()); - second_iter_ = get_iterator (m->get_second ()); + first_iter_ = unsmob_iterator (get_iterator (m->get_first ())); + second_iter_ = unsmob_iterator (get_iterator (m->get_second ())); } void @@ -311,8 +319,8 @@ Part_combine_music_iterator::get_state (Moment) second_iter->skip (pending); now = pending; } - delete first_iter; - delete second_iter; + scm_gc_unprotect_object ( first_iter->self_scm()); + scm_gc_unprotect_object( second_iter->self_scm()); } return state; } diff --git a/lily/part-combine-music.cc b/lily/part-combine-music.cc index 7ab0a6f95a..da76cf1e94 100644 --- a/lily/part-combine-music.cc +++ b/lily/part-combine-music.cc @@ -15,7 +15,7 @@ Part_combine_music::Part_combine_music (SCM l) : Music (l) { set_mus_property ("iterator-ctor", - Part_combine_music_iterator::constructor_cxx_function); + Part_combine_music_iterator::constructor_proc); } void diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index 74c87e873b..70f1252879 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -85,7 +85,7 @@ Percent_repeat_engraver::try_music (Music * m) Repeated_music * rp = dynamic_cast (m); if (rp && rp->get_mus_property ("iterator-ctor") - == Percent_repeat_iterator::constructor_cxx_function + == Percent_repeat_iterator::constructor_proc && !repeat_) { body_length_ = rp->body_length_mom (); diff --git a/lily/percent-repeat-iterator.cc b/lily/percent-repeat-iterator.cc index 3bce52030a..285d114e93 100644 --- a/lily/percent-repeat-iterator.cc +++ b/lily/percent-repeat-iterator.cc @@ -24,6 +24,9 @@ Percent_repeat_iterator::Percent_repeat_iterator (Percent_repeat_iterator const { child_iter_ = p.child_iter_ ? p.child_iter_->clone (): 0; finish_mom_ = p.finish_mom_ ; + + if(child_iter_) + scm_gc_unprotect_object (child_iter_->self_scm()); } bool @@ -37,7 +40,7 @@ Percent_repeat_iterator::construct_children () { Repeated_music * mus =dynamic_cast (get_music ()); finish_mom_ = mus->length_mom (); - child_iter_ = get_iterator (mus->body ()); + child_iter_ = unsmob_iterator (get_iterator (mus->body ())); } @@ -58,7 +61,6 @@ Percent_repeat_iterator::process (Moment m) if (finish_mom_ <= m ) { - delete child_iter_; child_iter_ = 0; } } @@ -78,8 +80,9 @@ Percent_repeat_iterator::try_music_in_children (Music *m) const return child_iter_->try_music (m); } - -Percent_repeat_iterator::~Percent_repeat_iterator () +void +Percent_repeat_iterator::derived_mark()const { - delete child_iter_; + if (child_iter_) + scm_gc_mark (child_iter_->self_scm()); } diff --git a/lily/request-chord.cc b/lily/request-chord.cc index 322cf49e03..3de20f4b4f 100644 --- a/lily/request-chord.cc +++ b/lily/request-chord.cc @@ -7,13 +7,13 @@ Request_chord::Request_chord (SCM s) : Simultaneous_music (s) { set_mus_property ("iterator-ctor", - Request_chord_iterator::constructor_cxx_function); + Request_chord_iterator::constructor_proc); } Request_chord::Request_chord () { set_mus_property ("iterator-ctor", - Request_chord_iterator::constructor_cxx_function); + Request_chord_iterator::constructor_proc); } Pitch diff --git a/lily/score.cc b/lily/score.cc index e563c16789..0378a6f115 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -92,15 +92,14 @@ Score::run_translator (Music_output_def *odef) Music * music = unsmob_music (music_); trans->final_mom_ = music->length_mom (); - - Music_iterator * iter = Music_iterator::get_static_get_iterator (music); + SCM protected_iter = Music_iterator::get_static_get_iterator (music); + Music_iterator * iter = unsmob_iterator (protected_iter); iter->init_translator (music, trans); iter->construct_children (); if (! iter->ok ()) { - delete iter; warning (_ ("Need music in a score")); errorlevel_ =1; return ; @@ -108,7 +107,7 @@ Score::run_translator (Music_output_def *odef) trans->start (); trans->run_iterator_on_me (iter); - delete iter; + scm_remember_upto_here_1 (protected_iter); trans->finish (); if (errorlevel_) diff --git a/lily/sequential-iterator.cc b/lily/sequential-iterator.cc index 64247fd727..b49ff0748e 100644 --- a/lily/sequential-iterator.cc +++ b/lily/sequential-iterator.cc @@ -21,20 +21,6 @@ Grace_fixup *get_grace_fixups (SCM cursor); */ -/* - - TODO: the grace note handling hasn't been done for skip() and - get_pending_events(), meaning that staff-switching and partcombining will be - broken with grace notes. - - */ -/* - - TODO: the grace note handling hasn't been done for skip() and - get_pending_events(), meaning that staff-switching and partcombining will be - broken with grace notes. - - */ /* Invariant for the data structure. @@ -74,11 +60,16 @@ Sequential_iterator::Sequential_iterator (Sequential_iterator const &src) iter_ = src.iter_->clone (); else iter_ = 0; + + if (iter_) + scm_gc_unprotect_object (iter_->self_scm()); } -Sequential_iterator::~Sequential_iterator () +void +Sequential_iterator::derived_mark ()const { - delete iter_; + if (iter_) + scm_gc_mark (iter_->self_scm()); } @@ -143,7 +134,13 @@ Sequential_iterator::construct_children () list_ = get_music_list (); cursor_ = list_; - iter_ = gh_pair_p (cursor_) ? get_iterator (unsmob_music (ly_car (cursor_))) : 0; + iter_ = 0; + if (gh_pair_p (cursor_)) + { + Music *m =unsmob_music (ly_car (cursor_)); + iter_ = unsmob_iterator ( get_iterator (m)); + } + while (iter_ && !iter_->ok ()) { next_element (true); @@ -196,11 +193,10 @@ Sequential_iterator::next_element (bool side_effect) here_mom_ += len; } - delete iter_; cursor_ = ly_cdr (cursor_); if (gh_pair_p (cursor_)) - iter_ = get_iterator (unsmob_music (ly_car (cursor_))); + iter_ = unsmob_iterator (get_iterator (unsmob_music (ly_car (cursor_)))); else iter_ = 0; } @@ -266,8 +262,6 @@ Sequential_iterator::get_pending_events (Moment until)const Skip events till UNTIL. We don't do any other side effects such as descending to child iterator contexts, because they might depend on \context specs and \translator changes being executed - - TODO: check support for grace notes here. */ void Sequential_iterator::skip (Moment until) diff --git a/lily/sequential-music.cc b/lily/sequential-music.cc index 0933d28e53..6a1c6f5240 100644 --- a/lily/sequential-music.cc +++ b/lily/sequential-music.cc @@ -6,13 +6,13 @@ Sequential_music::Sequential_music (SCM head) : Music_sequence (head) { set_mus_property ("iterator-ctor", - Sequential_music_iterator::constructor_cxx_function); + Sequential_music_iterator::constructor_proc); } Sequential_music::Sequential_music () : Music_sequence () { set_mus_property ("iterator-ctor", - Sequential_music_iterator::constructor_cxx_function); + Sequential_music_iterator::constructor_proc); } diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index dcdf880ab5..9b6858929d 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -22,25 +22,35 @@ Simultaneous_music_iterator::Simultaneous_music_iterator (Simultaneous_music_ite : Music_iterator (src) { separate_contexts_b_ = src.separate_contexts_b_; - for (Cons *p = src.children_p_list_.head_; p; p = p->next_) + + SCM children_list = SCM_EOL; + SCM *tail = &children_list_; + for (SCM s = src.children_list_; gh_pair_p (s); s = gh_cdr(s)) { - Music_iterator *i = p->car_; - children_p_list_.append (new Killing_cons (i->clone (), 0)); + Music_iterator *i = unsmob_iterator (gh_car (s)); + SCM cl = i->clone ()->self_scm(); + *tail = scm_cons (cl, *tail); + tail = SCM_CDRLOC (*tail); + scm_gc_unprotect_object (cl); } + + children_list_ = children_list; + scm_remember_upto_here_1 (children_list); } -Simultaneous_music_iterator::~Simultaneous_music_iterator () +void +Simultaneous_music_iterator::derived_mark()const { - children_p_list_.junk (); + scm_gc_mark (children_list_); } SCM Simultaneous_music_iterator::get_pending_events (Moment m)const { SCM s = SCM_EOL; - for (Cons *p = children_p_list_.head_; p; p = p->next_) + for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s)) { - s = gh_append2 (p->car_->get_pending_events (m), s); + s = gh_append2 (unsmob_iterator (gh_car (s))->get_pending_events (m), s); } return s; } @@ -51,10 +61,15 @@ Simultaneous_music_iterator::construct_children () int j = 0; SCM i = get_music ()->get_mus_property ("elements"); + + children_list_ = SCM_EOL; + SCM * tail = &children_list_; for (; gh_pair_p (i); i = ly_cdr (i), j++) { Music *mus = unsmob_music (ly_car (i)); - Music_iterator * mi = get_static_get_iterator (mus); + + SCM scm_iter = get_static_get_iterator (mus); + Music_iterator * mi = unsmob_iterator (scm_iter); /* if separate_contexts_b_ is set, create a new context with the number number as name */ @@ -69,13 +84,12 @@ Simultaneous_music_iterator::construct_children () mi->init_translator (mus, t); mi->construct_children (); - + if (mi->ok ()) { - children_p_list_.append (new Killing_cons (mi,0)); + *tail = scm_cons (scm_iter, *tail); + tail = SCM_CDRLOC (*tail); } - else - delete mi; } } @@ -83,34 +97,44 @@ Simultaneous_music_iterator::construct_children () void Simultaneous_music_iterator::process (Moment until) { - for (Cons **pp = &children_p_list_.head_; *pp;) + SCM *proc = &children_list_; + while(gh_pair_p (*proc)) { - Music_iterator * i = (*pp)->car_; + Music_iterator * i = unsmob_iterator (gh_car (*proc)); if (i->pending_moment () == until) { i->process (until); } if (!i->ok ()) - delete children_p_list_.remove_cons (pp); + { + *proc = gh_cdr (*proc); + } else - pp = & (*pp)->next_; + { + proc = SCM_CDRLOC(*proc); + } } } void Simultaneous_music_iterator::skip (Moment until) { - for (Cons **pp = &children_p_list_.head_; *pp;) + SCM *proc = &children_list_; + while(gh_pair_p (*proc)) { - Music_iterator * i = (*pp)->car_; + Music_iterator * i = unsmob_iterator (gh_car (*proc)); if (i->pending_moment () <= until) { i->skip (until); } if (!i->ok ()) - delete children_p_list_.remove_cons (pp); + { + *proc = gh_cdr (*proc); + } else - pp = & (*pp)->next_; + { + proc = SCM_CDRLOC(*proc); + } } } @@ -120,8 +144,8 @@ Simultaneous_music_iterator::pending_moment () const Moment next; next.set_infinite (1); - for (Cons *p = children_p_list_.head_; p; p = p->next_) - next = next car_->pending_moment () ; + for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s)) + next = next pending_moment () ; return next; } @@ -130,15 +154,15 @@ Simultaneous_music_iterator::pending_moment () const bool Simultaneous_music_iterator::ok () const { - return children_p_list_.head_; + return gh_pair_p (children_list_); } Music_iterator* Simultaneous_music_iterator::try_music_in_children (Music *m) const { Music_iterator * b=0; - for (Cons *p = children_p_list_.head_; !b && p; p = p->next_) - b =p->car_->try_music (m); + for (SCM s = children_list_; !b && gh_pair_p (s); s = gh_cdr(s)) + b =unsmob_iterator (gh_car (s))->try_music (m); return b; } diff --git a/lily/simultaneous-music.cc b/lily/simultaneous-music.cc index 85a3b8136f..580a6f9b9d 100644 --- a/lily/simultaneous-music.cc +++ b/lily/simultaneous-music.cc @@ -20,14 +20,14 @@ Simultaneous_music::Simultaneous_music (SCM head) : Music_sequence (head) { set_mus_property ("iterator-ctor", - Simultaneous_music_iterator::constructor_cxx_function); + Simultaneous_music_iterator::constructor_proc); } Simultaneous_music::Simultaneous_music () : Music_sequence () { set_mus_property ("iterator-ctor", - Simultaneous_music_iterator::constructor_cxx_function); + Simultaneous_music_iterator::constructor_proc); } diff --git a/lily/spanner.cc b/lily/spanner.cc index 3ec5b0d25a..bc2d9bdd12 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -289,7 +289,7 @@ Spanner::get_broken_left_end_align () const } SCM -Spanner::do_derived_mark () +Spanner::do_derived_mark () const { /* We'd be fucked if this is called before spanned_drul_[] is inited. */ diff --git a/lily/syllable-group.cc b/lily/syllable-group.cc index 909a296bde..e4bf7a8f52 100644 --- a/lily/syllable-group.cc +++ b/lily/syllable-group.cc @@ -100,12 +100,12 @@ Syllable_group::add_extender (Grob * extender) bool Syllable_group::set_lyric_align (const char *punc, Grob *default_notehead) { - if (lyrics_.size ()<=1) + if (lyrics_.size () <= 0) { - // No lyrics or single line: nothing to do. + // No lyrics: nothing to do. return true; } - + Grob * lyric; alignment_ = appropriate_alignment (punc); diff --git a/lily/time-scaled-music-iterator.cc b/lily/time-scaled-music-iterator.cc index 4c1e81343e..cbba1e4f03 100644 --- a/lily/time-scaled-music-iterator.cc +++ b/lily/time-scaled-music-iterator.cc @@ -27,5 +27,5 @@ Time_scaled_music_iterator::process (Moment m) Music_wrapper_iterator::process (m); } - + IMPLEMENT_CTOR_CALLBACK (Time_scaled_music_iterator); diff --git a/lily/time-scaled-music.cc b/lily/time-scaled-music.cc index 2b79cc390b..a46483a491 100644 --- a/lily/time-scaled-music.cc +++ b/lily/time-scaled-music.cc @@ -14,7 +14,7 @@ Time_scaled_music::Time_scaled_music (SCM l) : Music_wrapper (l) { set_mus_property ("iterator-ctor", - Time_scaled_music_iterator::constructor_cxx_function); + Time_scaled_music_iterator::constructor_proc); } diff --git a/lily/unfolded-repeat-iterator.cc b/lily/unfolded-repeat-iterator.cc index 69bc3fbdc7..f4f56af6e4 100644 --- a/lily/unfolded-repeat-iterator.cc +++ b/lily/unfolded-repeat-iterator.cc @@ -15,7 +15,7 @@ source file of the GNU LilyPond music typesetter class Unfolded_repeat_iterator : public Sequential_iterator { public: - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); VIRTUAL_COPY_CONS (Music_iterator); protected: virtual SCM get_music_list () const; @@ -56,7 +56,7 @@ Unfolded_repeat_iterator::get_music_list () const class Volta_repeat_iterator : public Sequential_iterator { public: - static SCM constructor_cxx_function; + DECLARE_SCHEME_CALLBACK(constructor, ()); VIRTUAL_COPY_CONS (Music_iterator); Volta_repeat_iterator(); diff --git a/lily/virtual-font-metric.cc b/lily/virtual-font-metric.cc index 78e8806e4b..276a245096 100644 --- a/lily/virtual-font-metric.cc +++ b/lily/virtual-font-metric.cc @@ -33,10 +33,9 @@ Virtual_font_metric::Virtual_font_metric (SCM name_list, } void -Virtual_font_metric::derived_mark() +Virtual_font_metric::derived_mark()const { scm_gc_mark (font_list_); - } int diff --git a/scm/music-property-description.scm b/scm/music-property-description.scm index ffa83e31ef..b850493b96 100644 --- a/scm/music-property-description.scm +++ b/scm/music-property-description.scm @@ -21,7 +21,7 @@ -(music-property-description 'iterator-ctor c++-function? "Function to construct music-event-iterator object for this Music") +(music-property-description 'iterator-ctor procedure? "Function to construct music-event-iterator object for this Music") (music-property-description 'duration duration? "Duration of this note/lyric.") (music-property-description 'metronome-count number? "How many beats in a minute?") (music-property-description 'span-type string? "What kind of spanner should be created?