From 4b4a2cae9953cff69159f10763e990f5e4265ddd Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sun, 29 May 2016 11:12:30 +0200 Subject: [PATCH] Issue 4865/1: Move translator initializations to X::boot () 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 | 1 + lily/include/translator.icc | 30 +++++++++--------------------- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/lily/include/translator.hh b/lily/include/translator.hh index 3769b0e4b8..6c081fa8a4 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -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 \ diff --git a/lily/include/translator.icc b/lily/include/translator.icc index 867c61b43e..fb95382c38 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -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 \ - > (), listener_list_); \ -} \ - \ -ADD_SCM_INIT_FUNC (cl ## _declare_event_ ## m, cl::_internal_declare_ ## m); + > (), listener_list_); #endif /* TRANSLATOR_ICC */ -- 2.39.2