]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix #713
authorNicolas Sceaux <nicolas.sceaux@free.fr>
Mon, 22 Dec 2008 19:41:11 +0000 (20:41 +0100)
committerNicolas Sceaux <nicolas.sceaux@free.fr>
Mon, 22 Dec 2008 19:41:11 +0000 (20:41 +0100)
In Paper_book::output_aux(), for a parent Paper_book, despite the
looping:
  for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p))
not all children bookparts are processed, causing the bus error to
occur later on.

As a workaround, bookparts will be stored in Paper_book in straight
order (in Book::process_bookparts), instead of reverse order, to avoid
the multiple reversings (in paper_book.cc).

lily/book.cc
lily/paper-book.cc

index 3a84865462e4795f618fa995a477dca33d92e558..fa961d36f3ace94ce618565ab9c60aa9aef7235b 100644 (file)
@@ -200,9 +200,14 @@ Book::process_bookparts (Paper_book *output_paper_book, Output_def *paper, Outpu
         {
           Paper_book *paper_book_part = book->process (paper, layout, output_paper_book);
           if (paper_book_part)
-            output_paper_book->add_bookpart (paper_book_part->self_scm ());
+           {
+             output_paper_book->add_bookpart (paper_book_part->self_scm ());
+             paper_book_part->unprotect ();
+           }
         }
     }
+  /* In a Paper_book, bookparts are stored in straight order */
+  output_paper_book->bookparts_ = scm_reverse_x (output_paper_book->bookparts_, SCM_EOL);
 }
 
 void
index ea4424c86e777e9119f037cbb6882580a90949bc..7b43799e996db98af25b9499f15cd1240d10050a 100644 (file)
@@ -128,7 +128,7 @@ Paper_book::output_aux (SCM output_channel,
 
   if (scm_is_pair (bookparts_))
     {
-      for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p))
+      for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p))
        if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
          {
            bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p)));
@@ -521,7 +521,7 @@ Paper_book::systems ()
   systems_ = SCM_EOL;
   if (scm_is_pair (bookparts_))
     {
-      for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p))
+      for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p))
        if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
          systems_ = scm_append_x (scm_list_2 (systems_, pbookpart->systems ()));
     }
@@ -581,7 +581,7 @@ Paper_book::pages ()
   pages_ = SCM_EOL;
   if (scm_is_pair (bookparts_))
     {
-      for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p))
+      for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p))
        if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p)))
          pages_ = scm_append_x (scm_list_2 (pages_, pbookpart->pages ()));
     }