diff options
author | Andy Wingo <wingo@pobox.com> | 2012-01-27 19:04:46 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2012-01-27 19:34:19 +0100 |
commit | 04b2d773548c57b6eadd1808a8d15cce47af9630 (patch) | |
tree | 18fa47ca6a85f444788c286323a4c523be0f634e /libguile/vm-i-scheme.c | |
parent | c0e4449908eee84bcb293ec21c10fec646bde45d (diff) | |
download | guile-04b2d773548c57b6eadd1808a8d15cce47af9630.tar.gz |
attempt to clear stale references on VM C stack
* libguile/vm-engine.h (DEAD): New macro, nulls out a value.
* libguile/vm-i-system.c:
* libguile/vm-i-loader.c:
* libguile/vm-i-scheme.c: Use DEAD when variables become dead.
Later we can #ifdef this out, but I want to give the buildbots a try
with this patch to make sure it's correct.
Diffstat (limited to 'libguile/vm-i-scheme.c')
-rw-r--r-- | libguile/vm-i-scheme.c | 122 |
1 files changed, 120 insertions, 2 deletions
diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c index 243e1a311..fa1179eb4 100644 --- a/libguile/vm-i-scheme.c +++ b/libguile/vm-i-scheme.c @@ -33,6 +33,7 @@ VM_DEFINE_FUNCTION (128, not, "not", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_false (x))); + DEAD (x); NEXT; } @@ -40,6 +41,7 @@ VM_DEFINE_FUNCTION (129, not_not, "not-not", 1) { ARGS1 (x); RETURN (scm_from_bool (!scm_is_false (x))); + DEAD (x); NEXT; } @@ -47,6 +49,8 @@ VM_DEFINE_FUNCTION (130, eq, "eq?", 2) { ARGS2 (x, y); RETURN (scm_from_bool (scm_is_eq (x, y))); + DEAD (x); + DEAD (y); NEXT; } @@ -54,6 +58,8 @@ VM_DEFINE_FUNCTION (131, not_eq, "not-eq?", 2) { ARGS2 (x, y); RETURN (scm_from_bool (!scm_is_eq (x, y))); + DEAD (x); + DEAD (y); NEXT; } @@ -61,6 +67,7 @@ VM_DEFINE_FUNCTION (132, nullp, "null?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_null (x))); + DEAD (x); NEXT; } @@ -68,6 +75,7 @@ VM_DEFINE_FUNCTION (133, not_nullp, "not-null?", 1) { ARGS1 (x); RETURN (scm_from_bool (!scm_is_null (x))); + DEAD (x); NEXT; } @@ -83,6 +91,8 @@ VM_DEFINE_FUNCTION (134, eqv, "eqv?", 2) SYNC_REGISTER (); RETURN (scm_eqv_p (x, y)); } + DEAD (x); + DEAD (y); NEXT; } @@ -98,6 +108,8 @@ VM_DEFINE_FUNCTION (135, equal, "equal?", 2) SYNC_REGISTER (); RETURN (scm_equal_p (x, y)); } + DEAD (x); + DEAD (y); NEXT; } @@ -105,6 +117,7 @@ VM_DEFINE_FUNCTION (136, pairp, "pair?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_pair (x))); + DEAD (x); NEXT; } @@ -112,6 +125,7 @@ VM_DEFINE_FUNCTION (137, listp, "list?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_ilength (x) >= 0)); + DEAD (x); NEXT; } @@ -119,6 +133,7 @@ VM_DEFINE_FUNCTION (138, symbolp, "symbol?", 1) { ARGS1 (x); RETURN (scm_from_bool (scm_is_symbol (x))); + DEAD (x); NEXT; } @@ -126,6 +141,7 @@ VM_DEFINE_FUNCTION (139, vectorp, "vector?", 1) { ARGS1 (x); RETURN (scm_from_bool (SCM_I_IS_VECTOR (x))); + DEAD (x); NEXT; } @@ -139,6 +155,8 @@ VM_DEFINE_FUNCTION (140, cons, "cons", 2) ARGS2 (x, y); CONS (x, x, y); RETURN (x); + DEAD (x); + DEAD (y); NEXT; } @@ -155,6 +173,7 @@ VM_DEFINE_FUNCTION (141, car, "car", 1) ARGS1 (x); VM_VALIDATE_CONS (x, "car"); RETURN (SCM_CAR (x)); + DEAD (x); NEXT; } @@ -163,6 +182,7 @@ VM_DEFINE_FUNCTION (142, cdr, "cdr", 1) ARGS1 (x); VM_VALIDATE_CONS (x, "cdr"); RETURN (SCM_CDR (x)); + DEAD (x); NEXT; } @@ -172,6 +192,8 @@ VM_DEFINE_INSTRUCTION (143, set_car, "set-car!", 0, 2, 0) POP2 (y, x); VM_VALIDATE_CONS (x, "set-car!"); SCM_SETCAR (x, y); + DEAD (x); + DEAD (y); NEXT; } @@ -181,6 +203,8 @@ VM_DEFINE_INSTRUCTION (144, set_cdr, "set-cdr!", 0, 2, 0) POP2 (y, x); VM_VALIDATE_CONS (x, "set-cdr!"); SCM_SETCDR (x, y); + DEAD (x); + DEAD (y); NEXT; } @@ -201,6 +225,8 @@ VM_DEFINE_INSTRUCTION (144, set_cdr, "set-cdr!", 0, 2, 0) SYNC_REGISTER (); \ RETURN (srel (x, y)); \ } \ + DEAD (x); \ + DEAD (y); \ NEXT; \ } @@ -250,11 +276,15 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2) if (SCM_FIXABLE (n)) \ { \ RETURN (SCM_I_MAKINUM (n)); \ + DEAD (x); \ + DEAD (y); \ NEXT; \ } \ } \ SYNC_REGISTER (); \ RETURN (SFUNC (x, y)); \ + DEAD (x); \ + DEAD (y); \ NEXT; \ } @@ -319,6 +349,8 @@ VM_DEFINE_FUNCTION (150, add, "add", 2) ASM_ADD (x, y); SYNC_REGISTER (); RETURN (scm_sum (x, y)); + DEAD (x); + DEAD (y); NEXT; #endif } @@ -340,12 +372,15 @@ VM_DEFINE_FUNCTION (151, add1, "add1", 1) if (SCM_LIKELY (SCM_I_INUMP (result))) { RETURN (result); + DEAD (result); NEXT; } + DEAD (result); } SYNC_REGISTER (); RETURN (scm_sum (x, SCM_I_MAKINUM (1))); + DEAD (x); NEXT; } @@ -358,6 +393,8 @@ VM_DEFINE_FUNCTION (152, sub, "sub", 2) ASM_SUB (x, y); SYNC_REGISTER (); RETURN (scm_difference (x, y)); + DEAD (x); + DEAD (y); NEXT; #endif } @@ -379,12 +416,15 @@ VM_DEFINE_FUNCTION (153, sub1, "sub1", 1) if (SCM_LIKELY (SCM_I_INUMP (result))) { RETURN (result); + DEAD (result); NEXT; } + DEAD (result); } SYNC_REGISTER (); RETURN (scm_difference (x, SCM_I_MAKINUM (1))); + DEAD (x); NEXT; } @@ -396,6 +436,8 @@ VM_DEFINE_FUNCTION (154, mul, "mul", 2) ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_product (x, y)); + DEAD (x); + DEAD (y); NEXT; } @@ -404,6 +446,8 @@ VM_DEFINE_FUNCTION (155, div, "div", 2) ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_divide (x, y)); + DEAD (x); + DEAD (y); NEXT; } @@ -412,6 +456,8 @@ VM_DEFINE_FUNCTION (156, quo, "quo", 2) ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_quotient (x, y)); + DEAD (x); + DEAD (y); NEXT; } @@ -420,6 +466,8 @@ VM_DEFINE_FUNCTION (157, rem, "rem", 2) ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_remainder (x, y)); + DEAD (x); + DEAD (y); NEXT; } @@ -428,6 +476,8 @@ VM_DEFINE_FUNCTION (158, mod, "mod", 2) ARGS2 (x, y); SYNC_REGISTER (); RETURN (scm_modulo (x, y)); + DEAD (x); + DEAD (y); NEXT; } @@ -440,6 +490,8 @@ VM_DEFINE_FUNCTION (159, ash, "ash", 2) /* Right shift, will be a fixnum. */ { RETURN (SCM_I_MAKINUM (SCM_I_INUM (x) >> -SCM_I_INUM (y))); + DEAD (x); + DEAD (y); NEXT; } else @@ -455,6 +507,8 @@ VM_DEFINE_FUNCTION (159, ash, "ash", 2) (SCM_SRS (nn, (SCM_I_FIXNUM_BIT-1 - bits_to_shift)) + 1) <= 1)) { + DEAD (x); + DEAD (y); RETURN (SCM_I_MAKINUM (nn << bits_to_shift)); NEXT; } @@ -464,6 +518,8 @@ VM_DEFINE_FUNCTION (159, ash, "ash", 2) } SYNC_REGISTER (); RETURN (scm_ash (x, y)); + DEAD (x); + DEAD (y); NEXT; } @@ -477,6 +533,8 @@ VM_DEFINE_FUNCTION (160, logand, "logand", 2) SYNC_REGISTER (); RETURN (scm_logand (x, y)); } + DEAD (x); + DEAD (y); NEXT; } @@ -490,6 +548,8 @@ VM_DEFINE_FUNCTION (161, logior, "logior", 2) SYNC_REGISTER (); RETURN (scm_logior (x, y)); } + DEAD (x); + DEAD (y); NEXT; } @@ -503,6 +563,8 @@ VM_DEFINE_FUNCTION (162, logxor, "logxor", 2) SYNC_REGISTER (); RETURN (scm_logxor (x, y)); } + DEAD (x); + DEAD (y); NEXT; } @@ -525,6 +587,8 @@ VM_DEFINE_FUNCTION (163, vector_ref, "vector-ref", 2) SYNC_REGISTER (); RETURN (scm_vector_ref (vect, idx)); } + DEAD (vect); + DEAD (idx); NEXT; } @@ -543,6 +607,9 @@ VM_DEFINE_INSTRUCTION (164, vector_set, "vector-set", 0, 3, 0) SYNC_REGISTER (); scm_vector_set_x (vect, idx, val); } + DEAD (vect); + DEAD (idx); + DEAD (val); NEXT; } @@ -558,8 +625,10 @@ VM_DEFINE_INSTRUCTION (165, make_array, "make-array", 3, -1, 1) SYNC_REGISTER (); PRE_CHECK_UNDERFLOW (len); ret = scm_from_contiguous_array (shape, sp - len + 1, len); + DEAD (shape); DROPN (len); PUSH (ret); + DEAD (ret); NEXT; } @@ -579,6 +648,7 @@ VM_DEFINE_FUNCTION (166, struct_p, "struct?", 1) { ARGS1 (obj); RETURN (scm_from_bool (SCM_STRUCTP (obj))); + DEAD (obj); NEXT; } @@ -587,6 +657,7 @@ VM_DEFINE_FUNCTION (167, struct_vtable, "struct-vtable", 1) ARGS1 (obj); VM_VALIDATE_STRUCT (obj, "struct_vtable"); RETURN (SCM_STRUCT_VTABLE (obj)); + DEAD (obj); NEXT; } @@ -616,9 +687,11 @@ VM_DEFINE_INSTRUCTION (168, make_struct, "make-struct", 2, -1, 1) } else ret = scm_c_make_structv (vtable, 0, n - 1, (scm_t_bits *) inits); + DEAD (vtable); DROPN (n); PUSH (ret); + DEAD (ret); NEXT; } @@ -646,12 +719,16 @@ VM_DEFINE_FUNCTION (169, struct_ref, "struct-ref", 2) { scm_t_bits *data = SCM_STRUCT_DATA (obj); RETURN (SCM_PACK (data[index])); + DEAD (obj); + DEAD (pos); NEXT; } } SYNC_REGISTER (); RETURN (scm_struct_ref (obj, pos)); + DEAD (obj); + DEAD (pos); NEXT; } @@ -677,13 +754,20 @@ VM_DEFINE_FUNCTION (170, struct_set, "struct-set", 3) { scm_t_bits *data = SCM_STRUCT_DATA (obj); data[index] = SCM_UNPACK (val); + /* FIXME: Shouldn't be returning anything, right? */ RETURN (val); + DEAD (obj); + DEAD (pos); + DEAD (val); NEXT; } } SYNC_REGISTER (); RETURN (scm_struct_set_x (obj, pos, val)); + DEAD (obj); + DEAD (pos); + DEAD (val); NEXT; } @@ -701,6 +785,7 @@ VM_DEFINE_FUNCTION (171, class_of, "class-of", 1) SYNC_REGISTER (); RETURN (scm_class_of (obj)); } + DEAD (obj); NEXT; } @@ -710,7 +795,9 @@ VM_DEFINE_FUNCTION (172, slot_ref, "slot-ref", 2) size_t slot; ARGS2 (instance, idx); slot = SCM_I_INUM (idx); + DEAD (idx); RETURN (SCM_PACK (SCM_STRUCT_DATA (instance) [slot])); + DEAD (instance); NEXT; } @@ -721,7 +808,10 @@ VM_DEFINE_INSTRUCTION (173, slot_set, "slot-set", 0, 3, 0) size_t slot; POP3 (val, idx, instance); slot = SCM_I_INUM (idx); + DEAD (idx); SCM_STRUCT_DATA (instance) [slot] = SCM_UNPACK (val); + DEAD (instance); + DEAD (val); NEXT; } @@ -746,11 +836,17 @@ VM_DEFINE_INSTRUCTION (173, slot_set, "slot-set", 0, 3, 0) SCM endianness; \ POP (endianness); \ if (scm_is_eq (endianness, scm_i_native_endianness)) \ - goto VM_LABEL (bv_##stem##_native_ref); \ + { \ + DEAD (endianness); \ + goto VM_LABEL (bv_##stem##_native_ref); \ + } \ { \ ARGS2 (bv, idx); \ SYNC_REGISTER (); \ RETURN (scm_bytevector_##fn_stem##_ref (bv, idx, endianness)); \ + DEAD (bv); \ + DEAD (idx); \ + DEAD (endianness); \ NEXT; \ } \ } @@ -798,6 +894,8 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) SYNC_REGISTER (); \ RETURN (scm_bytevector_ ## fn_stem ## _ref (bv, idx)); \ } \ + DEAD (bv); \ + DEAD (idx); \ NEXT; \ } @@ -830,6 +928,8 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) SYNC_REGISTER (); \ RETURN (scm_bytevector_ ## stem ## _native_ref (bv, idx)); \ } \ + DEAD (bv); \ + DEAD (idx); \ NEXT; \ } @@ -851,6 +951,8 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) RETURN (scm_from_double (*float_ptr)); \ else \ RETURN (scm_bytevector_ ## fn_stem ## _native_ref (bv, idx)); \ + DEAD (bv); \ + DEAD (idx); \ NEXT; \ } @@ -894,11 +996,18 @@ BV_FLOAT_REF (f64, ieee_double, double, 8) SCM endianness; \ POP (endianness); \ if (scm_is_eq (endianness, scm_i_native_endianness)) \ - goto VM_LABEL (bv_##stem##_native_set); \ + { \ + DEAD (endianness); \ + goto VM_LABEL (bv_##stem##_native_set); \ + } \ { \ SCM bv, idx, val; POP3 (val, idx, bv); \ SYNC_REGISTER (); \ scm_bytevector_##fn_stem##_set_x (bv, idx, val, endianness); \ + DEAD (bv); \ + DEAD (idx); \ + DEAD (val); \ + DEAD (endianness); \ NEXT; \ } \ } @@ -946,6 +1055,9 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) SYNC_REGISTER (); \ scm_bytevector_ ## fn_stem ## _set_x (bv, idx, val); \ } \ + DEAD (bv); \ + DEAD (idx); \ + DEAD (val); \ NEXT; \ } @@ -970,6 +1082,9 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) SYNC_REGISTER (); \ scm_bytevector_ ## stem ## _native_set_x (bv, idx, val); \ } \ + DEAD (bv); \ + DEAD (idx); \ + DEAD (val); \ NEXT; \ } @@ -994,6 +1109,9 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) SYNC_REGISTER (); \ scm_bytevector_ ## fn_stem ## _native_set_x (bv, idx, val); \ } \ + DEAD (bv); \ + DEAD (idx); \ + DEAD (val); \ NEXT; \ } |