From 250726a9cc8040956bba2533099c6d2fffdbc58f Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sun, 14 Jun 2015 17:43:13 +0200 Subject: [PATCH] Issue 4674: Disallow "Scheme_engraver" as an engraver class of its own It should not be registered as "Scheme_engraver", and no instances of it should be allowed to exist without a definition of their own. Also, instead of TRANSLATOR_DECLARATIONS_NO_LISTENER we use TRANSLATOR_FAMILY_DECLARATIONS for anything not pertaining to an individually documented translator. --- lily/include/scheme-engraver.hh | 7 +++---- lily/include/translator.hh | 17 ++++++++--------- lily/include/translator.icc | 9 ++++++--- lily/scheme-engraver.cc | 19 ++++--------------- lily/translator-group.cc | 9 +++------ 5 files changed, 24 insertions(+), 37 deletions(-) diff --git a/lily/include/scheme-engraver.hh b/lily/include/scheme-engraver.hh index c7d16d76e9..e22e572c7f 100644 --- a/lily/include/scheme-engraver.hh +++ b/lily/include/scheme-engraver.hh @@ -26,9 +26,10 @@ class Scheme_engraver : public Engraver { -public: void init_from_scheme (SCM definition); - TRANSLATOR_DECLARATIONS_NO_LISTENER (Scheme_engraver); +public: + TRANSLATOR_FAMILY_DECLARATIONS (Scheme_engraver); + Scheme_engraver (SCM definition); protected: ~Scheme_engraver (); @@ -68,8 +69,6 @@ private: // Alist of listened-symbol . scheme-function SCM listeners_alist_; - // We dont use this, but need it for the documentation boilerplate. - static Protected_scm listener_list_; SCM per_instance_listeners_; }; diff --git a/lily/include/translator.hh b/lily/include/translator.hh index 8154409efc..a4cf192fff 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -28,15 +28,11 @@ #include "std-vector.hh" #include "protected-scm.hh" -#define TRANSLATOR_DECLARATIONS_NO_LISTENER(NAME) \ +#define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \ public: \ - NAME (); \ VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ - static SCM static_description_; \ static Drul_array > acknowledge_static_array_drul_; \ - virtual void fetch_precomputable_methods (Callback methods[]); \ - virtual SCM static_translator_description () const; \ - virtual SCM translator_description () const; \ + virtual void fetch_precomputable_methods (Callback methods[]); \ static Grob_info_callback static_get_acknowledger (SCM sym); \ static Grob_info_callback static_get_end_acknowledger(SCM); \ virtual Grob_info_callback get_acknowledger (SCM sym) \ @@ -46,7 +42,7 @@ virtual Grob_info_callback get_end_acknowledger (SCM sym) \ { \ return static_get_end_acknowledger (sym); \ - } \ + } \ /* end #define */ /* @@ -57,10 +53,13 @@ */ #define TRANSLATOR_DECLARATIONS(NAME) \ - TRANSLATOR_DECLARATIONS_NO_LISTENER(NAME) \ -private: \ + TRANSLATOR_FAMILY_DECLARATIONS(NAME) \ + static SCM static_description_; \ static Protected_scm listener_list_; \ public: \ + NAME (); \ + virtual SCM static_translator_description () const; \ + virtual SCM translator_description () const; \ virtual SCM get_listener_list () const \ { \ return listener_list_; \ diff --git a/lily/include/translator.icc b/lily/include/translator.icc index 7fc128fe72..d505702136 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -72,12 +72,15 @@ return Translator::static_translator_description (grobs, desc, listener_list_, read, write); \ } -#define ADD_TRANSLATOR(classname, desc, grobs, read, write) \ +#define ADD_TRANSLATOR_FAMILY(classname) \ IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); \ + DEFINE_ACKNOWLEDGERS(classname) \ + +#define ADD_TRANSLATOR(classname, desc, grobs, read, write) \ + ADD_TRANSLATOR_FAMILY (classname) \ ADD_THIS_TRANSLATOR (classname); \ DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write) \ - DEFINE_ACKNOWLEDGERS(classname) \ - DEFINE_TRANSLATOR_LISTENER_LIST(classname) \ + DEFINE_TRANSLATOR_LISTENER_LIST(classname) \ #define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \ void \ diff --git a/lily/scheme-engraver.cc b/lily/scheme-engraver.cc index 7e601f8db7..ec4197641b 100644 --- a/lily/scheme-engraver.cc +++ b/lily/scheme-engraver.cc @@ -25,7 +25,7 @@ #include "translator.icc" -Scheme_engraver::Scheme_engraver () +Scheme_engraver::Scheme_engraver (SCM definition) { stop_translation_timestep_function_ = SCM_EOL; start_translation_timestep_function_ = SCM_EOL; @@ -39,6 +39,8 @@ Scheme_engraver::Scheme_engraver () must_be_last_ = false; per_instance_listeners_ = SCM_EOL; + + init_from_scheme (definition); } Scheme_engraver::~Scheme_engraver () @@ -194,17 +196,4 @@ Scheme_engraver::derived_mark () const ADD_ACKNOWLEDGER (Scheme_engraver, grob); ADD_END_ACKNOWLEDGER (Scheme_engraver, grob); -ADD_TRANSLATOR (Scheme_engraver, - /* doc */ - "Implement engravers in Scheme. Interprets arguments to" - " @code{\\consists} as callbacks.", - - /* create */ - "", - - /* read */ - "", - - /* write */ - "" - ); +ADD_TRANSLATOR_FAMILY (Scheme_engraver); diff --git a/lily/translator-group.cc b/lily/translator-group.cc index 831a4790b0..e3f8cba3e8 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -170,7 +170,6 @@ Translator_group::create_child_translator (SCM sev) type = get_translator (definition); else if (ly_is_pair (definition)) { - type = get_translator (ly_symbol2scm ("Scheme_engraver")); is_scheme = true; } else if (ly_is_procedure (definition)) @@ -179,17 +178,15 @@ Translator_group::create_child_translator (SCM sev) // an argument and evaluates to an a-list scheme engraver // definition. definition = scm_call_1 (definition, cs); - type = get_translator (ly_symbol2scm ("Scheme_engraver")); is_scheme = true; } - if (!type) + if (!is_scheme && !type) warning (_f ("cannot find: `%s'", ly_symbol2string (scm_car (s)).c_str ())); else { - Translator *instance = type->clone (); - if (is_scheme) - dynamic_cast (instance)->init_from_scheme (definition); + Translator *instance = is_scheme ? new Scheme_engraver (definition) + : type->clone (); SCM str = instance->self_scm (); -- 2.39.5