X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fprotected-scm.cc;h=3a16254187a05b0b7880a53ec9250c47071e8aee;hb=b872748c6aa8bb721ced458691b38ac2fac5dfc8;hp=6f6ce7c7442152fbd6def56d62e1fd49b24a4b5d;hpb=b3100a922eccf4ecc0570d3859959113267e017f;p=lilypond.git diff --git a/lily/protected-scm.cc b/lily/protected-scm.cc index 6f6ce7c744..3a16254187 100644 --- a/lily/protected-scm.cc +++ b/lily/protected-scm.cc @@ -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_); }