mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-18 21:29:19 +02:00
Fixing weak references.
This commit is contained in:
parent
0ceb3726c1
commit
3fe810c86a
3 changed files with 15 additions and 6 deletions
|
@ -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))
|
||||
|
|
|
@ -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
2
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
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue