X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsmobs.cc;h=7bdaaa7f922017055367d496abe3c852a744b479;hb=4cdb295f6624000f0c5a2b7aaa5570a081661d94;hp=63d36f23a57db8afd4fd42af4383da306ead9693;hpb=8536db51578c1d3ba3da834e5a308c2790dd4f87;p=lilypond.git diff --git a/lily/smobs.cc b/lily/smobs.cc index 63d36f23a5..7bdaaa7f92 100644 --- a/lily/smobs.cc +++ b/lily/smobs.cc @@ -3,58 +3,74 @@ source file of the GNU LilyPond music typesetter - (c) 2005 Han-Wen Nienhuys - + (c) 2005--2007 Han-Wen Nienhuys */ #include "smobs.hh" -static SCM smob_protection_list; +/* + The CDR contains the actual protected list. + */ +static SCM smob_protection_list = SCM_EOL; void -init_smob_protection() +init_smob_protection () +{ + smob_protection_list = scm_cons (SCM_BOOL_F, SCM_EOL); + scm_gc_protect_object (smob_protection_list); +} +ADD_SCM_INIT_FUNC (init_smob_protection, init_smob_protection); + +LY_DEFINE (ly_smob_protects, "ly:smob-protects", + 0, 0, 0, (), + "Return LilyPond's internal smob protection list.") { - smob_protection_list = scm_cons (SCM_UNDEFINED, SCM_EOL); - scm_permanent_object (smob_protection_list); + return scm_is_pair (smob_protection_list) + ? scm_cdr (smob_protection_list) + : SCM_EOL; } -ADD_SCM_INIT_FUNC(init_smob_protection, init_smob_protection); void protect_smob (SCM smob, SCM *prot_cons) { +#if 0 SCM s = scm_cdr (smob_protection_list); - while (scm_is_pair (s) && scm_car (s) == SCM_UNDEFINED) + while (scm_is_pair (s) && scm_car (s) == SCM_BOOL_F) { s = scm_cdr (s); } - SCM prot = scm_cons (smob, s); scm_set_cdr_x (smob_protection_list, prot); *prot_cons = prot; +#else + (void) prot_cons; + scm_gc_protect_object (smob); +#endif } void -unprotect_smob (SCM *prot_cons) +unprotect_smob (SCM smob, SCM *prot_cons) { +#if 1 + (void) prot_cons; + scm_gc_unprotect_object (smob); +#else SCM next = scm_cdr (*prot_cons); if (next == SCM_EOL) - { - scm_set_car_x (*prot_cons, SCM_UNDEFINED); - } + scm_set_car_x (*prot_cons, SCM_BOOL_F); else { - scm_set_car_x (*prot_cons, SCM_UNDEFINED); + scm_set_car_x (*prot_cons, SCM_BOOL_F); while (scm_is_pair (next) - && scm_car (next) == SCM_UNDEFINED) + && scm_car (next) == SCM_BOOL_F) - { - next = scm_cdr (next); - } + next = scm_cdr (next); scm_set_cdr_x (*prot_cons, next); } *prot_cons = SCM_EOL; +#endif }