This is the mail archive of the guile@cygnus.com mailing list for the guile project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Richard Frith-Macdonald <richard@brainstorm.co.uk> writes: > How can I be sure that the procedure has not been garbage collected between > stage 1 and stage 2? libguile has some functions to help you with protecting SCM values from the garbage collector. scm_permanent_object(X) will protect X for all time being. scm_protect_object(X) will protect X until you call scm_unprotect_object(X). But note that scm_protect_object/scm_unprotect_object do *not* work in a nested fashion. Calling scm_unprotect_object will make X completely unprotected regardless how many times you have called scm_protect_object on it. You are maybe better off with using these functions: static SCM protects; SCM protect_nested (SCM obj) { SCM_SETCAR (protects, scm_cons (obj, SCM_CAR (protects))); return obj; } void unprotect_nested (SCM obj) { SCM walk; SCM *prev; for (prev = SCM_CARLOC (protects), walk = SCM_CAR (protects); SCM_NIMP (walk) && SCM_CONSP (walk); walk = SCM_CDR (walk)) { if (SCM_CAR (walk) == obj) { *prev = SCM_CDR (walk); break; } else prev = SCM_CDRLOC (walk); } } In your initialization code protects = scm_permanent_object (scm_cons (SCM_EOL, SCM_BOOL_F));