]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/include/simultaneous-music-iterator.hh (class
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 8 Sep 2002 00:52:56 +0000 (00:52 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 8 Sep 2002 00:52:56 +0000 (00:52 +0000)
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.

66 files changed:
ChangeLog
Documentation/bibliography/computer-notation.bib
NEWS
input/regression/lyric-align.ly
lily/auto-change-iterator.cc
lily/bar-check-iterator.cc
lily/bar-line.cc
lily/chord-tremolo-engraver.cc
lily/chord-tremolo-iterator.cc
lily/cxx-function-smob.cc
lily/folded-repeat-iterator.cc
lily/font-metric.cc
lily/grace-iterator.cc
lily/grace-music.cc
lily/grob.cc
lily/include/audio-item.hh
lily/include/auto-change-iterator.hh
lily/include/change-iterator.hh
lily/include/chord-tremolo-iterator.hh
lily/include/cxx-function-smob.hh
lily/include/folded-repeat-iterator.hh
lily/include/font-metric.hh
lily/include/grace-iterator.hh
lily/include/grob.hh
lily/include/item.hh
lily/include/lily-guile.hh
lily/include/lyric-combine-music-iterator.hh
lily/include/music-iterator.hh
lily/include/music-wrapper-iterator.hh
lily/include/output-property-music-iterator.hh
lily/include/part-combine-music-iterator.hh
lily/include/percent-repeat-iterator.hh
lily/include/property-iterator.hh
lily/include/request-chord-iterator.hh
lily/include/sequential-iterator.hh
lily/include/sequential-music-iterator.hh
lily/include/simple-music-iterator.hh
lily/include/simultaneous-music-iterator.hh
lily/include/spanner.hh
lily/include/time-scaled-music-iterator.hh
lily/include/virtual-font-metric.hh
lily/item.cc
lily/lily-guile.cc
lily/lyric-combine-music-iterator.cc
lily/lyric-combine-music.cc
lily/music-iterator.cc
lily/music-wrapper-iterator.cc
lily/output-property-engraver.cc
lily/parser.yy
lily/part-combine-music-iterator.cc
lily/part-combine-music.cc
lily/percent-repeat-engraver.cc
lily/percent-repeat-iterator.cc
lily/request-chord.cc
lily/score.cc
lily/sequential-iterator.cc
lily/sequential-music.cc
lily/simultaneous-music-iterator.cc
lily/simultaneous-music.cc
lily/spanner.cc
lily/syllable-group.cc
lily/time-scaled-music-iterator.cc
lily/time-scaled-music.cc
lily/unfolded-repeat-iterator.cc
lily/virtual-font-metric.cc
scm/music-property-description.scm

index 5ccc5eb03b94be344305df6c3be0cb90701dee22..923b253d21f3671cb3677dc3e8844499ac07ef22 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2002-09-08  Han-Wen Nienhuys  <hanwen@cs.uu.nl>
+
+       * 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  <rune@zedeler.dk>
 
        * input/sondag-morgen/*.ly: Tablature fixes
        
        * 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!)
index b368d6fc30e7ae663b528254eeda051f35582797..7f60599f76b2646725cd03d8381c147b6395ff5c 100644 (file)
@@ -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 3666b32e1d7beae841ef7f5d55b16747724987e0..7030ee0f1f3dbb8ef33aef375272f474b8e7f5a2 100644 (file)
--- 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
index f93182b946c118e91ef03d864bd060cb19b04e40..d709989dd714261db5132d864d8b9b5e2619b22f 100644 (file)
@@ -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 "|."
        \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        
       }
       \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? 
       }
    >
+   >
 }
index e5ae076708a81ec8a3a6ea60b67d743db3469481..46f8f57c3234715d3b11343f3967764799be56fe 100644 (file)
@@ -101,7 +101,6 @@ Auto_change_iterator::pending_pitch (Moment m) const
       m = iter->pending_moment ();
     }
 
-  delete iter;
   return ps;
 }
 
index 6405496abc97eb553a9e78735de85ad552897f67..af227ca0d99dd93e18a723afcf4954a0548c8512 100644 (file)
@@ -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;
 }
 
index d897133e216aec6fc9169ba2dd469492fe1420ea..03d8f618998f261451bd21c2dd2d4d1dabc16a28 100644 (file)
@@ -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))
     {
index 4f0a920dca27695566d73cf60f73906db82e420d..e580e177169b1165af31dc9b3673abe9fd65063f 100644 (file)
@@ -79,7 +79,7 @@ Chord_tremolo_engraver::try_music (Music * m)
 {
   Repeated_music * rp = dynamic_cast<Repeated_music*> (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 ();
index 7cec33c3026daaa5d33fbb5b0fd942e1a9291988..4c602c891729537fa638638064e6423ca39f765f 100644 (file)
@@ -22,7 +22,7 @@ Chord_tremolo_iterator::construct_children ()
 {
   Repeated_music * rep = dynamic_cast<Repeated_music*> (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
 {
index 4bdd4df7019c53bf26494bfe8f970e52759eaf6a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,67 +0,0 @@
-/*   
-  grob-callback.cc --  implement Callback smob.
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 2000--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#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 ("#<encapsulated C++ function>", 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;
-}
-
index 016db26f4059b170b7b671038b8c99f7cab512d6..92baa19021421014d2e2f3f8cfd9ab646ec6534d 100644 (file)
@@ -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<Repeated_music*> (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<Repeated_music *> (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);
index 5608420982e8fd548f38f1742fa4aefc058ccfed..2a41c35dd5e2247d30d1fcdae471d50faac471fe 100644 (file)
@@ -104,7 +104,7 @@ Font_metric::get_char (int)const
 
 
 void
-Font_metric::derived_mark ()
+Font_metric::derived_mark ()const
 {
   
 }
index 4d99819fa66b0cad13943b01db2768843ec11623..9bfa7b3c699a8b7561157a430c4836c19c7e4a0e 100644 (file)
 #include "global-translator.hh"
 #include "warn.hh"
 
-
-Grace_iterator::~Grace_iterator () 
-{
-  //  child_iter_ = 0;
-}
-
-
 void
 Grace_iterator::process (Moment m)
 {
index 3aea71c70682302bb863ae8d1916e38f7e22347d..516e02ce0e5eb4ce196f0d04a7462303b5e20152 100644 (file)
@@ -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);
index a30f020c8edee8978b6dfad794bebd5cb0d34bca..8119bedcbd5df3c7a9e7a9b4e82f85add4e023c3 100644 (file)
@@ -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;
 }
index bd64140e19086338c970517020bc215667190a6a..9a742a7de0d3783ac62ba454d50022e3ebc6f92c 100644 (file)
 #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
 {
index cc54df7dd2606a2fd5c890437a4724b3c5db3a02..18a25aa4062a2308d4de5b3a1c2e464511978865 100644 (file)
@@ -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 ();
 
index 65914db996237e85e854defb35ab061f5c6ef7e1..39e3f7a41d873a12fe292a3f04d1331b5637a7ea 100644 (file)
@@ -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);
 };
index e9583bf70498f00a41720d4a3bdecdea9724db2f..ef8a753cd752b71a78be4ec1a99d344e4fa3eaca 100644 (file)
@@ -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_;
index 9a99f1984846f7dd994b1c2068b323236505f5e5..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,21 +0,0 @@
-/*   
-     cxx-function-smob.hh --  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 2000--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#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 */
-
index c5c087c94f093730d292a8ed08e98296d5b1879f..40fdedafd6785c01fe6c9f27c6422565291517c9 100644 (file)
@@ -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;
index 9e202831676c900af1ae7dab863e5801fcc5a03e..57cd47a75a8852fc2df313553aca2145c6f138d9 100644 (file)
@@ -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 ();
 };
index b44bc8c41b8129b7a66d17893ebca55b2c7a5a7b..f3d33131fbe9b14f233d237d62861fbc2f60d700 100644 (file)
@@ -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;
 };
 
index 8f11341b254259805f4899dd743f5f48d6412b80..ebc46be195440b6c121cf60668dd789d96b68e12 100644 (file)
@@ -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;
index 58c9969b62df8a64ac2e17bbebcdf073dd0b7b1d..8a0fd0b4b7b9ef4e2ec69a4b5643e22cc85a6c2d 100644 (file)
@@ -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;
 };
 
 
index be0f93997c27450a649f9ba1f63dae3a5dccb349..4a5e1d2ad5f1154332c8d49d0ff031eb25097f68 100644 (file)
@@ -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 */
index 49251c0fe19da4e710eb5c5dee4d229ee6623565..be19f67d270e6b4b6c54ad6fd8d5a7ca710453c7 100644 (file)
@@ -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_;
index 759a55abb763c7c0c3c444ad4c0dc6f855bec836..ae7c395d1353c3c818d0531293a87bc57036a1c7 100644 (file)
@@ -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
index ad031f588d39074d51bea8a8127f84cc427da247..d832a59ab94867cd083f506c4d70cda0ffd56155 100644 (file)
@@ -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;
index 6677fb283e0b7a62872cf43ae28beb02e9e52c2f..b9cf40b015d946a313d0d2de88db84c73eef51e3 100644 (file)
@@ -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);
index 713c33304803707586355a11bb6fd2bc0e87e600..a2da0cabfd120da0cf8b4b74f7e7d89f7570fd58 100644 (file)
@@ -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;
index c73e995cb9c7f661f3923b0f2d5b17f46c275b9a..2d3effda5449f7a5c5416229352f0beab99b757c 100644 (file)
@@ -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;
index 9dd3b2cce08abb650bd8cca34278ee5991359e6b..c7c3cc5cda38f7c8bd9d511a95d77a40d5912a30 100644 (file)
@@ -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 */
index 645b1c200bf0b9a0045705744fd1d8003381fab9..b9eabca0dae6caa1d300c7ebd243d578f1152724 100644 (file)
@@ -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&);
 
index 09159dac36a62c91d2a0245569a1ea75ceac26d3..39621360155d0b7a0a60efc615b8ea869ef62bbb 100644 (file)
@@ -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;
index 31d4220927a1b8c2277ef4c0afe46891b3d0dd8b..b327fcfa96622331b17aad9ab8a84a5477d1ce30 100644 (file)
@@ -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 ();
index c969a3ba953025997124644d2aa6e8704f79d9c9..5fdb418261d08788c4055b7f1f3746f64c3a2999 100644 (file)
@@ -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);
index 8d25491da1e450ec0924fc92c403003cb72d7cde..78e7a941b5685d0d0badd809dbc7403172c34a06 100644 (file)
@@ -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<Music_iterator> children_p_list_;
+  SCM children_list_;
 };
 
 #endif // SIMULTANEOUS_MUSIC_ITERATOR_HH
index c146182f178807a527ddd34945d5e70040b16e13..e56560744e51b6d08c038e19b285a54e8156b475 100644 (file)
@@ -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:
index 2ddcdf298c2fbb1f8b41bd6f49af134836cf6d4d..227190875931a2ce66f640d2c9ee375934dc58ff 100644 (file)
@@ -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);
index 65bf6bdd134826047b12bfd32de8e30b72e70650..13befc1c8791c497a9b8b90ef4f37a140e6c1aed 100644 (file)
@@ -26,7 +26,7 @@ public:
   virtual Molecule find_by_name (String) const;
 
 protected:
-  virtual void derived_mark();
+  virtual void derived_mark () const;
 };
 
 
index 12d4d48a47c238576b82f771b6e980c88aa06624..77083104e06e4c2cf86f052592a52f263ccf5d77 100644 (file)
@@ -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 ());
index 7bf5e61783fef81cda6e9630c9e73f8683a5e932..2a3e3f19ef6ad909b171c9254f4b5630c2f0d5c3 100644 (file)
@@ -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)) ();
 
index 31439d12958fe532fcd9a14ada8e54da3e940411..f47a60cbb2fe34db1faf078c31dbbda607862f83 100644 (file)
@@ -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<Lyric_combine_music const*> (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*
index 861f2f1886fa59407442ee9c734db286baee7a55..8e36faa6747190296c2ac9da5ed56b639fd40e76 100644 (file)
@@ -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);
 }
 
 
index dcb596a117071a3d8fe78610b3c8992e0635a25c..c2b4bd2cdcc2e8e5dce64967eb0a8596ba06e14f 100644 (file)
 #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<Music_wrapper   *> (m))
-    p = new Music_wrapper_iterator;
   else
     {
-      p = new Simple_music_iterator ;
+      if (dynamic_cast<Music_wrapper *> (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 ("#<Music iterator>", port);
+  return 1;
+}
+
+void
+Music_iterator::derived_mark()const
+{
+}
index 4980c9344ff0322ba5249a3bae641bf8431d074c..e16787ac008748b5650a0fad00d9ab8a8121e0ea 100644 (file)
@@ -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<Music_wrapper const*> (get_music ())->element ());
+  Music * m =  dynamic_cast<Music_wrapper const*> (get_music ())-> element();  
+  child_iter_ = unsmob_iterator (get_iterator (m));
 }
 
 bool
index 2c494b8317242d98b5416a24bc2017771492942b..17b025423c3a73d8837ae2c7eec2d320b1733c5c 100644 (file)
@@ -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;
index 8586fe3d01bec8aa1fa206ea624ac3d39451e943..450fa77c5f0e35b7dc518ecba64cece2c55723d0 100644 (file)
@@ -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;
index 7a871bc815a26035d39eefeac5c344405d65a513..4d5682d06e79b3e1e8fb6d24a857ba0727c4f25b 100644 (file)
@@ -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<Part_combine_music const*> (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;
 }
index 7ab0a6f95a8db99b7ed0cef04272bf51aa0a28ef..da76cf1e941b84a20ec82f5121d19e3651cd42dc 100644 (file)
@@ -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
index 74c87e873bd6a5c9e125b56e29631b76ac585f2d..70f12528794343487c4538574fc815e861e7576a 100644 (file)
@@ -85,7 +85,7 @@ Percent_repeat_engraver::try_music (Music * m)
   Repeated_music * rp = dynamic_cast<Repeated_music*> (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 ();
index 3bce52030a378bdcc88e23b230561664591fc502..285d114e93c61a45cbb288f9cc1864226f2de3ff 100644 (file)
@@ -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<Repeated_music *> (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());
 }
index 322cf49e03ea563cd22ae24836d46b667b6b5244..3de20f4b4f92535ef6d651ae9ef8bb81e92c9905 100644 (file)
@@ -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
index e563c1678951a565a18e932e23c6c750fcbcd406..0378a6f115d44c2dd2c71320e741d3cff7686b5c 100644 (file)
@@ -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_)
index 64247fd72714cd8143bbf549b041ffdfe2f8c598..b49ff0748e237a2f9fb68b9d86a1477251beb5a6 100644 (file)
@@ -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)
index 0933d28e5308da8555914fbf5089b72a9c75826e..6a1c6f5240ef8dfe4c96bdf3ee467025e99e9f45 100644 (file)
@@ -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);
 }
 
 
index dcdf880ab5305f2250fad3b58bfdad75a8b20409..9b6858929db2af7738873d4605ff1269a0b7cd08 100644 (file)
@@ -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<Music_iterator> *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<Music_iterator> (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<Music_iterator> *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<Music_iterator> (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<Music_iterator> **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<Music_iterator> **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<Music_iterator> *p = children_p_list_.head_; p; p = p->next_)
-    next = next <? p->car_->pending_moment () ;
+  for (SCM s = children_list_; gh_pair_p (s); s = gh_cdr(s))
+    next = next <? unsmob_iterator (gh_car (s))->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<Music_iterator> *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;
 }
 
index 85a3b8136fd8de2222f4454b13bd9008004289d9..580a6f9b9d4fd44e5f33e4efdf2370960333218e 100644 (file)
@@ -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);
   
 }
 
index 3ec5b0d25a7d41557036046d41358adba72d680e..bc2d9bdd12a8f4047cd911529342727903476587 100644 (file)
@@ -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.  */
index 909a296bde62f3ed70e7ca8196ba8ec228607c34..e4bf7a8f52df09626ddc9cff55eee4e199941052 100644 (file)
@@ -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);
   
index 4c1e81343eb0c76333929f1ac9650641f5dd7e92..cbba1e4f03e449051456cdd6328133982015cc28 100644 (file)
@@ -27,5 +27,5 @@ Time_scaled_music_iterator::process (Moment m)
 
   Music_wrapper_iterator::process (m);
 }
-
 IMPLEMENT_CTOR_CALLBACK (Time_scaled_music_iterator);
index 2b79cc390b9eef526fbc7c2cbc0a198e7086df88..a46483a491c27d1b2b474abfd5c3924ef3e5e54e 100644 (file)
@@ -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);
   
 }
 
index 69bc3fbdc74bcc879fa43a9098812b804dbf4b07..f4f56af6e4441ccc7bbec9f6be8084822785e362 100644 (file)
@@ -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();
 
index 78e8806e4bdb42fb65077038b9d76d7031b3e9cf..276a2450965879dfd2eac5e50174e59d82c22c0b 100644 (file)
@@ -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
index ffa83e31ef311ce7a8090185d1b556c189fdee71..b850493b965752adb774d64e13263ad890b41580 100644 (file)
@@ -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?