diff options
author | Alan Wu <XrXr@users.noreply.github.com> | 2021-02-03 16:54:25 -0500 |
---|---|---|
committer | Alan Wu <XrXr@users.noreply.github.com> | 2021-10-20 18:19:28 -0400 |
commit | 56ce40e8becc26afd089802cee7c09e8c3d698ce (patch) | |
tree | 5f17576444da8fdc1580a66de28ee5face990ed7 /ujit_codegen.c | |
parent | e85e0e2fa98d7835163e3470ca322b11a0f67c67 (diff) | |
download | ruby-56ce40e8becc26afd089802cee7c09e8c3d698ce.tar.gz |
Only compile iseqs with simple parameters. Enable get_local_wc1
Diffstat (limited to 'ujit_codegen.c')
-rw-r--r-- | ujit_codegen.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/ujit_codegen.c b/ujit_codegen.c index ad5d1b18b0..50bc4f77b1 100644 --- a/ujit_codegen.c +++ b/ujit_codegen.c @@ -1112,6 +1112,8 @@ gen_opt_swb_cfunc(jitstate_t* jit, ctx_t* ctx, struct rb_call_data * cd, const r return true; } +bool rb_simple_iseq_p(const rb_iseq_t *iseq); + static bool gen_opt_swb_iseq(jitstate_t* jit, ctx_t* ctx, struct rb_call_data * cd, const rb_callable_method_entry_t *cme, int32_t argc) { @@ -1120,13 +1122,19 @@ gen_opt_swb_iseq(jitstate_t* jit, ctx_t* ctx, struct rb_call_data * cd, const rb int num_params = iseq->body->param.size; int num_locals = iseq->body->local_table_size - num_params; - rb_gc_register_mark_object((VALUE)iseq); // FIXME: intentional LEAK! - if (num_params != argc) { //fprintf(stderr, "param argc mismatch\n"); return false; } + if (!rb_simple_iseq_p(iseq)) { + // Only handle iseqs that have simple parameters. + // See vm_callee_setup_arg(). + return false; + } + + rb_gc_register_mark_object((VALUE)iseq); // FIXME: intentional LEAK! + // Create a size-exit to fall back to the interpreter uint8_t* side_exit = ujit_side_exit(jit, ctx); @@ -1375,7 +1383,7 @@ ujit_init_codegen(void) ujit_reg_op(BIN(putobject_INT2FIX_1_), gen_putobject_int2fix, false); ujit_reg_op(BIN(putself), gen_putself, false); ujit_reg_op(BIN(getlocal_WC_0), gen_getlocal_wc0, false); - //ujit_reg_op(BIN(getlocal_WC_1), gen_getlocal_wc1, false); + ujit_reg_op(BIN(getlocal_WC_1), gen_getlocal_wc1, false); ujit_reg_op(BIN(setlocal_WC_0), gen_setlocal_wc0, false); ujit_reg_op(BIN(getinstancevariable), gen_getinstancevariable, false); ujit_reg_op(BIN(setinstancevariable), gen_setinstancevariable, false); |