]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4865/1: Move translator initializations to X::boot ()
authorDavid Kastrup <dak@gnu.org>
Sun, 29 May 2016 09:12:30 +0000 (11:12 +0200)
committerDavid Kastrup <dak@gnu.org>
Tue, 31 May 2016 09:14:18 +0000 (11:14 +0200)
This reorganization of the C++ translator initializations leads to more
predictable initialization order and makes the initializations have
access to private members of the class.  This is a precondition for more
restrictive access control, helping to pin down accidental references to
members of the wrong class.

lily/include/translator.hh
lily/include/translator.icc

index 3769b0e4b837c220d7f3e6078ee5e646eb556a25..6c081fa8a4f50232f1e4b803ea118a6d6a72b0c0 100644 (file)
@@ -73,6 +73,7 @@
   }                                                                     \
 public:                                                                 \
   NAME ();                                                              \
+  static void boot ();                                                  \
   virtual SCM static_translator_description () const;                   \
   virtual SCM translator_description () const;                          \
   virtual SCM get_listener_list () const                                \
index 867c61b43e6abbe0aa9a6314cd450148ef9db41c..fb95382c385d9c2e9f616ee5472a8bdfde9f2b4a 100644 (file)
@@ -35,6 +35,7 @@
   SCM T::static_description_ = SCM_EOL;                                 \
   static void _ ## T ## _adder ()                                       \
   {                                                                     \
+    T::boot ();                                                         \
     T *t = new T;                                                       \
     T::static_description_ =                                            \
       scm_permanent_object (t->static_translator_description ());       \
@@ -44,7 +45,7 @@
   {                                                                     \
     return static_description_;                                         \
   }                                                                     \
-  ADD_GLOBAL_CTOR (_ ## T ## _adder); \
+  ADD_GLOBAL_CTOR (_ ## T ## _adder);                                   \
   /* end define */
 
 #define DEFINE_TRANSLATOR_LISTENER_LIST(T) \
@@ -101,35 +102,22 @@ void add_acknowledger (SCM ptr,
                        Protected_scm &ack_hash);
 
 #define ADD_ACKNOWLEDGER(CLASS, NAME)                                   \
-  void CLASS ## NAME ## _ack_adder ()                                   \
-  {                                                                     \
-    add_acknowledger (CLASS::ack_finder<&CLASS::acknowledge_ ## NAME> (), \
-                      #NAME, CLASS::acknowledge_static_array_drul_[START]); \
-  }                                                                     \
-  ADD_SCM_INIT_FUNC (CLASS ## NAME ## _ack_adder_initclass, CLASS ## NAME ## _ack_adder);
+  add_acknowledger (CLASS::ack_finder<&CLASS::acknowledge_ ## NAME> (), \
+                    #NAME, CLASS::acknowledge_static_array_drul_[START]);
 
 #define ADD_END_ACKNOWLEDGER(CLASS, NAME)                               \
-  void CLASS ## NAME ## _end_ack_adder ()                               \
-  {                                                                     \
-    add_acknowledger (CLASS::ack_finder<&CLASS::acknowledge_end_ ## NAME> (), \
-                      #NAME, CLASS::acknowledge_static_array_drul_[STOP]); \
-  }                                                                     \
-  ADD_SCM_INIT_FUNC (CLASS ## NAME ## _end_ack_adder_initclass, CLASS ## NAME ## _end_ack_adder);
+  add_acknowledger (CLASS::ack_finder<&CLASS::acknowledge_end_ ## NAME> (), \
+                    #NAME, CLASS::acknowledge_static_array_drul_[STOP]);
+
 
 /*
   Implement the method cl::listen_##m, and make it listen to stream
   events of class m.
  */
-#define IMPLEMENT_TRANSLATOR_LISTENER(cl, m)            \
-void                                                    \
-cl :: _internal_declare_ ## m ()                        \
-{                                                       \
+#define ADD_LISTENER(cl, m)                                             \
   listener_list_ = scm_acons                                            \
     (event_class_symbol (#m),                                           \
      Callback_wrapper::make_smob                                        \
-     <trampoline <cl, &cl::listen_ ## m> > (), listener_list_);         \
-}                                                                       \
-                                                                        \
-ADD_SCM_INIT_FUNC (cl ## _declare_event_ ## m, cl::_internal_declare_ ## m);
+     <trampoline <cl, &cl::listen_ ## m> > (), listener_list_);
 
 #endif /* TRANSLATOR_ICC */