From: David Kastrup Date: Sat, 4 Jun 2016 17:31:31 +0000 (+0200) Subject: Issue 4997/7: Use Preinit for Global_context, protect output definition X-Git-Url: https://git.donarmstrong.com/lilypond.git?a=commitdiff_plain;h=b0dce4ca74c6ebf43a3f574ccf281b8bc58a3b75;p=lilypond.git Issue 4997/7: Use Preinit for Global_context, protect output definition --- diff --git a/lily/context.cc b/lily/context.cc index 7de61c5796..a614146058 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -756,6 +756,11 @@ Context::print_smob (SCM port, scm_print_state *) const return 1; } +void +Context::derived_mark () const +{ +} + SCM Context::mark_smob () const { @@ -776,6 +781,8 @@ Context::mark_smob () const if (events_below_) scm_gc_mark (events_below_->self_scm ()); + derived_mark (); + return properties_scm_; } diff --git a/lily/global-context.cc b/lily/global-context.cc index c21deb3b9b..47e76718db 100644 --- a/lily/global-context.cc +++ b/lily/global-context.cc @@ -30,6 +30,12 @@ using namespace std; #include "output-def.hh" #include "warn.hh" +void +Global_context::pre_init () +{ + output_def_ = 0; +} + Global_context::Global_context (Output_def *o) : Context () { @@ -56,6 +62,13 @@ Global_context::Global_context (Output_def *o) accepts_list_ = scm_list_1 (default_child_); } +void +Global_context::derived_mark () const +{ + if (output_def_) + scm_gc_mark (output_def_->self_scm ()); +} + Output_def * Global_context::get_output_def () const { diff --git a/lily/include/context.hh b/lily/include/context.hh index 468f612061..2555bfe2b4 100644 --- a/lily/include/context.hh +++ b/lily/include/context.hh @@ -51,6 +51,7 @@ private: Stream_event *infant_event_; protected: + virtual void derived_mark () const; Context *daddy_context_; /* The used Context_def */ SCM definition_; diff --git a/lily/include/global-context.hh b/lily/include/global-context.hh index 75b52c95ae..fd6f1f92c0 100644 --- a/lily/include/global-context.hh +++ b/lily/include/global-context.hh @@ -23,15 +23,17 @@ #include "context.hh" #include "pqueue.hh" -class Global_context : public Context +class Global_context : public Preinit, public Context { PQueue extra_mom_pq_; Output_def *output_def_; + virtual void derived_mark () const; DECLARE_CLASSNAME (Global_context); friend class Output_def; public: + void pre_init (); Global_context (Output_def *); int get_moments_left () const; Moment sneaky_insert_extra_moment (Moment);