X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fundead.cc;h=b29386d2ce839a890c51e8842424a14e0a7bf38f;hb=83c5b56f8a495df4fca2551957e0fd8757ec3651;hp=9ba0878e3cf55f3a459e3f69f216f096a7fdb11c;hpb=9db3ae18972000e81b3c73680e9dd791d8596a64;p=lilypond.git diff --git a/lily/undead.cc b/lily/undead.cc index 9ba0878e3c..b29386d2ce 100644 --- a/lily/undead.cc +++ b/lily/undead.cc @@ -20,12 +20,13 @@ #include "smobs.hh" #include "ly-smobs.icc" -class Undead { +class Undead +{ DECLARE_SIMPLE_SMOBS (Undead); SCM object_; public: SCM object () { return object_; } - Undead (SCM object = SCM_UNDEFINED) : object_(object) { }; + Undead (SCM object = SCM_UNDEFINED) : object_ (object) { }; }; SCM @@ -40,8 +41,8 @@ Undead::mark_smob (SCM s) int Undead::print_smob (SCM undead, - SCM port, - scm_print_state *) + SCM port, + scm_print_state *) { scm_puts ("#object (), port); @@ -54,18 +55,50 @@ IMPLEMENT_DEFAULT_EQUAL_P (Undead); IMPLEMENT_TYPE_P (Undead, "ly:undead?") LY_DEFINE (ly_make_undead, "ly:make-undead", - 1, 0, 0, (SCM object), - "This packages @var{object} in a manner that keeps it from" - " triggering \"Parsed object should be dead\" messages.") + 1, 0, 0, (SCM object), + "This packages @var{object} in a manner that keeps it from" + " triggering \"Parsed object should be dead\" messages.") { Undead undead (object); return undead.smobbed_copy (); } LY_DEFINE (ly_get_undead, "ly:get-undead", - 1, 0, 0, (SCM undead), - "Get back object from @var{undead}.") + 1, 0, 0, (SCM undead), + "Get back object from @var{undead}.") { LY_ASSERT_SMOB (Undead, undead, 1); return Undead::unsmob (undead)->object (); } + +// ' +// These are not protected since the means of protecting them would be +// problematic to trigger during the mark pass where the array element +// references get set. However, they get set only when in the mark +// pass when checking for parsed elements that should be dead, and we +// query and clear them immediately afterwards. So there should be no +// way in which the references would have become unprotected in the +// mean time. + +vector parsed_dead::elements; + +SCM +parsed_dead::readout () +{ + SCM result = SCM_EOL; + for (vsize i = 0; i < elements.size (); i++) + { + SCM elt = elements[i]->readout_one (); + if (!SCM_UNBNDP (elt)) + result = scm_cons (elt, result); + } + return result; +} + +LY_DEFINE (ly_parsed_undead_list_x, "ly:parsed-undead-list!", + 0, 0, 0, (), + "Return the list of objects that have been found live" + " that should have been dead, and clear that list.") +{ + return parsed_dead::readout (); +}