From 3fe810c86a81f86ab52eec3ecd2e9a6f81aa147a Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sat, 20 Jun 2015 23:03:44 +0900 Subject: [PATCH] Fixing weak references. --- include/chibi/sexp.h | 9 +++++++-- lib/chibi/weak-test.sld | 10 +++++++--- sexp.c | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/include/chibi/sexp.h b/include/chibi/sexp.h index 3bba9f9f..c8919e94 100755 --- a/include/chibi/sexp.h +++ b/include/chibi/sexp.h @@ -481,6 +481,11 @@ struct sexp_struct { int donep; sexp value; } promise; +#endif +#if SEXP_USE_WEAK_REFERENCES + struct { + sexp key, value; + } ephemeron; #endif } value; }; @@ -1083,8 +1088,8 @@ SEXP_API sexp sexp_make_unsigned_integer(sexp ctx, sexp_luint_t x); #define sexp_promise_donep(x) (sexp_field(x, promise, SEXP_PROMISE, donep)) #define sexp_promise_value(x) (sexp_field(x, promise, SEXP_PROMISE, value)) -#define sexp_ephemeron_key(x) (sexp_field(x, pair, SEXP_EPHEMERON, car)) -#define sexp_ephemeron_value(x) (sexp_field(x, pair, SEXP_EPHEMERON, cdr)) +#define sexp_ephemeron_key(x) (sexp_field(x, ephemeron, SEXP_EPHEMERON, key)) +#define sexp_ephemeron_value(x) (sexp_field(x, ephemeron, SEXP_EPHEMERON, value)) #define sexp_context_env(x) (sexp_field(x, context, SEXP_CONTEXT, env)) #define sexp_context_stack(x) (sexp_field(x, context, SEXP_CONTEXT, stack)) diff --git a/lib/chibi/weak-test.sld b/lib/chibi/weak-test.sld index b040b9e6..16a62d80 100644 --- a/lib/chibi/weak-test.sld +++ b/lib/chibi/weak-test.sld @@ -1,6 +1,6 @@ (define-library (chibi weak-test) (export run-tests) - (import (chibi weak) (chibi ast) (only (chibi test) test-begin test test-end)) + (import (chibi) (chibi weak) (chibi ast) (chibi test)) (begin (define (run-tests) (test-begin "weak pointers") @@ -16,7 +16,9 @@ (let ((eph (make-ephemeron (string-append "key" "2") (string-append "value" "2")))) (gc) - (list (ephemeron-key eph) (ephemeron-value eph) (ephemeron-broken? eph)))) + (list (ephemeron-key eph) + (ephemeron-value eph) + (ephemeron-broken? eph)))) (test "unpreserved key and preserved value" '(#f "value3" #t) (let ((value (string-append "value" "3"))) @@ -28,7 +30,9 @@ (let ((key (string-append "key"))) (let ((eph (make-ephemeron key (cons (string-append "value") key)))) (gc) - (list (ephemeron-key eph) (ephemeron-value eph) (ephemeron-broken? eph))))) + (list (ephemeron-key eph) + (ephemeron-value eph) + (ephemeron-broken? eph))))) ;; disabled - we support weak keys, but not proper ephemerons diff --git a/sexp.c b/sexp.c index bd680947..e836586e 100644 --- a/sexp.c +++ b/sexp.c @@ -236,7 +236,7 @@ static struct sexp_type_struct _sexp_type_specs[] = { {SEXP_PROMISE, sexp_offsetof(promise, value), 1, 1, 0, 0, sexp_sizeof(promise), 0, 0, 0, 0, 0, 0, 0, 0, (sexp)"Promise", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, NULL, NULL, NULL}, #endif #if SEXP_USE_WEAK_REFERENCES - {SEXP_EPHEMERON, sexp_offsetof(lit, value), 0, 0, 0, 0, sizeof(sexp), 0, 0, sexp_offsetof(lit, value), 1, 0, 0, 1, 0, (sexp)"Ephemeron", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, NULL, NULL, NULL}, + {SEXP_EPHEMERON, sexp_offsetof(ephemeron, key), 2, 0, 0, 0, sexp_sizeof(ephemeron), 0, 0, sexp_offsetof(ephemeron, key), 1, 0, 0, 1, 0, (sexp)"Ephemeron", SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, SEXP_FALSE, NULL, NULL, NULL}, #endif };