@@ -1112,6 +1112,8 @@ gen_opt_swb_cfunc(jitstate_t* jit, ctx_t* ctx, struct rb_call_data * cd, const r
1112
1112
return true;
1113
1113
}
1114
1114
1115
+ bool rb_simple_iseq_p (const rb_iseq_t * iseq );
1116
+
1115
1117
static bool
1116
1118
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 )
1117
1119
{
@@ -1120,13 +1122,19 @@ gen_opt_swb_iseq(jitstate_t* jit, ctx_t* ctx, struct rb_call_data * cd, const rb
1120
1122
int num_params = iseq -> body -> param .size ;
1121
1123
int num_locals = iseq -> body -> local_table_size - num_params ;
1122
1124
1123
- rb_gc_register_mark_object ((VALUE )iseq ); // FIXME: intentional LEAK!
1124
-
1125
1125
if (num_params != argc ) {
1126
1126
//fprintf(stderr, "param argc mismatch\n");
1127
1127
return false;
1128
1128
}
1129
1129
1130
+ if (!rb_simple_iseq_p (iseq )) {
1131
+ // Only handle iseqs that have simple parameters.
1132
+ // See vm_callee_setup_arg().
1133
+ return false;
1134
+ }
1135
+
1136
+ rb_gc_register_mark_object ((VALUE )iseq ); // FIXME: intentional LEAK!
1137
+
1130
1138
// Create a size-exit to fall back to the interpreter
1131
1139
uint8_t * side_exit = ujit_side_exit (jit , ctx );
1132
1140
@@ -1375,7 +1383,7 @@ ujit_init_codegen(void)
1375
1383
ujit_reg_op (BIN (putobject_INT2FIX_1_ ), gen_putobject_int2fix , false);
1376
1384
ujit_reg_op (BIN (putself ), gen_putself , false);
1377
1385
ujit_reg_op (BIN (getlocal_WC_0 ), gen_getlocal_wc0 , false);
1378
- // ujit_reg_op(BIN(getlocal_WC_1), gen_getlocal_wc1, false);
1386
+ ujit_reg_op (BIN (getlocal_WC_1 ), gen_getlocal_wc1 , false);
1379
1387
ujit_reg_op (BIN (setlocal_WC_0 ), gen_setlocal_wc0 , false);
1380
1388
ujit_reg_op (BIN (getinstancevariable ), gen_getinstancevariable , false);
1381
1389
ujit_reg_op (BIN (setinstancevariable ), gen_setinstancevariable , false);
0 commit comments