some unsafe-...* fixes on chaperones
This commit is contained in:
parent
649242ac86
commit
5a7ef5ee3f
|
@ -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")
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user