diff --git a/collects/tests/racket/unsafe.rktl b/collects/tests/racket/unsafe.rktl index 16985933f4..c7cf655afe 100644 --- a/collects/tests/racket/unsafe.rktl +++ b/collects/tests/racket/unsafe.rktl @@ -231,6 +231,9 @@ #:pre (lambda () (set-box! b 12)) #:post (lambda (x) (list x (unbox b))) #:literal-ok? #f))) + (test-un 3 'unsafe-unbox* (chaperone-box (box 3) + (lambda (b v) v) + (lambda (b v) v))) (for ([star (list values (add-star "vector"))]) (test-bin 5 (star 'unsafe-vector-ref) #(1 5 7) 1) @@ -240,6 +243,13 @@ #:pre (lambda () (vector-set! v 2 0)) #:post (lambda (x) (list x (vector-ref v 2))) #:literal-ok? #f))) + (test-bin 5 'unsafe-vector*-ref (chaperone-vector #(1 5 7) + (lambda (v i x) x) + (lambda (v i x) x)) + 1) + (test-un 3 'unsafe-vector*-length (chaperone-vector #(1 5 7) + (lambda (v i x) x) + (lambda (v i x) x))) (test-bin 53 'unsafe-bytes-ref #"157" 1) (test-un 3 'unsafe-bytes-length #"157") diff --git a/src/racket/src/jit.c b/src/racket/src/jit.c index ecb34564c3..85ed467f98 100644 --- a/src/racket/src/jit.c +++ b/src/racket/src/jit.c @@ -6751,8 +6751,10 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in (void)jit_calli(bad_flvector_length_code); else if (for_fx) (void)jit_calli(bad_fxvector_length_code); - else + else { (void)jit_calli(bad_vector_length_code); + jit_retval(JIT_R0); + } /* bad_vector_length_code may unpack a proxied object */ __START_TINY_JUMPS__(1); @@ -6870,6 +6872,7 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in ref = jit_bnei_i(jit_forward(), JIT_R1, scheme_chaperone_type); (void)jit_calli(unbox_code); ref2 = jit_jmpi(jit_forward()); + jit_retval(JIT_R0); mz_patch_branch(ref); CHECK_LIMIT(); __END_TINY_JUMPS__(1); diff --git a/src/racket/src/list.c b/src/racket/src/list.c index f0fa0224d1..d91e8fff7f 100644 --- a/src/racket/src/list.c +++ b/src/racket/src/list.c @@ -154,7 +154,9 @@ static Scheme_Object *unsafe_mcdr (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_set_mcar (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_set_mcdr (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_unbox (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_unbox_star (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_set_box (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_set_box_star (int argc, Scheme_Object *argv[]); static Scheme_Object *chaperone_hash_key(const char *name, Scheme_Object *table, Scheme_Object *key); static Scheme_Object *chaperone_hash_tree_set(Scheme_Object *table, Scheme_Object *key, Scheme_Object *val); @@ -781,7 +783,7 @@ scheme_init_unsafe_list (Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("unsafe-unbox", p, env); - p = scheme_make_immed_prim(unsafe_unbox, "unsafe-unbox*", 1, 1); + p = scheme_make_immed_prim(unsafe_unbox_star, "unsafe-unbox*", 1, 1); SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("unsafe-unbox*", p, env); @@ -789,7 +791,7 @@ scheme_init_unsafe_list (Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; scheme_add_global_constant("unsafe-set-box!", p, env); - p = scheme_make_immed_prim(unsafe_set_box, "unsafe-set-box*!", 2, 2); + p = scheme_make_immed_prim(unsafe_set_box_star, "unsafe-set-box*!", 2, 2); SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; scheme_add_global_constant("unsafe-set-box*!", p, env); } @@ -3434,8 +3436,25 @@ static Scheme_Object *unsafe_unbox (int argc, Scheme_Object *argv[]) return SCHEME_BOX_VAL(argv[0]); } +static Scheme_Object *unsafe_unbox_star (int argc, Scheme_Object *argv[]) +{ + if (SCHEME_NP_CHAPERONEP(argv[0])) + return chaperone_unbox(argv[0]); + else + return SCHEME_BOX_VAL(argv[0]); +} + static Scheme_Object *unsafe_set_box (int argc, Scheme_Object *argv[]) { SCHEME_BOX_VAL(argv[0]) = argv[1]; return scheme_void; } + +static Scheme_Object *unsafe_set_box_star (int argc, Scheme_Object *argv[]) +{ + if (SCHEME_NP_CHAPERONEP(argv[0])) + chaperone_set_box(argv[0], argv[1]); + else + SCHEME_BOX_VAL(argv[0]) = argv[1]; + return scheme_void; +}