2 smobs.cc -- implement Smob protection
4 source file of the GNU LilyPond music typesetter
6 (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
12 The CDR contains the actual protected list.
14 static SCM smob_protection_list
= SCM_EOL
;
17 init_smob_protection ()
19 smob_protection_list
= scm_cons (SCM_BOOL_F
, SCM_EOL
);
20 scm_gc_protect_object (smob_protection_list
);
22 ADD_SCM_INIT_FUNC (init_smob_protection
, init_smob_protection
);
24 LY_DEFINE (ly_smob_protects
, "ly:smob-protects",
26 "Return LilyPond's internal smob protection list.")
28 return scm_is_pair (smob_protection_list
)
29 ? scm_cdr (smob_protection_list
)
34 protect_smob (SCM smob
, SCM
*prot_cons
)
37 SCM s
= scm_cdr (smob_protection_list
);
38 while (scm_is_pair (s
) && scm_car (s
) == SCM_BOOL_F
)
42 SCM prot
= scm_cons (smob
, s
);
43 scm_set_cdr_x (smob_protection_list
,
48 scm_gc_protect_object (smob
);
53 unprotect_smob (SCM smob
, SCM
*prot_cons
)
57 scm_gc_unprotect_object (smob
);
59 SCM next
= scm_cdr (*prot_cons
);
62 scm_set_car_x (*prot_cons
, SCM_BOOL_F
);
65 scm_set_car_x (*prot_cons
, SCM_BOOL_F
);
66 while (scm_is_pair (next
)
67 && scm_car (next
) == SCM_BOOL_F
)
69 next
= scm_cdr (next
);
71 scm_set_cdr_x (*prot_cons
, next
);