summaryrefslogtreecommitdiff
path: root/ujit_codegen.c
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2021-02-03 16:54:25 -0500
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:28 -0400
commit56ce40e8becc26afd089802cee7c09e8c3d698ce (patch)
tree5f17576444da8fdc1580a66de28ee5face990ed7 /ujit_codegen.c
parente85e0e2fa98d7835163e3470ca322b11a0f67c67 (diff)
downloadruby-56ce40e8becc26afd089802cee7c09e8c3d698ce.tar.gz
Only compile iseqs with simple parameters. Enable get_local_wc1
Diffstat (limited to 'ujit_codegen.c')
-rw-r--r--ujit_codegen.c14
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);