From c1d7bc2217462a63bf5c5c6d6f6df5cb00099180 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Tue, 3 May 2016 19:11:15 +0200 Subject: [PATCH] Issue 4842/6: Don't special-case Scheme_engraver's acknowledgers --- lily/include/scheme-engraver.hh | 13 ++++++---- lily/include/translator.hh | 26 +++++++++++--------- lily/include/translator.icc | 7 ++---- lily/scheme-engraver.cc | 42 ++++----------------------------- 4 files changed, 30 insertions(+), 58 deletions(-) diff --git a/lily/include/scheme-engraver.hh b/lily/include/scheme-engraver.hh index 103176fc37..ffce5fa204 100644 --- a/lily/include/scheme-engraver.hh +++ b/lily/include/scheme-engraver.hh @@ -46,15 +46,20 @@ protected: virtual bool must_be_last () const; private: - void acknowledge_grob_by_hash (Grob_info info, SCM iface_function_hash); + virtual SCM get_acknowledger (SCM sym) + { + return generic_get_acknowledger (sym, interface_acknowledger_hash_); + } + virtual SCM get_end_acknowledger (SCM sym) + { + return generic_get_acknowledger (sym, interface_end_acknowledger_hash_); + } + void init_acknowledgers (SCM alist, SCM *hash); // For now no description. In future, something derived from the // definition might make sense. SCM translator_description () const { return SCM_EOL; } - DECLARE_ACKNOWLEDGER (grob); - DECLARE_END_ACKNOWLEDGER (grob); - bool must_be_last_; SCM acknowledge_grob_function_; diff --git a/lily/include/translator.hh b/lily/include/translator.hh index 02761d3d2e..3769b0e4b8 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -32,20 +32,9 @@ #define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \ public: \ VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ - static Drul_array acknowledge_static_array_drul_; \ virtual void fetch_precomputable_methods (SCM methods[]); \ DECLARE_TRANSLATOR_CALLBACKS (NAME); \ TRANSLATOR_INHERIT (Translator) \ - static SCM static_get_acknowledger (SCM sym); \ - static SCM static_get_end_acknowledger(SCM); \ - virtual SCM get_acknowledger (SCM sym) \ - { \ - return static_get_acknowledger (sym); \ - } \ - virtual SCM get_end_acknowledger (SCM sym) \ - { \ - return static_get_end_acknowledger (sym); \ - } \ /* end #define */ #define TRANSLATOR_INHERIT(BASE) \ @@ -69,8 +58,19 @@ #define TRANSLATOR_DECLARATIONS(NAME) \ public: \ TRANSLATOR_FAMILY_DECLARATIONS (NAME); \ + static Drul_array acknowledge_static_array_drul_; \ static SCM static_description_; \ static Protected_scm listener_list_; \ + static SCM static_get_acknowledger (SCM sym); \ + static SCM static_get_end_acknowledger(SCM); \ + virtual SCM get_acknowledger (SCM sym) \ + { \ + return static_get_acknowledger (sym); \ + } \ + virtual SCM get_end_acknowledger (SCM sym) \ + { \ + return static_get_end_acknowledger (sym); \ + } \ public: \ NAME (); \ virtual SCM static_translator_description () const; \ @@ -196,6 +196,10 @@ protected: // should be private. void add_translator (Translator *trans); Translator *get_translator (SCM s); + +SCM +generic_get_acknowledger (SCM sym, SCM ack_hash); + Moment get_event_length (Stream_event *s, Moment now); Moment get_event_length (Stream_event *s); diff --git a/lily/include/translator.icc b/lily/include/translator.icc index 980f12451a..5ccec99995 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -73,11 +73,11 @@ } #define ADD_TRANSLATOR_FAMILY(classname) \ - IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); \ - DEFINE_ACKNOWLEDGERS(classname) \ + IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); #define ADD_TRANSLATOR(classname, desc, grobs, read, write) \ ADD_TRANSLATOR_FAMILY (classname); \ + DEFINE_ACKNOWLEDGERS(classname); \ ADD_THIS_TRANSLATOR (classname); \ DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write) \ DEFINE_TRANSLATOR_LISTENER_LIST(classname) \ @@ -103,9 +103,6 @@ void add_acknowledger (SCM ptr, char const *func_name, Protected_scm &ack_hash); -SCM -generic_get_acknowledger (SCM sym, SCM ack_hash); - #define ADD_ACKNOWLEDGER(CLASS, NAME) \ void CLASS ## NAME ## _ack_adder () \ { \ diff --git a/lily/scheme-engraver.cc b/lily/scheme-engraver.cc index ec4197641b..c60e09d0e5 100644 --- a/lily/scheme-engraver.cc +++ b/lily/scheme-engraver.cc @@ -25,6 +25,8 @@ #include "translator.icc" +#include "scm-hash.hh" + Scheme_engraver::Scheme_engraver (SCM definition) { stop_translation_timestep_function_ = SCM_EOL; @@ -112,7 +114,7 @@ void Scheme_engraver::init_acknowledgers (SCM alist, SCM *hash) { - *hash = scm_c_make_hash_table (7); + *hash = Scheme_hash_table::make_smob (); for (SCM p = alist; scm_is_pair (p); p = scm_cdr (p)) { SCM iface = scm_caar (p); @@ -121,40 +123,7 @@ Scheme_engraver::init_acknowledgers (SCM alist, if (!(ly_is_procedure (proc) && ly_is_symbol (iface))) continue; - scm_hashq_set_x (*hash, iface, proc); - } -} - -// This is the easy way to do it, at the cost of too many invocations -// of Scheme_engraver::acknowledge_grob. The clever dispatching of -// acknowledgers is hardwired to have 1 method per engraver per -// grob-type, which doesn't work for this case. -void -Scheme_engraver::acknowledge_grob (Grob_info info) -{ - acknowledge_grob_by_hash (info, interface_acknowledger_hash_); -} - -void -Scheme_engraver::acknowledge_end_grob (Grob_info info) -{ - acknowledge_grob_by_hash (info, interface_end_acknowledger_hash_); -} - -void -Scheme_engraver::acknowledge_grob_by_hash (Grob_info info, - SCM iface_function_hash) -{ - SCM meta = info.grob ()->get_property ("meta"); - SCM ifaces = scm_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta)); - for (SCM s = ifaces; scm_is_pair (s); s = scm_cdr (s)) - { - SCM func = scm_hashq_ref (iface_function_hash, - scm_car (s), SCM_BOOL_F); - - if (ly_is_procedure (func)) - scm_call_3 (func, self_scm (), info.grob ()->self_scm (), - info.origin_translator ()->self_scm ()); + unsmob(*hash)->set (iface, proc); } } @@ -193,7 +162,4 @@ Scheme_engraver::derived_mark () const scm_gc_mark (interface_end_acknowledger_hash_); } -ADD_ACKNOWLEDGER (Scheme_engraver, grob); -ADD_END_ACKNOWLEDGER (Scheme_engraver, grob); - ADD_TRANSLATOR_FAMILY (Scheme_engraver); -- 2.39.5