X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fly-smobs.icc;h=efbdb0647b70ffa9de382348f29637aac14e8bc5;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=45ba7ebf2d1e58d4fbf441706c3f37052c63559d;hpb=58bcc84c9480dae1b21bc24d8396b91fe19e0131;p=lilypond.git diff --git a/lily/include/ly-smobs.icc b/lily/include/ly-smobs.icc index 45ba7ebf2d..efbdb0647b 100644 --- a/lily/include/ly-smobs.icc +++ b/lily/include/ly-smobs.icc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2005 Han-Wen Nienhuys + (c) 1999--2008 Han-Wen Nienhuys */ #ifndef LY_SMOBS_ICC @@ -25,6 +25,14 @@ ADD_SCM_INIT_FUNC (init_type_ ## CL, init_type_ ## CL) #define IMPLEMENT_BASE_SMOBS(CL) \ + void \ + CL ## _type_adder () \ + {\ + ly_add_type_predicate ((void*) &CL::unsmob, #CL); \ + }\ + ADD_SCM_INIT_FUNC(CL ## _type_adder_ctor, \ + CL ## _type_adder);\ + const char *CL::smob_name_ = #CL; \ scm_t_bits CL::smob_tag_; \ SCM \ CL::smob_p (SCM s) \ @@ -51,7 +59,7 @@ { \ CL *s = (CL *) SCM_CELL_WORD_1 (ses); \ delete s; \ - scm_gc_unregister_collectable_memory (s, sizeof (CL), #CL " smob"); \ + /* scm_gc_unregister_collectable_memory (s, sizeof (CL), #CL " smob"); */ \ return SMOB_FREE_RETURN_VAL (CL); \ } \ \ @@ -74,10 +82,21 @@ void \ CL::smobify_self () \ { \ - SCM s = unprotected_smobify_self (); \ - scm_gc_protect_object (s); \ + protection_cons_ = SCM_EOL; \ + self_scm_ = unprotected_smobify_self (); \ + protect (); \ + } \ + void \ + CL::protect () \ + { \ + protect_smob (self_scm_, &protection_cons_); \ + } \ + SCM \ + CL::unprotect () \ + { \ + unprotect_smob (self_scm_, &protection_cons_); \ + return self_scm_; \ } \ - \ SCM \ CL::unprotected_smobify_self () \ { \ @@ -85,9 +104,10 @@ This is local. We don't assign to self_scm_ directly, to assure \ that S isn't GC-ed from under us. \ \ - We don't use smobbed_self () to ensure that mark_smob () doesn't have to \ - deal half-initialized objects: scm_done_malloc ( ) might trigger GC. \ - the warning in smobs.hh is just to be doubleplus goodly sure \ + We don't use smobbed_self () to ensure that mark_smob () doesn't \ + have to deal half-initialized objects: scm_done_malloc ( ) might \ + trigger GC.the warning in smobs.hh is just to be doubleplus \ + goodly sure \ */ \ SCM s; \ SCM_NEWSMOB (s, CL::smob_tag_, this); \