diff options
| -rw-r--r-- | array.rb | 8 | ||||
| -rw-r--r-- | compile.c | 20 | ||||
| -rw-r--r-- | insns.def | 50 | ||||
| -rw-r--r-- | prism_compile.c | 3 | ||||
| -rw-r--r-- | tool/mk_builtin_loader.rb | 2 | ||||
| -rw-r--r-- | vm_core.h | 2 | ||||
| -rw-r--r-- | yjit/src/codegen.rs | 12 | ||||
| -rw-r--r-- | yjit/src/cruby_bindings.inc.rs | 359 | ||||
| -rw-r--r-- | zjit/src/cruby_bindings.inc.rs | 359 | ||||
| -rw-r--r-- | zjit/src/hir.rs | 31 |
10 files changed, 478 insertions, 368 deletions
@@ -217,7 +217,7 @@ class Array undef :each def each # :nodoc: - Primitive.attr! :inline_block, :c_trace + Primitive.attr! :inline_block, :c_trace, :without_interrupts unless defined?(yield) return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)' @@ -235,7 +235,7 @@ class Array undef :map def map # :nodoc: - Primitive.attr! :inline_block, :c_trace + Primitive.attr! :inline_block, :c_trace, :without_interrupts unless defined?(yield) return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)' @@ -261,7 +261,7 @@ class Array undef :select def select # :nodoc: - Primitive.attr! :inline_block, :c_trace + Primitive.attr! :inline_block, :c_trace, :without_interrupts unless defined?(yield) return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)' @@ -288,7 +288,7 @@ class Array undef :find def find(if_none_proc = nil) # :nodoc: - Primitive.attr! :inline_block, :c_trace + Primitive.attr! :inline_block, :c_trace, :without_interrupts unless defined?(yield) return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)' @@ -4433,6 +4433,7 @@ iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *const anchor) ISEQ_COMPILE_DATA(iseq)->option->tailcall_optimization; const int do_si = ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction; const int do_ou = ISEQ_COMPILE_DATA(iseq)->option->operands_unification; + const int do_without_ints = ISEQ_BODY(iseq)->builtin_attrs & BUILTIN_ATTR_WITHOUT_INTERRUPTS; int rescue_level = 0; int tailcallopt = do_tailcallopt; @@ -4465,6 +4466,22 @@ iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *const anchor) insn_operands_unification((INSN *)list); } + if (do_without_ints) { + INSN *item = (INSN *)list; + if (IS_INSN_ID(item, jump)) { + item->insn_id = BIN(jump_without_ints); + } + else if (IS_INSN_ID(item, branchif)) { + item->insn_id = BIN(branchif_without_ints); + } + else if (IS_INSN_ID(item, branchunless)) { + item->insn_id = BIN(branchunless_without_ints); + } + else if (IS_INSN_ID(item, branchnil)) { + item->insn_id = BIN(branchnil_without_ints); + } + } + if (do_block_optimization) { INSN * item = (INSN *)list; // Give up if there is a throw @@ -9223,6 +9240,9 @@ compile_builtin_attr(rb_iseq_t *iseq, const NODE *node) // Let the iseq act like a C method in backtraces ISEQ_BODY(iseq)->builtin_attrs |= BUILTIN_ATTR_C_TRACE; } + else if (strcmp(RSTRING_PTR(string), "without_interrupts") == 0) { + ISEQ_BODY(iseq)->builtin_attrs |= BUILTIN_ATTR_WITHOUT_INTERRUPTS; + } else { goto unknown_arg; } @@ -1265,6 +1265,56 @@ branchnil } } +/* same as jump, but without interrupt check */ +DEFINE_INSN +jump_without_ints +(OFFSET dst) +() +() +// attr bool leaf = true; +{ + JUMP(dst); +} + +/* same as branchif, but without interrupt check */ +DEFINE_INSN +branchif_without_ints +(OFFSET dst) +(VALUE val) +() +// attr bool leaf = true; +{ + if (RTEST(val)) { + JUMP(dst); + } +} + +/* same as branchunless, but without interrupt check */ +DEFINE_INSN +branchunless_without_ints +(OFFSET dst) +(VALUE val) +() +// attr bool leaf = true; +{ + if (!RTEST(val)) { + JUMP(dst); + } +} + +/* same as branchnil, but without interrupt check */ +DEFINE_INSN +branchnil_without_ints +(OFFSET dst) +(VALUE val) +() +// attr bool leaf = true; +{ + if (NIL_P(val)) { + JUMP(dst); + } +} + /**********************************************************/ /* for optimize */ /**********************************************************/ diff --git a/prism_compile.c b/prism_compile.c index 731859b35a..5d83e55a77 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3441,6 +3441,9 @@ pm_compile_builtin_attr(rb_iseq_t *iseq, const pm_scope_node_t *scope_node, cons // Let the iseq act like a C method in backtraces ISEQ_BODY(iseq)->builtin_attrs |= BUILTIN_ATTR_C_TRACE; } + else if (strcmp(RSTRING_PTR(string), "without_interrupts") == 0) { + ISEQ_BODY(iseq)->builtin_attrs |= BUILTIN_ATTR_WITHOUT_INTERRUPTS; + } else { COMPILE_ERROR(iseq, node_location->line, "unknown argument to attr!: %s", RSTRING_PTR(string)); return COMPILE_NG; diff --git a/tool/mk_builtin_loader.rb b/tool/mk_builtin_loader.rb index 5aa07962f9..3ab36ec45c 100644 --- a/tool/mk_builtin_loader.rb +++ b/tool/mk_builtin_loader.rb @@ -6,7 +6,7 @@ require_relative 'ruby_vm/helpers/c_escape' SUBLIBS = {} REQUIRED = {} -BUILTIN_ATTRS = %w[leaf inline_block use_block c_trace] +BUILTIN_ATTRS = %w[leaf inline_block use_block c_trace without_interrupts] module CompileWarning @@warnings = 0 @@ -403,6 +403,8 @@ enum rb_builtin_attr { BUILTIN_ATTR_INLINE_BLOCK = 0x04, // The iseq acts like a C method in backtraces. BUILTIN_ATTR_C_TRACE = 0x08, + // The iseq uses noint branch/jump opcodes that skip interrupt checking. + BUILTIN_ATTR_WITHOUT_INTERRUPTS = 0x10, }; typedef VALUE (*rb_jit_func_t)(struct rb_execution_context_struct *, struct rb_control_frame_struct *); diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 0fbca85716..0a4832d094 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -4641,7 +4641,7 @@ fn gen_branchif( let jump_offset = jit.get_arg(0).as_i32(); // Check for interrupts, but only on backward branches that may create loops - if jump_offset < 0 { + if jump_offset < 0 && jit.get_opcode() != YARVINSN_branchif_without_ints as usize { gen_check_ints(asm, Counter::branchif_interrupted); } @@ -4693,7 +4693,7 @@ fn gen_branchunless( let jump_offset = jit.get_arg(0).as_i32(); // Check for interrupts, but only on backward branches that may create loops - if jump_offset < 0 { + if jump_offset < 0 && jit.get_opcode() != YARVINSN_branchunless_without_ints as usize { gen_check_ints(asm, Counter::branchunless_interrupted); } @@ -4746,7 +4746,7 @@ fn gen_branchnil( let jump_offset = jit.get_arg(0).as_i32(); // Check for interrupts, but only on backward branches that may create loops - if jump_offset < 0 { + if jump_offset < 0 && jit.get_opcode() != YARVINSN_branchnil_without_ints as usize { gen_check_ints(asm, Counter::branchnil_interrupted); } @@ -4901,7 +4901,7 @@ fn gen_jump( let jump_offset = jit.get_arg(0).as_i32(); // Check for interrupts, but only on backward branches that may create loops - if jump_offset < 0 { + if jump_offset < 0 && jit.get_opcode() != YARVINSN_jump_without_ints as usize { gen_check_ints(asm, Counter::jump_interrupted); } @@ -10777,6 +10777,10 @@ fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> { YARVINSN_branchnil => Some(gen_branchnil), YARVINSN_throw => Some(gen_throw), YARVINSN_jump => Some(gen_jump), + YARVINSN_branchif_without_ints => Some(gen_branchif), + YARVINSN_branchunless_without_ints => Some(gen_branchunless), + YARVINSN_branchnil_without_ints => Some(gen_branchnil), + YARVINSN_jump_without_ints => Some(gen_jump), YARVINSN_opt_new => Some(gen_opt_new), YARVINSN_getblockparamproxy => Some(gen_getblockparamproxy), diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index 57824f4911..9ce8b5a020 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -486,6 +486,7 @@ pub const BUILTIN_ATTR_LEAF: rb_builtin_attr = 1; pub const BUILTIN_ATTR_SINGLE_NOARG_LEAF: rb_builtin_attr = 2; pub const BUILTIN_ATTR_INLINE_BLOCK: rb_builtin_attr = 4; pub const BUILTIN_ATTR_C_TRACE: rb_builtin_attr = 8; +pub const BUILTIN_ATTR_WITHOUT_INTERRUPTS: rb_builtin_attr = 16; pub type rb_builtin_attr = u32; #[repr(C)] #[derive(Debug, Copy, Clone)] @@ -775,181 +776,189 @@ pub const YARVINSN_jump: ruby_vminsn_type = 72; pub const YARVINSN_branchif: ruby_vminsn_type = 73; pub const YARVINSN_branchunless: ruby_vminsn_type = 74; pub const YARVINSN_branchnil: ruby_vminsn_type = 75; -pub const YARVINSN_once: ruby_vminsn_type = 76; -pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 77; -pub const YARVINSN_opt_plus: ruby_vminsn_type = 78; -pub const YARVINSN_opt_minus: ruby_vminsn_type = 79; -pub const YARVINSN_opt_mult: ruby_vminsn_type = 80; -pub const YARVINSN_opt_div: ruby_vminsn_type = 81; -pub const YARVINSN_opt_mod: ruby_vminsn_type = 82; -pub const YARVINSN_opt_eq: ruby_vminsn_type = 83; -pub const YARVINSN_opt_neq: ruby_vminsn_type = 84; -pub const YARVINSN_opt_lt: ruby_vminsn_type = 85; -pub const YARVINSN_opt_le: ruby_vminsn_type = 86; -pub const YARVINSN_opt_gt: ruby_vminsn_type = 87; -pub const YARVINSN_opt_ge: ruby_vminsn_type = 88; -pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 89; -pub const YARVINSN_opt_and: ruby_vminsn_type = 90; -pub const YARVINSN_opt_or: ruby_vminsn_type = 91; -pub const YARVINSN_opt_aref: ruby_vminsn_type = 92; -pub const YARVINSN_opt_aset: ruby_vminsn_type = 93; -pub const YARVINSN_opt_length: ruby_vminsn_type = 94; -pub const YARVINSN_opt_size: ruby_vminsn_type = 95; -pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 96; -pub const YARVINSN_opt_succ: ruby_vminsn_type = 97; -pub const YARVINSN_opt_not: ruby_vminsn_type = 98; -pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 99; -pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 100; -pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 101; -pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 102; -pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 103; -pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 104; -pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 105; -pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 106; -pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 107; -pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 108; -pub const YARVINSN_trace_nop: ruby_vminsn_type = 109; -pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 110; -pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 111; -pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 112; -pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 113; -pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 114; -pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 115; -pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 116; -pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 117; -pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 118; -pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 119; -pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 120; -pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 121; -pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 122; -pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 123; -pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 124; -pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 125; -pub const YARVINSN_trace_putnil: ruby_vminsn_type = 126; -pub const YARVINSN_trace_putself: ruby_vminsn_type = 127; -pub const YARVINSN_trace_putobject: ruby_vminsn_type = 128; -pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 129; -pub const YARVINSN_trace_putstring: ruby_vminsn_type = 130; -pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 131; -pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 132; -pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 133; -pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 134; -pub const YARVINSN_trace_intern: ruby_vminsn_type = 135; -pub const YARVINSN_trace_newarray: ruby_vminsn_type = 136; -pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 137; -pub const YARVINSN_trace_duparray: ruby_vminsn_type = 138; -pub const YARVINSN_trace_duphash: ruby_vminsn_type = 139; -pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 140; -pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 141; -pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 142; -pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 143; -pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 144; -pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 145; -pub const YARVINSN_trace_newhash: ruby_vminsn_type = 146; -pub const YARVINSN_trace_newrange: ruby_vminsn_type = 147; -pub const YARVINSN_trace_pop: ruby_vminsn_type = 148; -pub const YARVINSN_trace_dup: ruby_vminsn_type = 149; -pub const YARVINSN_trace_dupn: ruby_vminsn_type = 150; -pub const YARVINSN_trace_swap: ruby_vminsn_type = 151; -pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 152; -pub const YARVINSN_trace_topn: ruby_vminsn_type = 153; -pub const YARVINSN_trace_setn: ruby_vminsn_type = 154; -pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 155; -pub const YARVINSN_trace_defined: ruby_vminsn_type = 156; -pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 157; -pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 158; -pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 159; -pub const YARVINSN_trace_checktype: ruby_vminsn_type = 160; -pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 161; -pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 162; -pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 163; -pub const YARVINSN_trace_send: ruby_vminsn_type = 164; -pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 165; -pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 166; -pub const YARVINSN_trace_opt_new: ruby_vminsn_type = 167; -pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 168; -pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 169; -pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 170; -pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 171; -pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 172; -pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 173; -pub const YARVINSN_trace_opt_duparray_send: ruby_vminsn_type = 174; -pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 175; -pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 176; -pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 177; -pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 178; -pub const YARVINSN_trace_leave: ruby_vminsn_type = 179; -pub const YARVINSN_trace_throw: ruby_vminsn_type = 180; -pub const YARVINSN_trace_jump: ruby_vminsn_type = 181; -pub const YARVINSN_trace_branchif: ruby_vminsn_type = 182; -pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 183; -pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 184; -pub const YARVINSN_trace_once: ruby_vminsn_type = 185; -pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 186; -pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 187; -pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 188; -pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 189; -pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 190; -pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 191; -pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 192; -pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 193; -pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 194; -pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 195; -pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 196; -pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 197; -pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 198; -pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 199; -pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 200; -pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 201; -pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 202; -pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 203; -pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 204; -pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 205; -pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 206; -pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 207; -pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 208; -pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 209; -pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 210; -pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 211; -pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 212; -pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 213; -pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 214; -pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 215; -pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 216; -pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 217; -pub const YARVINSN_zjit_getblockparamproxy: ruby_vminsn_type = 218; -pub const YARVINSN_zjit_getinstancevariable: ruby_vminsn_type = 219; -pub const YARVINSN_zjit_setinstancevariable: ruby_vminsn_type = 220; -pub const YARVINSN_zjit_definedivar: ruby_vminsn_type = 221; -pub const YARVINSN_zjit_send: ruby_vminsn_type = 222; -pub const YARVINSN_zjit_opt_send_without_block: ruby_vminsn_type = 223; -pub const YARVINSN_zjit_objtostring: ruby_vminsn_type = 224; -pub const YARVINSN_zjit_opt_nil_p: ruby_vminsn_type = 225; -pub const YARVINSN_zjit_invokesuper: ruby_vminsn_type = 226; -pub const YARVINSN_zjit_invokeblock: ruby_vminsn_type = 227; -pub const YARVINSN_zjit_opt_plus: ruby_vminsn_type = 228; -pub const YARVINSN_zjit_opt_minus: ruby_vminsn_type = 229; -pub const YARVINSN_zjit_opt_mult: ruby_vminsn_type = 230; -pub const YARVINSN_zjit_opt_div: ruby_vminsn_type = 231; -pub const YARVINSN_zjit_opt_mod: ruby_vminsn_type = 232; -pub const YARVINSN_zjit_opt_eq: ruby_vminsn_type = 233; -pub const YARVINSN_zjit_opt_neq: ruby_vminsn_type = 234; -pub const YARVINSN_zjit_opt_lt: ruby_vminsn_type = 235; -pub const YARVINSN_zjit_opt_le: ruby_vminsn_type = 236; -pub const YARVINSN_zjit_opt_gt: ruby_vminsn_type = 237; -pub const YARVINSN_zjit_opt_ge: ruby_vminsn_type = 238; -pub const YARVINSN_zjit_opt_ltlt: ruby_vminsn_type = 239; -pub const YARVINSN_zjit_opt_and: ruby_vminsn_type = 240; -pub const YARVINSN_zjit_opt_or: ruby_vminsn_type = 241; -pub const YARVINSN_zjit_opt_aref: ruby_vminsn_type = 242; -pub const YARVINSN_zjit_opt_aset: ruby_vminsn_type = 243; -pub const YARVINSN_zjit_opt_length: ruby_vminsn_type = 244; -pub const YARVINSN_zjit_opt_size: ruby_vminsn_type = 245; -pub const YARVINSN_zjit_opt_empty_p: ruby_vminsn_type = 246; -pub const YARVINSN_zjit_opt_succ: ruby_vminsn_type = 247; -pub const YARVINSN_zjit_opt_not: ruby_vminsn_type = 248; -pub const YARVINSN_zjit_opt_regexpmatch2: ruby_vminsn_type = 249; -pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 250; +pub const YARVINSN_jump_without_ints: ruby_vminsn_type = 76; +pub const YARVINSN_branchif_without_ints: ruby_vminsn_type = 77; +pub const YARVINSN_branchunless_without_ints: ruby_vminsn_type = 78; +pub const YARVINSN_branchnil_without_ints: ruby_vminsn_type = 79; +pub const YARVINSN_once: ruby_vminsn_type = 80; +pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 81; +pub const YARVINSN_opt_plus: ruby_vminsn_type = 82; +pub const YARVINSN_opt_minus: ruby_vminsn_type = 83; +pub const YARVINSN_opt_mult: ruby_vminsn_type = 84; +pub const YARVINSN_opt_div: ruby_vminsn_type = 85; +pub const YARVINSN_opt_mod: ruby_vminsn_type = 86; +pub const YARVINSN_opt_eq: ruby_vminsn_type = 87; +pub const YARVINSN_opt_neq: ruby_vminsn_type = 88; +pub const YARVINSN_opt_lt: ruby_vminsn_type = 89; +pub const YARVINSN_opt_le: ruby_vminsn_type = 90; +pub const YARVINSN_opt_gt: ruby_vminsn_type = 91; +pub const YARVINSN_opt_ge: ruby_vminsn_type = 92; +pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 93; +pub const YARVINSN_opt_and: ruby_vminsn_type = 94; +pub const YARVINSN_opt_or: ruby_vminsn_type = 95; +pub const YARVINSN_opt_aref: ruby_vminsn_type = 96; +pub const YARVINSN_opt_aset: ruby_vminsn_type = 97; +pub const YARVINSN_opt_length: ruby_vminsn_type = 98; +pub const YARVINSN_opt_size: ruby_vminsn_type = 99; +pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 100; +pub const YARVINSN_opt_succ: ruby_vminsn_type = 101; +pub const YARVINSN_opt_not: ruby_vminsn_type = 102; +pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 103; +pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 104; +pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 105; +pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 106; +pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 107; +pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 108; +pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 109; +pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 110; +pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 111; +pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 112; +pub const YARVINSN_trace_nop: ruby_vminsn_type = 113; +pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 114; +pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 115; +pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 116; +pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 117; +pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 118; +pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 119; +pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 120; +pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 121; +pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 122; +pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 123; +pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 124; +pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 125; +pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 126; +pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 127; +pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 128; +pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 129; +pub const YARVINSN_trace_putnil: ruby_vminsn_type = 130; +pub const YARVINSN_trace_putself: ruby_vminsn_type = 131; +pub const YARVINSN_trace_putobject: ruby_vminsn_type = 132; +pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 133; +pub const YARVINSN_trace_putstring: ruby_vminsn_type = 134; +pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 135; +pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 136; +pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 137; +pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 138; +pub const YARVINSN_trace_intern: ruby_vminsn_type = 139; +pub const YARVINSN_trace_newarray: ruby_vminsn_type = 140; +pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 141; +pub const YARVINSN_trace_duparray: ruby_vminsn_type = 142; +pub const YARVINSN_trace_duphash: ruby_vminsn_type = 143; +pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 144; +pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 145; +pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 146; +pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 147; +pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 148; +pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 149; +pub const YARVINSN_trace_newhash: ruby_vminsn_type = 150; +pub const YARVINSN_trace_newrange: ruby_vminsn_type = 151; +pub const YARVINSN_trace_pop: ruby_vminsn_type = 152; +pub const YARVINSN_trace_dup: ruby_vminsn_type = 153; +pub const YARVINSN_trace_dupn: ruby_vminsn_type = 154; +pub const YARVINSN_trace_swap: ruby_vminsn_type = 155; +pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 156; +pub const YARVINSN_trace_topn: ruby_vminsn_type = 157; +pub const YARVINSN_trace_setn: ruby_vminsn_type = 158; +pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 159; +pub const YARVINSN_trace_defined: ruby_vminsn_type = 160; +pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 161; +pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 162; +pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 163; +pub const YARVINSN_trace_checktype: ruby_vminsn_type = 164; +pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 165; +pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 166; +pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 167; +pub const YARVINSN_trace_send: ruby_vminsn_type = 168; +pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 169; +pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 170; +pub const YARVINSN_trace_opt_new: ruby_vminsn_type = 171; +pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 172; +pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 173; +pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 174; +pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 175; +pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 176; +pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 177; +pub const YARVINSN_trace_opt_duparray_send: ruby_vminsn_type = 178; +pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 179; +pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 180; +pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 181; +pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 182; +pub const YARVINSN_trace_leave: ruby_vminsn_type = 183; +pub const YARVINSN_trace_throw: ruby_vminsn_type = 184; +pub const YARVINSN_trace_jump: ruby_vminsn_type = 185; +pub const YARVINSN_trace_branchif: ruby_vminsn_type = 186; +pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 187; +pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 188; +pub const YARVINSN_trace_jump_without_ints: ruby_vminsn_type = 189; +pub const YARVINSN_trace_branchif_without_ints: ruby_vminsn_type = 190; +pub const YARVINSN_trace_branchunless_without_ints: ruby_vminsn_type = 191; +pub const YARVINSN_trace_branchnil_without_ints: ruby_vminsn_type = 192; +pub const YARVINSN_trace_once: ruby_vminsn_type = 193; +pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 194; +pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 195; +pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 196; +pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 197; +pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 198; +pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 199; +pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 200; +pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 201; +pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 202; +pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 203; +pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 204; +pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 205; +pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 206; +pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 207; +pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 208; +pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 209; +pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 210; +pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 211; +pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 212; +pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 213; +pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 214; +pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 215; +pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 216; +pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 217; +pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 218; +pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 219; +pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 220; +pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 221; +pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 222; +pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 223; +pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 224; +pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 225; +pub const YARVINSN_zjit_getblockparamproxy: ruby_vminsn_type = 226; +pub const YARVINSN_zjit_getinstancevariable: ruby_vminsn_type = 227; +pub const YARVINSN_zjit_setinstancevariable: ruby_vminsn_type = 228; +pub const YARVINSN_zjit_definedivar: ruby_vminsn_type = 229; +pub const YARVINSN_zjit_send: ruby_vminsn_type = 230; +pub const YARVINSN_zjit_opt_send_without_block: ruby_vminsn_type = 231; +pub const YARVINSN_zjit_objtostring: ruby_vminsn_type = 232; +pub const YARVINSN_zjit_opt_nil_p: ruby_vminsn_type = 233; +pub const YARVINSN_zjit_invokesuper: ruby_vminsn_type = 234; +pub const YARVINSN_zjit_invokeblock: ruby_vminsn_type = 235; +pub const YARVINSN_zjit_opt_plus: ruby_vminsn_type = 236; +pub const YARVINSN_zjit_opt_minus: ruby_vminsn_type = 237; +pub const YARVINSN_zjit_opt_mult: ruby_vminsn_type = 238; +pub const YARVINSN_zjit_opt_div: ruby_vminsn_type = 239; +pub const YARVINSN_zjit_opt_mod: ruby_vminsn_type = 240; +pub const YARVINSN_zjit_opt_eq: ruby_vminsn_type = 241; +pub const YARVINSN_zjit_opt_neq: ruby_vminsn_type = 242; +pub const YARVINSN_zjit_opt_lt: ruby_vminsn_type = 243; +pub const YARVINSN_zjit_opt_le: ruby_vminsn_type = 244; +pub const YARVINSN_zjit_opt_gt: ruby_vminsn_type = 245; +pub const YARVINSN_zjit_opt_ge: ruby_vminsn_type = 246; +pub const YARVINSN_zjit_opt_ltlt: ruby_vminsn_type = 247; +pub const YARVINSN_zjit_opt_and: ruby_vminsn_type = 248; +pub const YARVINSN_zjit_opt_or: ruby_vminsn_type = 249; +pub const YARVINSN_zjit_opt_aref: ruby_vminsn_type = 250; +pub const YARVINSN_zjit_opt_aset: ruby_vminsn_type = 251; +pub const YARVINSN_zjit_opt_length: ruby_vminsn_type = 252; +pub const YARVINSN_zjit_opt_size: ruby_vminsn_type = 253; +pub const YARVINSN_zjit_opt_empty_p: ruby_vminsn_type = 254; +pub const YARVINSN_zjit_opt_succ: ruby_vminsn_type = 255; +pub const YARVINSN_zjit_opt_not: ruby_vminsn_type = 256; +pub const YARVINSN_zjit_opt_regexpmatch2: ruby_vminsn_type = 257; +pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 258; pub type ruby_vminsn_type = u32; pub type rb_iseq_callback = ::std::option::Option< unsafe extern "C" fn(arg1: *const rb_iseq_t, arg2: *mut ::std::os::raw::c_void), diff --git a/zjit/src/cruby_bindings.inc.rs b/zjit/src/cruby_bindings.inc.rs index 0cd312abf9..77103b9930 100644 --- a/zjit/src/cruby_bindings.inc.rs +++ b/zjit/src/cruby_bindings.inc.rs @@ -585,6 +585,7 @@ pub const BUILTIN_ATTR_LEAF: rb_builtin_attr = 1; pub const BUILTIN_ATTR_SINGLE_NOARG_LEAF: rb_builtin_attr = 2; pub const BUILTIN_ATTR_INLINE_BLOCK: rb_builtin_attr = 4; pub const BUILTIN_ATTR_C_TRACE: rb_builtin_attr = 8; +pub const BUILTIN_ATTR_WITHOUT_INTERRUPTS: rb_builtin_attr = 16; pub type rb_builtin_attr = u32; pub type rb_jit_func_t = ::std::option::Option< unsafe extern "C" fn( @@ -1564,181 +1565,189 @@ pub const YARVINSN_jump: ruby_vminsn_type = 72; pub const YARVINSN_branchif: ruby_vminsn_type = 73; pub const YARVINSN_branchunless: ruby_vminsn_type = 74; pub const YARVINSN_branchnil: ruby_vminsn_type = 75; -pub const YARVINSN_once: ruby_vminsn_type = 76; -pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 77; -pub const YARVINSN_opt_plus: ruby_vminsn_type = 78; -pub const YARVINSN_opt_minus: ruby_vminsn_type = 79; -pub const YARVINSN_opt_mult: ruby_vminsn_type = 80; -pub const YARVINSN_opt_div: ruby_vminsn_type = 81; -pub const YARVINSN_opt_mod: ruby_vminsn_type = 82; -pub const YARVINSN_opt_eq: ruby_vminsn_type = 83; -pub const YARVINSN_opt_neq: ruby_vminsn_type = 84; -pub const YARVINSN_opt_lt: ruby_vminsn_type = 85; -pub const YARVINSN_opt_le: ruby_vminsn_type = 86; -pub const YARVINSN_opt_gt: ruby_vminsn_type = 87; -pub const YARVINSN_opt_ge: ruby_vminsn_type = 88; -pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 89; -pub const YARVINSN_opt_and: ruby_vminsn_type = 90; -pub const YARVINSN_opt_or: ruby_vminsn_type = 91; -pub const YARVINSN_opt_aref: ruby_vminsn_type = 92; -pub const YARVINSN_opt_aset: ruby_vminsn_type = 93; -pub const YARVINSN_opt_length: ruby_vminsn_type = 94; -pub const YARVINSN_opt_size: ruby_vminsn_type = 95; -pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 96; -pub const YARVINSN_opt_succ: ruby_vminsn_type = 97; -pub const YARVINSN_opt_not: ruby_vminsn_type = 98; -pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 99; -pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 100; -pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 101; -pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 102; -pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 103; -pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 104; -pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 105; -pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 106; -pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 107; -pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 108; -pub const YARVINSN_trace_nop: ruby_vminsn_type = 109; -pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 110; -pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 111; -pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 112; -pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 113; -pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 114; -pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 115; -pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 116; -pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 117; -pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 118; -pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 119; -pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 120; -pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 121; -pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 122; -pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 123; -pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 124; -pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 125; -pub const YARVINSN_trace_putnil: ruby_vminsn_type = 126; -pub const YARVINSN_trace_putself: ruby_vminsn_type = 127; -pub const YARVINSN_trace_putobject: ruby_vminsn_type = 128; -pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 129; -pub const YARVINSN_trace_putstring: ruby_vminsn_type = 130; -pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 131; -pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 132; -pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 133; -pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 134; -pub const YARVINSN_trace_intern: ruby_vminsn_type = 135; -pub const YARVINSN_trace_newarray: ruby_vminsn_type = 136; -pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 137; -pub const YARVINSN_trace_duparray: ruby_vminsn_type = 138; -pub const YARVINSN_trace_duphash: ruby_vminsn_type = 139; -pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 140; -pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 141; -pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 142; -pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 143; -pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 144; -pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 145; -pub const YARVINSN_trace_newhash: ruby_vminsn_type = 146; -pub const YARVINSN_trace_newrange: ruby_vminsn_type = 147; -pub const YARVINSN_trace_pop: ruby_vminsn_type = 148; -pub const YARVINSN_trace_dup: ruby_vminsn_type = 149; -pub const YARVINSN_trace_dupn: ruby_vminsn_type = 150; -pub const YARVINSN_trace_swap: ruby_vminsn_type = 151; -pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 152; -pub const YARVINSN_trace_topn: ruby_vminsn_type = 153; -pub const YARVINSN_trace_setn: ruby_vminsn_type = 154; -pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 155; -pub const YARVINSN_trace_defined: ruby_vminsn_type = 156; -pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 157; -pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 158; -pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 159; -pub const YARVINSN_trace_checktype: ruby_vminsn_type = 160; -pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 161; -pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 162; -pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 163; -pub const YARVINSN_trace_send: ruby_vminsn_type = 164; -pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 165; -pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 166; -pub const YARVINSN_trace_opt_new: ruby_vminsn_type = 167; -pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 168; -pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 169; -pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 170; -pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 171; -pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 172; -pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 173; -pub const YARVINSN_trace_opt_duparray_send: ruby_vminsn_type = 174; -pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 175; -pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 176; -pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 177; -pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 178; -pub const YARVINSN_trace_leave: ruby_vminsn_type = 179; -pub const YARVINSN_trace_throw: ruby_vminsn_type = 180; -pub const YARVINSN_trace_jump: ruby_vminsn_type = 181; -pub const YARVINSN_trace_branchif: ruby_vminsn_type = 182; -pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 183; -pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 184; -pub const YARVINSN_trace_once: ruby_vminsn_type = 185; -pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 186; -pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 187; -pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 188; -pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 189; -pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 190; -pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 191; -pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 192; -pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 193; -pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 194; -pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 195; -pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 196; -pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 197; -pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 198; -pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 199; -pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 200; -pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 201; -pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 202; -pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 203; -pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 204; -pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 205; -pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 206; -pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 207; -pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 208; -pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 209; -pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 210; -pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 211; -pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 212; -pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 213; -pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 214; -pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 215; -pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 216; -pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 217; -pub const YARVINSN_zjit_getblockparamproxy: ruby_vminsn_type = 218; -pub const YARVINSN_zjit_getinstancevariable: ruby_vminsn_type = 219; -pub const YARVINSN_zjit_setinstancevariable: ruby_vminsn_type = 220; -pub const YARVINSN_zjit_definedivar: ruby_vminsn_type = 221; -pub const YARVINSN_zjit_send: ruby_vminsn_type = 222; -pub const YARVINSN_zjit_opt_send_without_block: ruby_vminsn_type = 223; -pub const YARVINSN_zjit_objtostring: ruby_vminsn_type = 224; -pub const YARVINSN_zjit_opt_nil_p: ruby_vminsn_type = 225; -pub const YARVINSN_zjit_invokesuper: ruby_vminsn_type = 226; -pub const YARVINSN_zjit_invokeblock: ruby_vminsn_type = 227; -pub const YARVINSN_zjit_opt_plus: ruby_vminsn_type = 228; -pub const YARVINSN_zjit_opt_minus: ruby_vminsn_type = 229; -pub const YARVINSN_zjit_opt_mult: ruby_vminsn_type = 230; -pub const YARVINSN_zjit_opt_div: ruby_vminsn_type = 231; -pub const YARVINSN_zjit_opt_mod: ruby_vminsn_type = 232; -pub const YARVINSN_zjit_opt_eq: ruby_vminsn_type = 233; -pub const YARVINSN_zjit_opt_neq: ruby_vminsn_type = 234; -pub const YARVINSN_zjit_opt_lt: ruby_vminsn_type = 235; -pub const YARVINSN_zjit_opt_le: ruby_vminsn_type = 236; -pub const YARVINSN_zjit_opt_gt: ruby_vminsn_type = 237; -pub const YARVINSN_zjit_opt_ge: ruby_vminsn_type = 238; -pub const YARVINSN_zjit_opt_ltlt: ruby_vminsn_type = 239; -pub const YARVINSN_zjit_opt_and: ruby_vminsn_type = 240; -pub const YARVINSN_zjit_opt_or: ruby_vminsn_type = 241; -pub const YARVINSN_zjit_opt_aref: ruby_vminsn_type = 242; -pub const YARVINSN_zjit_opt_aset: ruby_vminsn_type = 243; -pub const YARVINSN_zjit_opt_length: ruby_vminsn_type = 244; -pub const YARVINSN_zjit_opt_size: ruby_vminsn_type = 245; -pub const YARVINSN_zjit_opt_empty_p: ruby_vminsn_type = 246; -pub const YARVINSN_zjit_opt_succ: ruby_vminsn_type = 247; -pub const YARVINSN_zjit_opt_not: ruby_vminsn_type = 248; -pub const YARVINSN_zjit_opt_regexpmatch2: ruby_vminsn_type = 249; -pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 250; +pub const YARVINSN_jump_without_ints: ruby_vminsn_type = 76; +pub const YARVINSN_branchif_without_ints: ruby_vminsn_type = 77; +pub const YARVINSN_branchunless_without_ints: ruby_vminsn_type = 78; +pub const YARVINSN_branchnil_without_ints: ruby_vminsn_type = 79; +pub const YARVINSN_once: ruby_vminsn_type = 80; +pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 81; +pub const YARVINSN_opt_plus: ruby_vminsn_type = 82; +pub const YARVINSN_opt_minus: ruby_vminsn_type = 83; +pub const YARVINSN_opt_mult: ruby_vminsn_type = 84; +pub const YARVINSN_opt_div: ruby_vminsn_type = 85; +pub const YARVINSN_opt_mod: ruby_vminsn_type = 86; +pub const YARVINSN_opt_eq: ruby_vminsn_type = 87; +pub const YARVINSN_opt_neq: ruby_vminsn_type = 88; +pub const YARVINSN_opt_lt: ruby_vminsn_type = 89; +pub const YARVINSN_opt_le: ruby_vminsn_type = 90; +pub const YARVINSN_opt_gt: ruby_vminsn_type = 91; +pub const YARVINSN_opt_ge: ruby_vminsn_type = 92; +pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 93; +pub const YARVINSN_opt_and: ruby_vminsn_type = 94; +pub const YARVINSN_opt_or: ruby_vminsn_type = 95; +pub const YARVINSN_opt_aref: ruby_vminsn_type = 96; +pub const YARVINSN_opt_aset: ruby_vminsn_type = 97; +pub const YARVINSN_opt_length: ruby_vminsn_type = 98; +pub const YARVINSN_opt_size: ruby_vminsn_type = 99; +pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 100; +pub const YARVINSN_opt_succ: ruby_vminsn_type = 101; +pub const YARVINSN_opt_not: ruby_vminsn_type = 102; +pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 103; +pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 104; +pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 105; +pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 106; +pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 107; +pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 108; +pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 109; +pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 110; +pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 111; +pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 112; +pub const YARVINSN_trace_nop: ruby_vminsn_type = 113; +pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 114; +pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 115; +pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 116; +pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 117; +pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 118; +pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 119; +pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 120; +pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 121; +pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 122; +pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 123; +pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 124; +pub const YARVINSN_trace_opt_getconstant_path: ruby_vminsn_type = 125; +pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 126; +pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 127; +pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 128; +pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 129; +pub const YARVINSN_trace_putnil: ruby_vminsn_type = 130; +pub const YARVINSN_trace_putself: ruby_vminsn_type = 131; +pub const YARVINSN_trace_putobject: ruby_vminsn_type = 132; +pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 133; +pub const YARVINSN_trace_putstring: ruby_vminsn_type = 134; +pub const YARVINSN_trace_putchilledstring: ruby_vminsn_type = 135; +pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 136; +pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 137; +pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 138; +pub const YARVINSN_trace_intern: ruby_vminsn_type = 139; +pub const YARVINSN_trace_newarray: ruby_vminsn_type = 140; +pub const YARVINSN_trace_pushtoarraykwsplat: ruby_vminsn_type = 141; +pub const YARVINSN_trace_duparray: ruby_vminsn_type = 142; +pub const YARVINSN_trace_duphash: ruby_vminsn_type = 143; +pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 144; +pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 145; +pub const YARVINSN_trace_concattoarray: ruby_vminsn_type = 146; +pub const YARVINSN_trace_pushtoarray: ruby_vminsn_type = 147; +pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 148; +pub const YARVINSN_trace_splatkw: ruby_vminsn_type = 149; +pub const YARVINSN_trace_newhash: ruby_vminsn_type = 150; +pub const YARVINSN_trace_newrange: ruby_vminsn_type = 151; +pub const YARVINSN_trace_pop: ruby_vminsn_type = 152; +pub const YARVINSN_trace_dup: ruby_vminsn_type = 153; +pub const YARVINSN_trace_dupn: ruby_vminsn_type = 154; +pub const YARVINSN_trace_swap: ruby_vminsn_type = 155; +pub const YARVINSN_trace_opt_reverse: ruby_vminsn_type = 156; +pub const YARVINSN_trace_topn: ruby_vminsn_type = 157; +pub const YARVINSN_trace_setn: ruby_vminsn_type = 158; +pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 159; +pub const YARVINSN_trace_defined: ruby_vminsn_type = 160; +pub const YARVINSN_trace_definedivar: ruby_vminsn_type = 161; +pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 162; +pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 163; +pub const YARVINSN_trace_checktype: ruby_vminsn_type = 164; +pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 165; +pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 166; +pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 167; +pub const YARVINSN_trace_send: ruby_vminsn_type = 168; +pub const YARVINSN_trace_sendforward: ruby_vminsn_type = 169; +pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 170; +pub const YARVINSN_trace_opt_new: ruby_vminsn_type = 171; +pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 172; +pub const YARVINSN_trace_opt_ary_freeze: ruby_vminsn_type = 173; +pub const YARVINSN_trace_opt_hash_freeze: ruby_vminsn_type = 174; +pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 175; +pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 176; +pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 177; +pub const YARVINSN_trace_opt_duparray_send: ruby_vminsn_type = 178; +pub const YARVINSN_trace_opt_newarray_send: ruby_vminsn_type = 179; +pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 180; +pub const YARVINSN_trace_invokesuperforward: ruby_vminsn_type = 181; +pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 182; +pub const YARVINSN_trace_leave: ruby_vminsn_type = 183; +pub const YARVINSN_trace_throw: ruby_vminsn_type = 184; +pub const YARVINSN_trace_jump: ruby_vminsn_type = 185; +pub const YARVINSN_trace_branchif: ruby_vminsn_type = 186; +pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 187; +pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 188; +pub const YARVINSN_trace_jump_without_ints: ruby_vminsn_type = 189; +pub const YARVINSN_trace_branchif_without_ints: ruby_vminsn_type = 190; +pub const YARVINSN_trace_branchunless_without_ints: ruby_vminsn_type = 191; +pub const YARVINSN_trace_branchnil_without_ints: ruby_vminsn_type = 192; +pub const YARVINSN_trace_once: ruby_vminsn_type = 193; +pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 194; +pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 195; +pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 196; +pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 197; +pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 198; +pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 199; +pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 200; +pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 201; +pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 202; +pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 203; +pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 204; +pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 205; +pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 206; +pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 207; +pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 208; +pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 209; +pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 210; +pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 211; +pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 212; +pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 213; +pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 214; +pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 215; +pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 216; +pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 217; +pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 218; +pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 219; +pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 220; +pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 221; +pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 222; +pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 223; +pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 224; +pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 225; +pub const YARVINSN_zjit_getblockparamproxy: ruby_vminsn_type = 226; +pub const YARVINSN_zjit_getinstancevariable: ruby_vminsn_type = 227; +pub const YARVINSN_zjit_setinstancevariable: ruby_vminsn_type = 228; +pub const YARVINSN_zjit_definedivar: ruby_vminsn_type = 229; +pub const YARVINSN_zjit_send: ruby_vminsn_type = 230; +pub const YARVINSN_zjit_opt_send_without_block: ruby_vminsn_type = 231; +pub const YARVINSN_zjit_objtostring: ruby_vminsn_type = 232; +pub const YARVINSN_zjit_opt_nil_p: ruby_vminsn_type = 233; +pub const YARVINSN_zjit_invokesuper: ruby_vminsn_type = 234; +pub const YARVINSN_zjit_invokeblock: ruby_vminsn_type = 235; +pub const YARVINSN_zjit_opt_plus: ruby_vminsn_type = 236; +pub const YARVINSN_zjit_opt_minus: ruby_vminsn_type = 237; +pub const YARVINSN_zjit_opt_mult: ruby_vminsn_type = 238; +pub const YARVINSN_zjit_opt_div: ruby_vminsn_type = 239; +pub const YARVINSN_zjit_opt_mod: ruby_vminsn_type = 240; +pub const YARVINSN_zjit_opt_eq: ruby_vminsn_type = 241; +pub const YARVINSN_zjit_opt_neq: ruby_vminsn_type = 242; +pub const YARVINSN_zjit_opt_lt: ruby_vminsn_type = 243; +pub const YARVINSN_zjit_opt_le: ruby_vminsn_type = 244; +pub const YARVINSN_zjit_opt_gt: ruby_vminsn_type = 245; +pub const YARVINSN_zjit_opt_ge: ruby_vminsn_type = 246; +pub const YARVINSN_zjit_opt_ltlt: ruby_vminsn_type = 247; +pub const YARVINSN_zjit_opt_and: ruby_vminsn_type = 248; +pub const YARVINSN_zjit_opt_or: ruby_vminsn_type = 249; +pub const YARVINSN_zjit_opt_aref: ruby_vminsn_type = 250; +pub const YARVINSN_zjit_opt_aset: ruby_vminsn_type = 251; +pub const YARVINSN_zjit_opt_length: ruby_vminsn_type = 252; +pub const YARVINSN_zjit_opt_size: ruby_vminsn_type = 253; +pub const YARVINSN_zjit_opt_empty_p: ruby_vminsn_type = 254; +pub const YARVINSN_zjit_opt_succ: ruby_vminsn_type = 255; +pub const YARVINSN_zjit_opt_not: ruby_vminsn_type = 256; +pub const YARVINSN_zjit_opt_regexpmatch2: ruby_vminsn_type = 257; +pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 258; pub type ruby_vminsn_type = u32; pub type rb_iseq_callback = ::std::option::Option< unsafe extern "C" fn(arg1: *const rb_iseq_t, arg2: *mut ::std::os::raw::c_void), diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index fe0122d297..cf2371ef5a 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -6119,7 +6119,8 @@ fn compute_bytecode_info(iseq: *const rb_iseq_t, opt_table: &[u32]) -> BytecodeI .unwrap(); insn_idx += insn_len(opcode as usize); match opcode { - YARVINSN_branchunless | YARVINSN_jump | YARVINSN_branchif | YARVINSN_branchnil => { + YARVINSN_branchunless | YARVINSN_jump | YARVINSN_branchif | YARVINSN_branchnil + | YARVINSN_branchunless_without_ints | YARVINSN_jump_without_ints | YARVINSN_branchif_without_ints | YARVINSN_branchnil_without_ints => { let offset = get_arg(pc, 0).as_i64(); jump_targets.insert(insn_idx_at_offset(insn_idx, offset)); } @@ -6232,6 +6233,10 @@ fn invalidates_locals(opcode: u32, operands: *const VALUE) -> bool { | YARVINSN_branchunless | YARVINSN_branchif | YARVINSN_branchnil + | YARVINSN_jump_without_ints + | YARVINSN_branchunless_without_ints + | YARVINSN_branchif_without_ints + | YARVINSN_branchnil_without_ints | YARVINSN_leave => false, // TODO(max): Read the invokebuiltin target from operands and determine if it's leaf _ => unsafe { !rb_zjit_insn_leaf(opcode as i32, operands) } @@ -6655,8 +6660,10 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> { let snapshot = fun.push_insn(block, Insn::Snapshot { state: exit_state }); state.stack_push(fun.push_insn(block, Insn::GetConstantPath { ic, state: snapshot })); } - YARVINSN_branchunless => { - fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); + YARVINSN_branchunless | YARVINSN_branchunless_without_ints => { + if opcode == YARVINSN_branchunless { + fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); + } let offset = get_arg(pc, 0).as_i64(); let val = state.stack_pop()?; let test_id = fun.push_insn(block, Insn::Test { val }); @@ -6675,8 +6682,10 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> { state.replace(val, not_nil_false); queue.push_back((state.clone(), target, target_idx, local_inval)); } - YARVINSN_branchif => { - fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); + YARVINSN_branchif | YARVINSN_branchif_without_ints => { + if opcode == YARVINSN_branchif { + fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); + } let offset = get_arg(pc, 0).as_i64(); let val = state.stack_pop()?; let test_id = fun.push_insn(block, Insn::Test { val }); @@ -6695,8 +6704,10 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> { state.replace(val, nil_false); queue.push_back((state.clone(), target, target_idx, local_inval)); } - YARVINSN_branchnil => { - fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); + YARVINSN_branchnil | YARVINSN_branchnil_without_ints => { + if opcode == YARVINSN_branchnil { + fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); + } let offset = get_arg(pc, 0).as_i64(); let val = state.stack_pop()?; let test_id = fun.push_insn(block, Insn::IsNil { val }); @@ -6745,9 +6756,11 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> { state.stack_setn(argc, insn_id); state.stack_setn(argc + 1, insn_id); } - YARVINSN_jump => { + YARVINSN_jump | YARVINSN_jump_without_ints => { let offset = get_arg(pc, 0).as_i64(); - fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); + if opcode == YARVINSN_jump { + fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); + } let target_idx = insn_idx_at_offset(insn_idx, offset); let target = insn_idx_to_block[&target_idx]; let _branch_id = fun.push_insn(block, Insn::Jump( |
