diff --git a/pkgs/racket-test-core/tests/racket/foreign-test.rktl b/pkgs/racket-test-core/tests/racket/foreign-test.rktl index f68ab3c7ac..4950c99558 100644 --- a/pkgs/racket-test-core/tests/racket/foreign-test.rktl +++ b/pkgs/racket-test-core/tests/racket/foreign-test.rktl @@ -615,6 +615,20 @@ (test (cast p _thing-pointer _intptr) cast q _stuff-pointer _intptr)) +;; test 'interior allocation mode +(let () + ;; Example by Ron Garcia + (define-struct data (a b)) + (define (cbox s) + (define ptr (malloc _racket 'interior)) + (ptr-set! ptr _racket s) + ptr) + (define (cunbox cb) + (ptr-ref cb _racket 0)) + (define cb1 (cbox (make-data 1 2))) + (collect-garbage) + (test 1 data-a (cunbox cb1))) + (let () (struct foo (ptr) #:property prop:cpointer 0) diff --git a/racket/src/foreign/foreign.c b/racket/src/foreign/foreign.c index 729dcbde29..7e3f73f1c5 100644 --- a/racket/src/foreign/foreign.c +++ b/racket/src/foreign/foreign.c @@ -2665,7 +2665,7 @@ static Scheme_Object *foreign_malloc(int argc, Scheme_Object *argv[]) else if (SAME_OBJ(mode, stubborn_sym)) mf = scheme_malloc_stubborn; else if (SAME_OBJ(mode, eternal_sym)) mf = scheme_malloc_eternal; else if (SAME_OBJ(mode, uncollectable_sym)) mf = scheme_malloc_uncollectable; - else if (SAME_OBJ(mode, interior_sym)) mf = scheme_malloc_atomic_allow_interior; + else if (SAME_OBJ(mode, interior_sym)) mf = scheme_malloc_allow_interior; else if (SAME_OBJ(mode, atomic_interior_sym)) mf = scheme_malloc_atomic_allow_interior; else if (SAME_OBJ(mode, raw_sym)) mf = malloc; else if (SAME_OBJ(mode, tagged_sym)) mf = scheme_malloc_tagged; diff --git a/racket/src/foreign/foreign.rktc b/racket/src/foreign/foreign.rktc index 7ef2ec4e6f..1ca1e16226 100755 --- a/racket/src/foreign/foreign.rktc +++ b/racket/src/foreign/foreign.rktc @@ -1904,7 +1904,7 @@ static void* SCHEME2C(const char *who, else if (SAME_OBJ(mode, stubborn_sym)) mf = scheme_malloc_stubborn; else if (SAME_OBJ(mode, eternal_sym)) mf = scheme_malloc_eternal; else if (SAME_OBJ(mode, uncollectable_sym)) mf = scheme_malloc_uncollectable; - else if (SAME_OBJ(mode, interior_sym)) mf = scheme_malloc_atomic_allow_interior; + else if (SAME_OBJ(mode, interior_sym)) mf = scheme_malloc_allow_interior; else if (SAME_OBJ(mode, atomic_interior_sym)) mf = scheme_malloc_atomic_allow_interior; else if (SAME_OBJ(mode, raw_sym)) mf = malloc; else if (SAME_OBJ(mode, tagged_sym)) mf = scheme_malloc_tagged;