From 2e7549c0f39a1537d8285bee2460f5a4985796b8 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 20 Sep 2010 23:06:39 +0900 Subject: [PATCH] adding weak vectors --- lib/chibi/weak.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/chibi/weak.c b/lib/chibi/weak.c index 16e74e8a..574c36cf 100644 --- a/lib/chibi/weak.c +++ b/lib/chibi/weak.c @@ -4,11 +4,14 @@ #include -static int sexp_ephemeron_id; +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_api_params(self, n), sexp key, sexp value) { sexp res = sexp_alloc_type(ctx, pair, sexp_ephemeron_id); if (! sexp_exceptionp(res)) { @@ -22,7 +25,40 @@ sexp sexp_ephemeron_brokenp_op (sexp ctx sexp_api_params(self, n), sexp eph) { return sexp_make_boolean(sexp_brokenp(eph)); } +sexp sexp_make_weak_vector (sexp ctx sexp_api_params(self, 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