]> git.donarmstrong.com Git - lilypond.git/commitdiff
Protect a few events from gc.
authorDavid Kastrup <dak@gnu.org>
Sun, 10 Jun 2012 19:16:00 +0000 (21:16 +0200)
committerDavid Kastrup <dak@gnu.org>
Fri, 15 Jun 2012 12:09:46 +0000 (14:09 +0200)
Some may not be related to obscure errors we see, but as far as I can tell,
events don't have built-in protection when sticking around after their
time.  I have really no clue how grobs are protected from collection, but
since they do not seem to get extra treatment elsewhere, I hope they'll
be fine until output time.

lily/phrasing-slur-engraver.cc
lily/slur-engraver.cc
lily/staff-symbol-engraver.cc

index ea2439534c2b210e42250269471c7c26c684d3c6..9303df4f22b078a9609382eb146a8eef758d8514 100644 (file)
@@ -70,6 +70,7 @@ protected:
   void process_music ();
 
   virtual void finalize ();
+  virtual void derived_mark () const;
 
 public:
   TRANSLATOR_DECLARATIONS (Phrasing_slur_engraver);
@@ -79,6 +80,15 @@ Phrasing_slur_engraver::Phrasing_slur_engraver ()
 {
 }
 
+void
+Phrasing_slur_engraver::derived_mark () const
+{
+  for (vsize i=start_events_.size(); i--;)
+    scm_gc_mark (start_events_[i]->self_scm ());
+  for (vsize i=stop_events_.size(); i--;)
+    scm_gc_mark (stop_events_[i]->self_scm ());
+}
+
 IMPLEMENT_TRANSLATOR_LISTENER (Phrasing_slur_engraver, phrasing_slur);
 void
 Phrasing_slur_engraver::listen_phrasing_slur (Stream_event *ev)
@@ -165,6 +175,7 @@ Phrasing_slur_engraver::finalize ()
       slurs_[i]->warning (_ ("unterminated phrasing slur"));
       slurs_[i]->suicide ();
     }
+  slurs_.clear ();
 }
 
 void
index e4962852888aa809b9875aea09109313f82105cd..fde4d9447def65123f93532dc8421a8420e9a634 100644 (file)
@@ -71,6 +71,7 @@ protected:
   void process_music ();
 
   virtual void finalize ();
+  virtual void derived_mark () const;
 
 public:
   TRANSLATOR_DECLARATIONS (Slur_engraver);
@@ -80,6 +81,15 @@ Slur_engraver::Slur_engraver ()
 {
 }
 
+void
+Slur_engraver::derived_mark () const
+{
+  for (vsize i=start_events_.size(); i--;)
+    scm_gc_mark (start_events_[i]->self_scm ());
+  for (vsize i=stop_events_.size(); i--;)
+    scm_gc_mark (stop_events_[i]->self_scm ());
+}
+
 IMPLEMENT_TRANSLATOR_LISTENER (Slur_engraver, slur);
 void
 Slur_engraver::listen_slur (Stream_event *ev)
@@ -166,6 +176,7 @@ Slur_engraver::finalize ()
       slurs_[i]->warning (_ ("unterminated slur"));
       slurs_[i]->suicide ();
     }
+  slurs_.clear ();
 }
 
 void
index 509f86184a280b53bd2e6ab96bf7e5571bc00942..66ee8002a76ca376410033e6a043c4c355dfec1f 100644 (file)
@@ -46,8 +46,18 @@ protected:
   DECLARE_TRANSLATOR_LISTENER (staff_span);
   virtual void finalize ();
   void process_music ();
+  virtual void derived_mark () const;
 };
 
+void
+Staff_symbol_engraver::derived_mark () const
+{
+  for (LEFT_and_RIGHT (d)) {
+    if (span_events_[d])
+      scm_gc_mark (span_events_[d]->self_scm ());
+  }
+}
+
 Staff_symbol_engraver::~Staff_symbol_engraver ()
 {
   if (span_)