]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4842/6: Don't special-case Scheme_engraver's acknowledgers
authorDavid Kastrup <dak@gnu.org>
Tue, 3 May 2016 17:11:15 +0000 (19:11 +0200)
committerDavid Kastrup <dak@gnu.org>
Sun, 8 May 2016 15:17:00 +0000 (17:17 +0200)
lily/include/scheme-engraver.hh
lily/include/translator.hh
lily/include/translator.icc
lily/scheme-engraver.cc

index 103176fc37c6b733636c318bb5611d6ce81d96dc..ffce5fa204f201241610f56062c5a895c289686c 100644 (file)
@@ -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_;
index 02761d3d2e10acd40e9a5dcf7b3c1f0859fcf881..3769b0e4b837c220d7f3e6078ee5e646eb556a25 100644 (file)
 #define TRANSLATOR_FAMILY_DECLARATIONS(NAME)                            \
   public:                                                               \
   VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME);                          \
-  static Drul_array<Protected_scm> 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)                                        \
 #define TRANSLATOR_DECLARATIONS(NAME)                                   \
   public:                                                               \
   TRANSLATOR_FAMILY_DECLARATIONS (NAME);                                \
+  static Drul_array<Protected_scm> 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);
 
index 980f12451a94419ba08bbb8354416d4766598b8d..5ccec9999550c5060dc2a011871cd83ef5ba5457 100644 (file)
   }
 
 #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 ()                                   \
   {                                                                     \
index ec4197641bfcba78386ee3b11c9becd6e24cf762..c60e09d0e5bef0d1f9afbfab7884c5047add4074 100644 (file)
@@ -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<Scheme_hash_table>(*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);