diff --git a/lib/chibi/weak.c b/lib/chibi/weak.c index 7b5701f3..f520fd92 100644 --- a/lib/chibi/weak.c +++ b/lib/chibi/weak.c @@ -1,19 +1,16 @@ /* weak.c -- weak pointers and ephemerons */ -/* Copyright (c) 2010-2011 Alex Shinn. All rights reserved. */ +/* Copyright (c) 2010-2013 Alex Shinn. All rights reserved. */ /* BSD-style license: http://synthcode.com/license.txt */ #include -static int sexp_ephemeron_id, sexp_weak_vector_id; - -#define sexp_ephemeronp(x) sexp_check_tag(x, sexp_ephemeron_id) #define sexp_ephemeron_key(x) sexp_slot_ref(x, 0) #define sexp_ephemeron_value(x) sexp_slot_ref(x, 1) #define sexp_weak_vector_p(x) sexp_check_tag(x, sexp_weak_vector_id) sexp sexp_make_ephemeron (sexp ctx, sexp self, sexp_sint_t n, sexp key, sexp value) { - sexp res = sexp_alloc_type(ctx, pair, sexp_ephemeron_id); + sexp res = sexp_alloc_type(ctx, pair, sexp_unbox_fixnum(sexp_opcode_return_type(self))); if (! sexp_exceptionp(res)) { sexp_ephemeron_key(res) = key; sexp_ephemeron_value(res) = value; @@ -22,6 +19,8 @@ sexp sexp_make_ephemeron (sexp ctx, sexp self, sexp_sint_t n, sexp key, sexp val } sexp sexp_ephemeron_brokenp_op (sexp ctx, sexp self, sexp_sint_t n, sexp eph) { + if (! (sexp_pointerp(eph) && (sexp_pointer_tag(eph) == sexp_unbox_fixnum(sexp_opcode_arg1_type(self))))) + return sexp_type_exception(ctx, self, sexp_unbox_fixnum(sexp_opcode_arg1_type(self)), eph); return sexp_make_boolean(sexp_brokenp(eph)); } @@ -30,7 +29,7 @@ sexp sexp_make_weak_vector (sexp ctx, sexp self, sexp_sint_t n, sexp len) { int i, clen = sexp_unbox_fixnum(len); sexp_assert_type(ctx, sexp_fixnump, SEXP_FIXNUM, len); vec = sexp_alloc_tagged(ctx, sexp_sizeof(vector) + clen*sizeof(sexp), - SEXP_VECTOR); + sexp_unbox_fixnum(sexp_opcode_return_type(self))); if (sexp_exceptionp(vec)) return vec; x = sexp_vector_data(vec); for (i=0; i