Email list hosting service & mailing list manager
The reference implementation for Scheme 48 lacks some annotations for the garbage collector. Here is a patch: --- mrg32k3a-b.c.orig Tue May 6 16:35:56 2003 +++ mrg32k3a-b.c Tue May 6 16:40:06 2003 @@ -113,6 +113,9 @@ s48_value mrg32k3a_pack_state1(s48_value state) { s48_value result; state_t s; + S48_DECLARE_GC_PROTECT(1); + + S48_GC_PROTECT_1(state); /* s48_extract_integer may GC */ #define REF(i) (double)s48_extract_integer(S48_VECTOR_REF(state, (long)(i))) @@ -126,6 +129,8 @@ #undef REF + S48_GC_UNPROTECT(); + /* box s into a Scheme object */ result = S48_MAKE_VALUE(state_t); S48_SET_VALUE(result, state_t, s); @@ -133,9 +138,12 @@ } s48_value mrg32k3a_unpack_state1(s48_value state) { - s48_value result; + s48_value result = S48_UNSPECIFIC; state_t s; + S48_DECLARE_GC_PROTECT(1); + S48_GC_PROTECT_1(result); + /* unbox s from the Scheme object */ s = S48_EXTRACT_VALUE(state, state_t); @@ -156,6 +164,8 @@ SET(10, s.x22); #undef SET + + S48_GC_UNPROTECT(); return result; } Unlike documented in the manual, s48_extract_integer may cause a GC (if Scheme 48 needs a bignum to represent the number). -- Martin