lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Uses derived_mark to avoid segfault (issue 5729051)


From: mtsolo
Subject: Uses derived_mark to avoid segfault (issue 5729051)
Date: Sat, 03 Mar 2012 22:27:16 +0000

Reviewers: ,

Message:
Hey all,

I don't have time to test this patch tonight (David sent me to bed) but
it should do the trick.  The map was overkill - a simple list of pairs
does the trick w/o anymore overhead and allows the use of derived_mark.

Cheers,
MS

Description:
Uses derived_mark to avoid segfault

Please review this at http://codereview.appspot.com/5729051/

Affected files:
  M lily/span-bar-stub-engraver.cc


Index: lily/span-bar-stub-engraver.cc
diff --git a/lily/span-bar-stub-engraver.cc b/lily/span-bar-stub-engraver.cc
index 7b26ddbd1e68ed1d0892471d3f465650661e1bdf..35a47207fa5f353519889393ca1a8e948883ac2f 100644
--- a/lily/span-bar-stub-engraver.cc
+++ b/lily/span-bar-stub-engraver.cc
@@ -17,7 +17,6 @@
   along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */

-#include <map>
 #include <algorithm>

 #include "align-interface.hh"
@@ -38,7 +37,7 @@
 class Span_bar_stub_engraver : public Engraver
 {
   vector<Grob *> spanbars_;
-  map<Grob *, Context *> axis_groups_;
+  SCM axis_groups_;

 public:
   TRANSLATOR_DECLARATIONS (Span_bar_stub_engraver);
@@ -46,10 +45,18 @@ protected:
   DECLARE_ACKNOWLEDGER (span_bar);
   DECLARE_ACKNOWLEDGER (hara_kiri_group_spanner);
   void process_acknowledged ();
+  virtual void derived_mark () const;
 };

 Span_bar_stub_engraver::Span_bar_stub_engraver ()
 {
+  axis_groups_ = SCM_EOL;
+}
+
+void
+Span_bar_stub_engraver::derived_mark () const
+{
+  scm_gc_mark (axis_groups_);
 }

 void
@@ -61,7 +68,7 @@ Span_bar_stub_engraver::acknowledge_span_bar (Grob_info i)
 void
 Span_bar_stub_engraver::acknowledge_hara_kiri_group_spanner (Grob_info i)
 {
-  axis_groups_[i.grob ()] = i.context ();
+ axis_groups_ = scm_cons (scm_cons (i.grob ()->self_scm (), i.context ()->self_scm ()), axis_groups_);
 }

 void
@@ -70,12 +77,10 @@ Span_bar_stub_engraver::process_acknowledged ()
   if (!spanbars_.size ())
     return;

- Grob *vertical_alignment = Grob::get_root_vertical_alignment ((*axis_groups_.begin ()).first); + Grob *vertical_alignment = Grob::get_root_vertical_alignment (unsmob_grob (scm_caar (axis_groups_))); if (!vertical_alignment) // we are at the beginning of a score, so no need for stubs
     return;

-  extract_grob_set (vertical_alignment, "elements", elts);
-
   for (vsize i = 0; i < spanbars_.size (); i++)
     {
       extract_grob_set (spanbars_[i], "elements", bars);
@@ -89,8 +94,14 @@ Span_bar_stub_engraver::process_acknowledged ()
       vector<Context *> affected_contexts;
       vector<Grob *> y_parents;
       vector<bool> keep_extent;
-      for (vsize j = 0; j < elts.size (); j++)
+      for (SCM s = axis_groups_; scm_is_pair (s); s = scm_cdr (s))
         {
+          Context *c = unsmob_context (scm_cdar (s));
+          Grob *g = unsmob_grob (scm_caar (s));
+          if (!c || !g)
+            continue;
+
+          vsize j = Grob::get_vertical_axis_group_index (g);
           if (j > bar_axis_indices[0]
               && j < bar_axis_indices.back ()
&& find (bar_axis_indices.begin (), bar_axis_indices.end (), j) == bar_axis_indices.end ())
@@ -101,12 +112,11 @@ Span_bar_stub_engraver::process_acknowledged ()
                   break;

               k--;
- keep_extent.push_back (to_boolean (bars[k]->get_property ("allow-span-bar")));

-              Context *c = axis_groups_[elts[j]];
               if (c && c->get_parent_context ())
                 {
-                  y_parents.push_back (elts[j]);
+ keep_extent.push_back (to_boolean (bars[k]->get_property ("allow-span-bar")));
+                  y_parents.push_back (g);
                   affected_contexts.push_back (c);
                 }
             }
@@ -122,7 +132,7 @@ Span_bar_stub_engraver::process_acknowledged ()
           gi.rerouting_daddy_context_ = affected_contexts[j];
           announce_grob (gi);
           if (!keep_extent[j])
- it->suicide ();//it->set_property ("Y-extent", ly_interval2scm (Interval (infinity_f, -infinity_f)));
+            it->suicide ();
         }
     }
   spanbars_.clear ();





reply via email to

[Prev in Thread] Current Thread [Next in Thread]