]> git.donarmstrong.com Git - lilypond.git/commitdiff
Turn music functions and their signatures into C++ smobs
authorDavid Kastrup <dak@gnu.org>
Wed, 28 Mar 2012 23:38:29 +0000 (01:38 +0200)
committerDavid Kastrup <dak@gnu.org>
Fri, 30 Mar 2012 08:50:05 +0000 (10:50 +0200)
lily/include/music-function.hh
lily/lexer.ll
lily/music-function-scheme.cc
lily/music-function.cc
scm/document-identifiers.scm
scm/ly-syntax-constructors.scm

index 8c64a3d7df8004c7fc3e2ea570e381ca5a370442..d257b136b8745d575a7ba8518bd5102317339d44 100644 (file)
@@ -26,6 +26,7 @@ SCM ly_make_music_function (SCM, SCM);
 SCM make_music_function (SCM, SCM);
 
 SCM get_music_function_transform (SCM);
+SCM get_music_function_signature (SCM);
 bool is_music_function (SCM);
 
 #endif /* MUSIC_FUNCTION_HH */
index c2d8b6baeff1273520aa7a68eb32492ad286ec3e..78b647530335db8b81bae575d6bea71e3dadb4fe 100644 (file)
@@ -890,9 +890,9 @@ Lily_lexer::scan_scm_id (SCM sid)
        {
                int funtype = SCM_FUNCTION;
 
-               yylval.scm = get_music_function_transform (sid);
+               yylval.scm = sid;
 
-               SCM s = scm_object_property (yylval.scm, ly_symbol2scm ("music-function-signature"));
+               SCM s = get_music_function_signature (sid);
                SCM cs = scm_car (s);
 
                if (scm_is_pair (cs))
index 93c7e0fbc4773cbc121ca45779b1c71db26c8c96..39f1bdecbc3e13196a32b924465fdeb5a48c1848 100644 (file)
@@ -13,7 +13,16 @@ LY_DEFINE (ly_music_function_extract, "ly:music-function-extract", 1, 0, 0,
 {
   LY_ASSERT_TYPE (is_music_function, x, 1);
 
-  return SCM_CELL_OBJECT_1 (x);
+  return get_music_function_transform (x);
+}
+
+LY_DEFINE (ly_music_function_signature, "ly:music-function-signature", 1, 0, 0,
+          (SCM x),
+          "Return the function signature inside@tie{}@var{x}.")
+{
+  LY_ASSERT_TYPE (is_music_function, x, 1);
+
+  return get_music_function_signature (x);
 }
 
 LY_DEFINE (ly_make_music_function, "ly:make-music-function", 2, 0, 0,
@@ -41,4 +50,3 @@ LY_DEFINE (ly_make_music_function, "ly:make-music-function", 2, 0, 0,
 
   return make_music_function (signature, func);
 }
-
index 7d6675b3b759fd756db7723c83a66e99bfe0930b..85b21575761961e209a76811fae4506297940463 100644 (file)
 #include "music-function.hh"
 
 #include "music.hh"
-
-static scm_t_bits music_function_tag;
+#include "ly-smobs.icc"
+
+class Musicfunction {
+  DECLARE_SIMPLE_SMOBS (Musicfunction);
+  SCM signature_;
+  SCM function_;
+public:
+  Musicfunction (SCM signature, SCM function):
+    signature_(signature), function_(function) { }
+  SCM get_function () { return function_; }
+  SCM get_signature () { return signature_; }
+};
+
+IMPLEMENT_SIMPLE_SMOBS (Musicfunction);
+IMPLEMENT_DEFAULT_EQUAL_P (Musicfunction);
 
 /* Print a textual represenation of the smob to a given port.  */
-static int
-print_music_function (SCM b, SCM port, scm_print_state *)
+int
+Musicfunction::print_smob (SCM b, SCM port, scm_print_state *)
 {
-  SCM value = SCM_CELL_OBJECT_1 (b);
-
   scm_puts ("#<Music function ", port);
-  scm_write (value, port);
+  scm_write (Musicfunction::unsmob (b)->get_function (), port);
   scm_puts (">", port);
 
   /* Non-zero means success.  */
@@ -40,7 +51,7 @@ print_music_function (SCM b, SCM port, scm_print_state *)
 bool
 is_music_function (SCM music_function)
 {
-  return (SCM_NIMP (music_function) && SCM_CELL_TYPE (music_function) == music_function_tag);
+  return Musicfunction::unsmob (music_function);
 }
 
 SCM
@@ -49,25 +60,29 @@ get_music_function_transform (SCM music_function)
   if (!is_music_function (music_function))
     return SCM_UNDEFINED;
 
-  return SCM_CELL_OBJECT_1 (music_function);
+  return Musicfunction::unsmob (music_function)->get_function ();
 }
 
-static void
-init_music_function (void)
+SCM
+make_music_function (SCM signature, SCM func)
 {
-  music_function_tag = scm_make_smob_type ("music-function", 0);
-  scm_set_smob_mark (music_function_tag, scm_markcdr);
-  scm_set_smob_print (music_function_tag, print_music_function);
+  return Musicfunction (signature, func).smobbed_copy ();
 }
 
 SCM
-make_music_function (SCM signature, SCM func)
+get_music_function_signature (SCM music_function)
 {
-  scm_set_object_property_x (func, ly_symbol2scm ("music-function-signature"),
-                             signature);
+  if (!is_music_function (music_function))
+    return SCM_UNDEFINED;
 
-  SCM_RETURN_NEWSMOB (music_function_tag, func);
+  return Musicfunction::unsmob (music_function)->get_signature ();
 }
 
-ADD_SCM_INIT_FUNC (music_function_tag, init_music_function);
-
+SCM
+Musicfunction::mark_smob (SCM s)
+{
+  Musicfunction *p = Musicfunction::unsmob (s);
+  scm_gc_mark (p->signature_);
+  ASSERT_LIVE_IS_ALLOWED ();
+  return p->function_;
+}
index 821dde09c2b1251e983bfd674ed62be343583f95..fcd8f932146181b6dc016eac3d1b9d04fbbd1796 100644 (file)
@@ -26,7 +26,7 @@
        (map symbol->string
             (cddr (cadr (procedure-source func)))))
        (doc (procedure-documentation func))
-       (sign (object-property func 'music-function-signature))
+       (sign (ly:music-function-signature music-func))
        (type-names (map (lambda (pred)
                          (if (pair? pred)
                              (format #f "[~a]" (type-name (car pred)))
index 45d308c4a92b9097b995dad731124a7a72a8e22c..9cbec5fc4f55f61c6b28f17e558109da84e0a4b4 100644 (file)
 ;; we don't call the function but rather return the general
 ;; fallback.
 (define-ly-syntax (music-function parser loc fun args . rest)
-  (let* ((sig (object-property fun 'music-function-signature))
+  (let* ((sig (ly:music-function-signature fun))
         (pred (if (pair? (car sig)) (caar sig) (car sig)))
         (good (proper-list? args))
-        (m (and good (apply fun parser loc (reverse! args rest)))))
+        (m (and good (apply (ly:music-function-extract fun)
+                            parser loc (reverse! args rest)))))
     (if (and good (pred m))
        (begin
          (if (ly:music? m)