]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 3371: Avoid storing markups in an array in Page_layout_problem::add_footnotes_t...
authorDavid Kastrup <dak@gnu.org>
Sun, 19 May 2013 22:09:40 +0000 (00:09 +0200)
committerDavid Kastrup <dak@gnu.org>
Mon, 20 May 2013 10:10:19 +0000 (12:10 +0200)
They are not protected against garbage collection when the array is
allocated on the heap.

lily/page-layout-problem.cc

index c3cd382d41bf491a02fdf0eb921f30631d33fdf3..95635140bf1d223b0e68a659310654d91c08e7ee 100644 (file)
@@ -161,8 +161,10 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book
     in duplicated work, either by making this process less complicated or (preferably)
     by passing its results downstream.
   */
-  vector<SCM> footnote_number_markups; // Holds the numbering markups.
-  vector<Stencil> footnote_number_stencils; // Holds translated versions of the stencilized numbering markups.
+
+  // find the maximum X_AXIS length
+  Real max_length = -infinity_f;
+
   for (vsize i = 0; i < fn_count; i++)
     {
       if (fn_grobs[i])
@@ -172,43 +174,40 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book
             (void) scm_call_1 (assertion_function, scm_from_int (counter));
         }
       SCM markup = scm_call_1 (numbering_function, scm_from_int (counter));
-      Stencil *s = unsmob_stencil (Text_interface::interpret_markup (layout, props, markup));
-      if (!s)
+      SCM stencil = Text_interface::interpret_markup (layout, props, markup);
+      Stencil *st = unsmob_stencil (stencil);
+      if (!st)
         {
           programming_error ("Your numbering function needs to return a stencil.");
-          footnote_number_markups.push_back (SCM_EOL);
-          footnote_number_stencils.push_back (Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL));
-        }
-      else
-        {
-          footnote_number_markups.push_back (markup);
-          footnote_number_stencils.push_back (*s);
+          markup = SCM_EOL;
+          stencil = Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL).smobbed_copy ();
+          st = unsmob_stencil (stencil);
         }
+      in_text_numbers = scm_cons (markup, in_text_numbers);
+      numbers = scm_cons (stencil, numbers);
+
+      if (!st->extent (X_AXIS).is_empty ())
+        max_length = max (max_length, st->extent (X_AXIS)[RIGHT]);
+
       counter++;
     }
 
-  // find the maximum X_AXIS length
-  Real max_length = -infinity_f;
-  for (vsize i = 0; i < fn_count; i++)
-    max_length = max (max_length, footnote_number_stencils[i].extent (X_AXIS).length ());
+  in_text_numbers = scm_reverse_x (in_text_numbers, SCM_EOL);
+  numbers = scm_reverse_x (numbers, SCM_EOL);
 
   /*
     translate each stencil such that it attains the correct maximum length and bundle the
     footnotes into a scheme object.
   */
 
-  for (vsize i = 0; i < fn_count; i++)
+  for (SCM p = numbers; scm_is_pair (p); p = scm_cdr (p))
     {
-      in_text_numbers = scm_cons (footnote_number_markups[i], in_text_numbers);
-      footnote_number_stencils[i].translate_axis ((max_length
-                                                   - footnote_number_stencils[i].extent (X_AXIS).length ()),
-                                                  X_AXIS);
-      numbers = scm_cons (footnote_number_stencils[i].smobbed_copy (), numbers);
+      Stencil *st = unsmob_stencil (scm_car (p));
+      if (!st->extent (X_AXIS).is_empty ())
+        st->translate_axis ((max_length - st->extent (X_AXIS)[RIGHT]),
+                            X_AXIS);
     }
 
-  in_text_numbers = scm_reverse_x (in_text_numbers, SCM_EOL);
-  numbers = scm_reverse_x (numbers, SCM_EOL);
-
   // build the footnotes
 
   for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s))