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 ();
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel