/* weak.c -- weak pointers and ephemerons */ /* Copyright (c) 2010-2011 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); if (! sexp_exceptionp(res)) { sexp_ephemeron_key(res) = key; sexp_ephemeron_value(res) = value; } return res; } sexp sexp_ephemeron_brokenp_op (sexp ctx, sexp self, sexp_sint_t n, sexp eph) { return sexp_make_boolean(sexp_brokenp(eph)); } sexp sexp_make_weak_vector (sexp ctx, sexp self, sexp_sint_t n, sexp len) { sexp vec, *x; 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); if (sexp_exceptionp(vec)) return vec; x = sexp_vector_data(vec); for (i=0; i