]> git.donarmstrong.com Git - lilypond.git/commit
Issue 4997/1: Add Preinit class for early initialization
authorDavid Kastrup <dak@gnu.org>
Sat, 4 Jun 2016 12:09:08 +0000 (14:09 +0200)
committerDavid Kastrup <dak@gnu.org>
Fri, 18 Nov 2016 20:49:58 +0000 (21:49 +0100)
commit0943e805fa82ebeb1d1ed32e675070467e340c39
tree540f914e7b9e41d9181082eeb555374fdac511c8
parent855e8e36a0c75aa75076fabe19aa292a6902ec96
Issue 4997/1: Add Preinit class for early initialization

This is a tricky thing: once a base class calls smobify_self () in
its constructor, further allocations during construction of base
class and derived classes might lead to mark_smob calls on the
object under construction.  When those call a virtual function like
derived_mark, the virtual function corresponding to the
incompletely initialized object is likely to be called.

This situation is acerbated in Guile 2.0 where the mark passes may occur
with only loose synchronization to the allocations.

The order of initialization of an object consists in calling the
constructors of virtual base classes, then of non-virtual base
classes, then initializing all data members.

As a result, the derived constructor comes too late for
initialization.  That's where the Preinit template class comes in.
Derive from it _before_ deriving from the smobifying base class
providing derived_mark, and it will call its Base class' pre_init
function (which must not rely on the instantiation being complete).

The pre_init function should then put the derived class into a state
_before_ its constructor or a constructor of its data members is being
called where it's safe to call its derived_mark function.  Note that in
particular that most STL data structures are in undefined state before
their constructor is being called, so the pre_init function has to
establish a state where derived_mark will not attempt to interpret data
members of types like std::vector which may not have been constructed
yet.
lily/include/smobs.hh