The copy constructor for Book assumes the list of objects to clone are
scores, which is unsafe since a \book(part) block can also contain markup and
page markers.
* input/regression (book-identifier-markup.ly):
new regtest
* lily/book.cc (copy constructor):
treat entries in scores_ separately, cloning Score and Page_marker objects
* lily/include/page-marker.hh, lily/page-marker.cc:
add copy constructor
--- /dev/null
+\version "2.13.42"
+
+\header {
+ texidoc = "A @code{\\book} or @code{\\bookpart} identifier can contain
+top-level markup and page-markers."
+}
+
+mypart = \bookpart {
+ \relative c' { c1 }
+ \label #'marker
+ \markup { Page \page-ref #'marker "8" "?" }
+}
+
+\bookpart { \mypart }
header_ = ly_make_module (false);
if (ly_is_module (s.header_))
ly_module_copy (header_, s.header_);
header_ = ly_make_module (false);
if (ly_is_module (s.header_))
ly_module_copy (header_, s.header_);
SCM *t = &scores_;
for (SCM p = s.scores_; scm_is_pair (p); p = scm_cdr (p))
{
SCM *t = &scores_;
for (SCM p = s.scores_; scm_is_pair (p); p = scm_cdr (p))
{
- Score *newscore = unsmob_score (scm_car (p))->clone ();
+ SCM entry = scm_car (p);
- *t = scm_cons (newscore->self_scm (), SCM_EOL);
+ if (Score *newscore = unsmob_score (entry))
+ *t = scm_cons (newscore->clone ()->unprotect (), SCM_EOL);
+ else if (Page_marker *marker = unsmob_page_marker (entry))
+ *t = scm_cons (marker->clone ()->unprotect (), SCM_EOL);
+ else
+ {
+ /* This entry is a markup list */
+ *t = scm_cons (entry, SCM_EOL);
+ }
- newscore->unprotect ();
#define PAGE_MARKER_HH
#include "smobs.hh"
#define PAGE_MARKER_HH
#include "smobs.hh"
+#include "virtual-methods.hh"
+ Page_marker (Page_marker const &);
+ VIRTUAL_COPY_CONSTRUCTOR (Page_marker, Page_marker);
+
void set_permission (SCM symbol, SCM permission);
void set_label (SCM label);
void set_permission (SCM symbol, SCM permission);
void set_label (SCM label);
+Page_marker::Page_marker (Page_marker const &src)
+{
+ symbol_ = src.symbol_;
+ permission_ = src.permission_;
+ label_ = src.label_;
+ smobify_self ();
+}
+
Page_marker::~Page_marker ()
{
}
Page_marker::~Page_marker ()
{
}
-Page_marker::print_smob (SCM smob, SCM port, scm_print_state*)
+Page_marker::print_smob (SCM smob, SCM port, scm_print_state *)
{
Page_marker *pm = (Page_marker *) SCM_CELL_WORD_1 (smob);
{
Page_marker *pm = (Page_marker *) SCM_CELL_WORD_1 (smob);
scm_puts ("#<Page_marker>", port);
return 1;
}
scm_puts ("#<Page_marker>", port);
return 1;
}