]> git.donarmstrong.com Git - lilypond.git/commitdiff
bugfixes and cleanups for stream-events.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 24 Dec 2006 15:12:18 +0000 (16:12 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 24 Dec 2006 15:36:30 +0000 (16:36 +0100)
Better typechecks, and implement copy_mutable_properties()
for reliable copying.

lily/dispatcher-scheme.cc
lily/duration-scheme.cc
lily/general-scheme.cc
lily/include/stream-event.hh
lily/music.cc
lily/scheme-listener-scheme.cc
lily/stream-event-scheme.cc
lily/stream-event.cc

index 2a2720656c888e082a44adaaa1320781fbf2723a..8500cf9811d6ae347ae26e5a2dff62ce338fe03a 100644 (file)
@@ -38,10 +38,11 @@ LY_DEFINE (ly_add_listener, "ly:add-listener",
   SCM_ASSERT_TYPE (l, list, SCM_ARG1, __FUNCTION__, "listener");
   SCM_ASSERT_TYPE (d, disp, SCM_ARG2, __FUNCTION__, "dispatcher");
   
-  for (int arg=SCM_ARG3; scm_is_pair (cl); cl = scm_cdr (cl), arg++)
+  for (int arg = SCM_ARG3; scm_is_pair (cl); cl = scm_cdr (cl), arg++)
     {
-      SCM_ASSERT_TYPE (scm_symbol_p (cl), cl, arg, __FUNCTION__, "symbol");
-      d->add_listener (*l, scm_car (cl));
+      SCM sym = scm_car (cl);
+      SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, arg, __FUNCTION__, "symbol");
+      d->add_listener (*l, sym);
     }
 
   return SCM_UNDEFINED;
index fb4bb102632b9946286d07abc048dfb4308b306a..361036256d3642d70328db3614eda2f471f43615 100644 (file)
@@ -53,13 +53,13 @@ LY_DEFINE (ly_make_duration, "ly:make-duration",
           "(whole, half, quarter, etc.) and a number of augmentation\n"
           "dots. \n")
 {
-  SCM_ASSERT_TYPE (scm_integer_p (length) == SCM_BOOL_T,
+  SCM_ASSERT_TYPE (scm_is_integer (length),
                   length, SCM_ARG1, __FUNCTION__, "integer");
 
   int dots = 0;
   if (dotcount != SCM_UNDEFINED)
     {
-      SCM_ASSERT_TYPE (scm_integer_p (dotcount) == SCM_BOOL_T,
+      SCM_ASSERT_TYPE (scm_is_integer (dotcount),
                       dotcount, SCM_ARG2, __FUNCTION__, "integer");
       dots = scm_to_int (dotcount);
     }
index 069cd605fcbf57ac30d74990c5a1bd39bcaad04c..9b6aaeb7fd3e5376d4f8065ca84d90dc26f09fe5 100644 (file)
@@ -297,7 +297,7 @@ LY_DEFINE (ly_stderr_redirect, "ly:stderr-redirect",
           1, 1, 0, (SCM file_name, SCM mode),
           "Redirect stderr to FILE-NAME, opened with MODE.")
 {
-  SCM_ASSERT_TYPE (scm_string_p (file_name), file_name, SCM_ARG1,
+  SCM_ASSERT_TYPE (scm_is_string (file_name), file_name, SCM_ARG1,
                   __FUNCTION__, "file_name");
   char const *m = "w";
   if (mode != SCM_UNDEFINED && scm_string_p (mode))
index 4e1688f6f466a7fa3436b3ebfd082f67845f1181..9f226f48db8d66017bcac533c21f06655a17ecdc 100644 (file)
@@ -18,15 +18,16 @@ class Stream_event : public Prob
 public:
   Stream_event ();
   VIRTUAL_COPY_CONSTRUCTOR (Stream_event, Stream_event);
-  // todo: remove unneeded constructors
+
   Stream_event (SCM event_class, SCM mutable_props=SCM_EOL);
   Stream_event (SCM class_name, Input *);
-  Stream_event (Stream_event *ev);
 
   Input *origin () const;
   void set_spot (Input *i);
   bool internal_in_event_class (SCM class_name);
 
+  virtual SCM copy_mutable_properties () const;
+
   DECLARE_SCHEME_CALLBACK (undump, (SCM));
   DECLARE_SCHEME_CALLBACK (dump, (SCM));
 
@@ -36,5 +37,6 @@ public:
 
 Stream_event *unsmob_stream_event (SCM);
 DECLARE_TYPE_P (Stream_event);
+SCM ly_event_deep_copy (SCM);
 
 #endif /* STREAM_EVENT_HH */
index 1253e728603178c3d308e170597458adb87c2968..a6e18cabb4ca11356e3e65f8f5ae78533a13b2f3 100644 (file)
@@ -185,7 +185,7 @@ Music::compress (Moment factor)
 }
 
 /*
-TODO: make transposition non-destructive
+  This mutates alist.  Hence, make sure that it is not changed 
 */
 SCM
 transpose_mutable (SCM alist, Pitch delta)
index b8946871c0061bb7c44a3f484fdca08477801541..7e8370068f3afe1d87ff898b1bbc795fcd25e99d 100644 (file)
@@ -16,7 +16,7 @@ LY_DEFINE (ly_make_listener, "ly:make-listener",
           "\n"
           " @var{callback} should take exactly one argument." )
 {
-  SCM_ASSERT_TYPE (scm_procedure_p (callback), callback, SCM_ARG1, __FUNCTION__, "procedure");
+  SCM_ASSERT_TYPE (ly_is_procedure (callback), callback, SCM_ARG1, __FUNCTION__, "procedure");
   Scheme_listener *l = new Scheme_listener (callback);
   SCM listener = GET_LISTENER (l->call).smobbed_copy ();
   l->unprotect ();
index ea9365496187c371bbe721be6b72906b1b8586f2..947ff14b301968b771abe213ac7a16286f79cb63 100644 (file)
@@ -13,12 +13,13 @@ LY_DEFINE (ly_make_stream_event, "ly:make-stream-event",
           "Creates a stream event of class @var{cl} with the given mutable property list.\n" )
 {
   SCM_ASSERT_TYPE (scm_is_symbol (cl), cl, SCM_ARG1, __FUNCTION__, "symbol");
-  if (proplist != SCM_UNDEFINED)
-    {
-      SCM_ASSERT_TYPE (scm_list_p (proplist), proplist, SCM_ARG2, __FUNCTION__, "association list");
-    }
-  else
+
+  /* should be scm_list_p, but scm_list_p is expensive. */
+  SCM_ASSERT_TYPE (scm_is_pair (proplist), proplist, SCM_ARG2, __FUNCTION__, "association list");
+  
+  if (proplist == SCM_UNDEFINED)
     proplist = SCM_EOL;
+
   Stream_event *e = new Stream_event (cl, proplist);
   return e->unprotect ();
 }
@@ -42,3 +43,20 @@ LY_DEFINE (ly_event_set_property, "ly:event-set-property!",
   SCM_ASSERT_TYPE (sc, ev, SCM_ARG1, __FUNCTION__, "event");
   return ly_prob_set_property_x (ev, sym, val);
 }
+
+LY_DEFINE (ly_event_deep_copy, "ly:event-deep-copy",
+          1, 0, 0, (SCM m),
+          "Copy @var{m} and all sub expressions of @var{m}")
+{
+  SCM copy = m;
+  if (Stream_event *ev = unsmob_stream_event (m))
+    {
+      ev = ev->clone ();
+      copy = ev->unprotect ();
+    }
+  else if (scm_is_pair (m))
+    copy = scm_cons (ly_event_deep_copy (scm_car (m)),
+                    ly_event_deep_copy (scm_cdr (m)));
+
+  return copy;
+}
index ff736d88323809227888f6b74037107ec21827d1..12219884b1071d40e9919e4cf13b771b515d2148 100644 (file)
@@ -35,11 +35,10 @@ Stream_event::Stream_event (SCM class_name, Input *origin)
     set_spot (origin);
 }
 
-Stream_event::Stream_event (Stream_event *ev)
-  : Prob (ly_symbol2scm ("Stream_event"), SCM_EOL)
+SCM
+Stream_event::copy_mutable_properties () const
 {
-  mutable_property_alist_ = scm_copy_tree (ev->mutable_property_alist_);
-  immutable_property_alist_ = ev->immutable_property_alist_;
+  return ly_event_deep_copy (mutable_property_alist_);
 }
 
 Input *