X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fsmobs.cc;h=5544d95d7b08d8fbdae5ffc1f151323265f8121f;hb=99503a78627620112cabb61bb9f1cee3fe9dfcb4;hp=57de04c09f259f87a9d8da202b8c6e378f97e463;hpb=6f870f1f99be015b8159770207f44a6317e0c96a;p=lilypond.git diff --git a/lily/smobs.cc b/lily/smobs.cc index 57de04c09f..5544d95d7b 100644 --- a/lily/smobs.cc +++ b/lily/smobs.cc @@ -1,9 +1,20 @@ /* - smobs.cc -- implement Smob protection + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2005--2011 Han-Wen Nienhuys - (c) 2005 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "smobs.hh" @@ -11,51 +22,60 @@ /* The CDR contains the actual protected list. */ -static SCM smob_protection_list; +static SCM smob_protection_list = SCM_EOL; void init_smob_protection () { - smob_protection_list = scm_cons (SCM_UNDEFINED, SCM_EOL); - scm_permanent_object (smob_protection_list); + 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 lily's internal smob protection list") +LY_DEFINE (ly_smob_protects, "ly:smob-protects", + 0, 0, 0, (), + "Return LilyPond's internal smob protection list.") { - return scm_cdr (smob_protection_list); + return scm_is_pair (smob_protection_list) + ? scm_cdr (smob_protection_list) + : SCM_EOL; } - - - 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) - s = scm_cdr (s); - + 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); @@ -63,4 +83,5 @@ unprotect_smob (SCM *prot_cons) } *prot_cons = SCM_EOL; +#endif }