From 8f48aae564544d143022f5ddfde5bd9fdc600bf4 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sun, 10 Jun 2012 21:16:00 +0200 Subject: [PATCH] Protect a few events from gc. 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 | 11 +++++++++++ lily/slur-engraver.cc | 11 +++++++++++ lily/staff-symbol-engraver.cc | 10 ++++++++++ 3 files changed, 32 insertions(+) diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc index ea2439534c..9303df4f22 100644 --- a/lily/phrasing-slur-engraver.cc +++ b/lily/phrasing-slur-engraver.cc @@ -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 diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index e496285288..fde4d9447d 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -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 diff --git a/lily/staff-symbol-engraver.cc b/lily/staff-symbol-engraver.cc index 509f86184a..66ee8002a7 100644 --- a/lily/staff-symbol-engraver.cc +++ b/lily/staff-symbol-engraver.cc @@ -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_) -- 2.39.5