Fixing weak references.

This commit is contained in:
Alex Shinn 2015-06-20 23:03:44 +09:00
parent 0ceb3726c1
commit 3fe810c86a
3 changed files with 15 additions and 6 deletions

View file

@ -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))

View file

@ -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

2
sexp.c
View file

@ -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
};