]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/protected-scm.cc
Release: bump Welcome versions.
[lilypond.git] / lily / protected-scm.cc
index 6f6ce7c7442152fbd6def56d62e1fd49b24a4b5d..3a16254187a05b0b7880a53ec9250c47071e8aee 100644 (file)
@@ -40,6 +40,17 @@ Protected_scm::Protected_scm (SCM s)
 SCM Protected_scm::list_ = SCM_EOL;
 SCM Protected_scm::last_ = SCM_EOL;
 
+void
+Protected_scm::protectify (SCM s)
+{
+  s = scm_list_1 (s);
+  if (SCM_CONSP (last_))
+    SCM_SETCDR (last_, s);
+  else
+    list_ = scm_permanent_object (s);
+  last_ = object_ = s;
+}
+
 Protected_scm &
 Protected_scm::operator = (SCM s)
 {
@@ -48,14 +59,7 @@ Protected_scm::operator = (SCM s)
   else if (SCM_IMP (s))
     object_ = s;
   else
-    {
-      s = scm_list_1 (s);
-      if (SCM_CONSP (last_))
-        SCM_SETCDR (last_, s);
-      else
-        list_ = scm_permanent_object (s);
-      last_ = object_ = s;
-    }
+    protectify (s);
 
   return *this;
 }
@@ -66,7 +70,27 @@ Protected_scm::operator = (Protected_scm const &s)
   return *this = (SCM) s;
 }
 
-Protected_scm::operator SCM () const
+Protected_scm::operator SCM const & () const
 {
-  return SCM_CONSP (object_) ? SCM_CAR (object_) : object_;
+  if (SCM_CONSP (object_))
+    return *SCM_CARLOC (object_);
+  return object_;
+}
+
+Protected_scm::operator SCM & ()
+{
+  // The reference may be used to overwrite an immediate value with a
+  // non-immediate one, so we _have_ to create full protection.
+  if (!SCM_CONSP (object_))
+    protectify (object_);
+
+  return *SCM_CARLOC (object_);
+}
+
+bool
+Protected_scm::is_bound () const
+{
+  if (SCM_CONSP (object_))
+    return !SCM_UNBNDP (SCM_CAR (object_));
+  return !SCM_UNBNDP (object_);
 }