]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/output-def-scheme.cc
(protect_smob): experiment: O(1) GC (un)protection.
[lilypond.git] / lily / output-def-scheme.cc
index 65505c9b2f0f8a1a0fc9215c25dc3c26e6042a47..6e3af7194f8600658dd3f54e8ebf2633914ac101 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  output-def-scheme.cc --  implement Output_def bindings
+  output-def-scheme.cc -- implement Output_def bindings
 
   source file of the GNU LilyPond music typesetter
 
 #include "context-def.hh"
 
 LY_DEFINE (ly_layout_lookup, "ly:output-def-lookup",
-          2, 0, 0, (SCM pap, SCM sym),
+          2, 1, 0, (SCM pap, SCM sym, SCM def),
           "Lookup @var{sym} in @var{pap}. "
-          "Return the value or @code{'()} if undefined.")
+          "Return the value or @var{def} (which defaults to  @code{'()}) if undefined.")
 {
   Output_def *op = unsmob_output_def (pap);
   SCM_ASSERT_TYPE (op, pap, SCM_ARG1, __FUNCTION__, "Output_def");
   SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol");
+  
+  SCM answer = op->lookup_variable (sym);
+  if (answer == SCM_UNDEFINED)
+    {
+      if (def == SCM_UNDEFINED)
+       def = SCM_EOL;
 
-  return op->lookup_variable (sym);
+      answer = def;
+    }
+
+  return answer;
 }
 
 LY_DEFINE (ly_output_def_scope, "ly:output-def-scope",
@@ -50,9 +59,9 @@ LY_DEFINE (ly_output_def_clone, "ly:output-def-clone",
 {
   Output_def *op = unsmob_output_def (def);
   SCM_ASSERT_TYPE (op, def, SCM_ARG1, __FUNCTION__, "Output definition");
-  SCM s = op->clone ()->self_scm ();
-  scm_gc_unprotect_object (s);
-  return s;
+
+  Output_def *clone =  op->clone ();
+  return clone->unprotect ();
 }
 
 LY_DEFINE (ly_output_description, "ly:output-description",
@@ -95,7 +104,7 @@ LY_DEFINE (ly_make_output_def, "ly:make-output-def",
           "Make a output def.")
 {
   Output_def *bp = new Output_def ;
-  return scm_gc_unprotect_object (bp->self_scm ());
+  return bp->unprotect ();
 }
 
 LY_DEFINE (ly_paper_get_font, "ly:paper-get-font", 2, 0, 0,