diff --git a/depend b/depend index 334bab56848172..7fdf369158c305 100644 --- a/depend +++ b/depend @@ -1401,7 +1401,6 @@ compile.$(OBJEXT): $(top_srcdir)/prism/pack.h compile.$(OBJEXT): $(top_srcdir)/prism/parser.h compile.$(OBJEXT): $(top_srcdir)/prism/prettyprint.h compile.$(OBJEXT): $(top_srcdir)/prism/prism.h -compile.$(OBJEXT): $(top_srcdir)/prism/prism.h compile.$(OBJEXT): $(top_srcdir)/prism/regexp.h compile.$(OBJEXT): $(top_srcdir)/prism/static_literals.h compile.$(OBJEXT): $(top_srcdir)/prism/util/pm_buffer.h @@ -17727,6 +17726,7 @@ transcode.$(OBJEXT): $(hdrdir)/ruby/ruby.h transcode.$(OBJEXT): $(top_srcdir)/internal/array.h transcode.$(OBJEXT): $(top_srcdir)/internal/class.h transcode.$(OBJEXT): $(top_srcdir)/internal/compilers.h +transcode.$(OBJEXT): $(top_srcdir)/internal/encoding.h transcode.$(OBJEXT): $(top_srcdir)/internal/gc.h transcode.$(OBJEXT): $(top_srcdir)/internal/inits.h transcode.$(OBJEXT): $(top_srcdir)/internal/object.h diff --git a/encoding.c b/encoding.c index 0a5d61ee4a1692..2416acecea8c68 100644 --- a/encoding.c +++ b/encoding.c @@ -459,6 +459,16 @@ enc_registered(struct enc_table *enc_table, const char *name) return -1; } +int +rb_enc_registered(const char *name) +{ + int idx; + GLOBAL_ENC_TABLE_LOCKING(enc_table) { + idx = enc_registered(enc_table, name); + } + return idx; +} + void rb_encdb_declare(const char *name) { @@ -1600,8 +1610,10 @@ enc_set_default_encoding(struct default_encoding *def, VALUE encoding, const cha /* Already set */ overridden = TRUE; + int index = 0; if (!NIL_P(encoding)) { enc_check_encoding(encoding); // loads it if necessary. Needs to be done outside of VM lock. + index = rb_enc_to_index(rb_to_encoding(encoding)); } GLOBAL_ENC_TABLE_LOCKING(enc_table) { @@ -1619,7 +1631,7 @@ enc_set_default_encoding(struct default_encoding *def, VALUE encoding, const cha (st_data_t)UNSPECIFIED_ENCODING); } else { - def->index = rb_enc_to_index(rb_to_encoding(encoding)); + def->index = index; def->enc = 0; enc_alias_internal(enc_table, name, def->index); } diff --git a/gc/default/default.c b/gc/default/default.c index d4e34b9d0379ee..d2ed2244e1a56e 100644 --- a/gc/default/default.c +++ b/gc/default/default.c @@ -1853,7 +1853,10 @@ static struct heap_page * heap_page_resurrect(rb_objspace_t *objspace) { struct heap_page *page = NULL; - if (objspace->empty_pages != NULL) { + if (objspace->empty_pages == NULL) { + GC_ASSERT(objspace->empty_pages_count == 0); + } + else { GC_ASSERT(objspace->empty_pages_count > 0); objspace->empty_pages_count--; page = objspace->empty_pages; @@ -1973,6 +1976,8 @@ heap_page_allocate_and_initialize(rb_objspace_t *objspace, rb_heap_t *heap) if (page == NULL && objspace->heap_pages.allocatable_slots > 0) { page = heap_page_allocate(objspace); allocated = true; + + GC_ASSERT(page != NULL); } if (page != NULL) { @@ -2047,6 +2052,9 @@ heap_prepare(rb_objspace_t *objspace, rb_heap_t *heap) /* If we still don't have a free page and not allowed to create a new page, * we should start a new GC cycle. */ if (heap->free_pages == NULL) { + GC_ASSERT(objspace->empty_pages_count == 0); + GC_ASSERT(objspace->heap_pages.allocatable_slots == 0); + if (gc_start(objspace, GPR_FLAG_NEWOBJ) == FALSE) { rb_memerror(); } @@ -3922,10 +3930,29 @@ gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *sweep_heap) for (int i = 0; i < HEAP_COUNT; i++) { rb_heap_t *heap = &heaps[i]; - if (!gc_sweep_step(objspace, heap)) { - if (heap == sweep_heap && objspace->empty_pages_count == 0 && objspace->heap_pages.allocatable_slots == 0) { + if (gc_sweep_step(objspace, heap)) { + GC_ASSERT(heap->free_pages != NULL); + } + else if (heap == sweep_heap) { + if (objspace->empty_pages_count > 0 || objspace->heap_pages.allocatable_slots > 0) { + /* [Bug #21548] + * + * If this heap is the heap we want to sweep, but we weren't able + * to free any slots, but we also either have empty pages or could + * allocate new pages, then we want to preemptively claim a page + * because it's possible that sweeping another heap will call + * gc_sweep_finish_heap, which may use up all of the + * empty/allocatable pages. If other heaps are not finished sweeping + * then we do not finish this GC and we will end up triggering a new + * GC cycle during this GC phase. */ + heap_page_allocate_and_initialize(objspace, heap); + + GC_ASSERT(heap->free_pages != NULL); + } + else { /* Not allowed to create a new page so finish sweeping. */ gc_sweep_rest(objspace); + GC_ASSERT(gc_mode(objspace) == gc_mode_none); break; } } diff --git a/internal/encoding.h b/internal/encoding.h index c2ffaf4514c1d7..38bf8fc9da77ef 100644 --- a/internal/encoding.h +++ b/internal/encoding.h @@ -29,6 +29,7 @@ void rb_encdb_declare(const char *name); void rb_enc_set_base(const char *name, const char *orig); int rb_enc_set_dummy(int index); void rb_enc_raw_set(VALUE obj, rb_encoding *enc); +int rb_enc_registered(const char *name); PUREFUNC(int rb_data_is_encoding(VALUE obj)); diff --git a/ractor_sync.c b/ractor_sync.c index 057448c5f58bfa..52ce953851b296 100644 --- a/ractor_sync.c +++ b/ractor_sync.c @@ -98,14 +98,14 @@ ractor_port_init(VALUE rpv, rb_ractor_t *r) * Returns a new Ractor::Port object. */ static VALUE -ractor_port_initialzie(VALUE self) +ractor_port_initialize(VALUE self) { return ractor_port_init(self, GET_RACTOR()); } /* :nodoc: */ static VALUE -ractor_port_initialzie_copy(VALUE self, VALUE orig) +ractor_port_initialize_copy(VALUE self, VALUE orig) { struct ractor_port *dst = RACTOR_PORT_PTR(self); struct ractor_port *src = RACTOR_PORT_PTR(orig); @@ -1498,8 +1498,8 @@ Init_RactorPort(void) { rb_cRactorPort = rb_define_class_under(rb_cRactor, "Port", rb_cObject); rb_define_alloc_func(rb_cRactorPort, ractor_port_alloc); - rb_define_method(rb_cRactorPort, "initialize", ractor_port_initialzie, 0); - rb_define_method(rb_cRactorPort, "initialize_copy", ractor_port_initialzie_copy, 1); + rb_define_method(rb_cRactorPort, "initialize", ractor_port_initialize, 0); + rb_define_method(rb_cRactorPort, "initialize_copy", ractor_port_initialize_copy, 1); #if USE_RACTOR_SELECTOR rb_init_ractor_selector(); diff --git a/test/ruby/test_encoding.rb b/test/ruby/test_encoding.rb index 7ccbb31f503ea0..5c1eb50bb13786 100644 --- a/test/ruby/test_encoding.rb +++ b/test/ruby/test_encoding.rb @@ -157,4 +157,23 @@ def test_ractor_lazy_load_encoding_concurrently assert rs.empty? end; end + + def test_ractor_set_default_external_string + assert_ractor("#{<<~"begin;"}\n#{<<~'end;'}") + begin; + $-w = nil + rs = [] + 7.times do |i| + rs << Ractor.new(i) do |i| + Encoding.default_external = "us-ascii" + end + end + + while rs.any? + r, _obj = Ractor.select(*rs) + rs.delete(r) + end + assert rs.empty? + end; + end end diff --git a/test/ruby/test_transcode.rb b/test/ruby/test_transcode.rb index 938e20e9a188e1..71e1cc9e2a9aa4 100644 --- a/test/ruby/test_transcode.rb +++ b/test/ruby/test_transcode.rb @@ -2361,6 +2361,52 @@ def test_ractor_lazy_load_encoding_random end; end + def test_ractor_asciicompat_encoding_exists + assert_ractor("#{<<~"begin;"}\n#{<<~'end;'}") + begin; + rs = [] + 7.times do + rs << Ractor.new do + string = "ISO-2022-JP" + encoding = Encoding.find(string) + 20_000.times do + Encoding::Converter.asciicompat_encoding(string) + Encoding::Converter.asciicompat_encoding(encoding) + end + end + end + + while rs.any? + r, _obj = Ractor.select(*rs) + rs.delete(r) + end + assert rs.empty? + end; + end + + def test_ractor_asciicompat_encoding_doesnt_exist + assert_ractor("#{<<~"begin;"}\n#{<<~'end;'}") + begin; + rs = [] + NO_EXIST = "I".freeze + 7.times do + rs << Ractor.new do + 50.times do + if (val = Encoding::Converter.asciicompat_encoding(NO_EXIST)) + raise "Got #{val}, expected nil" + end + end + end + end + + while rs.any? + r, _obj = Ractor.select(*rs) + rs.delete(r) + end + assert rs.empty? + end; + end + private def assert_conversion_both_ways_utf8(utf8, raw, encoding) diff --git a/test/ruby/test_zjit.rb b/test/ruby/test_zjit.rb index 879aaf322577c3..9b4271ffc098a5 100644 --- a/test/ruby/test_zjit.rb +++ b/test/ruby/test_zjit.rb @@ -1008,25 +1008,29 @@ def test test } - assert_compiles '1', %q{ + # TODO(Shopify/ruby#716): Support spills and change to assert_compiles + assert_runs '1', %q{ def a(n1,n2,n3,n4,n5,n6,n7,n8,n9) = n1+n9 a(2,0,0,0,0,0,0,0,-1) } - assert_compiles '0', %q{ + # TODO(Shopify/ruby#716): Support spills and change to assert_compiles + assert_runs '0', %q{ def a(n1,n2,n3,n4,n5,n6,n7,n8) = n8 a(1,1,1,1,1,1,1,0) } + # TODO(Shopify/ruby#716): Support spills and change to assert_compiles # self param with spilled param - assert_compiles '"main"', %q{ + assert_runs '"main"', %q{ def a(n1,n2,n3,n4,n5,n6,n7,n8) = self a(1,0,0,0,0,0,0,0).to_s } end def test_spilled_param_new_arary - assert_compiles '[:ok]', %q{ + # TODO(Shopify/ruby#716): Support spills and change to assert_compiles + assert_runs '[:ok]', %q{ def a(n1,n2,n3,n4,n5,n6,n7,n8) = [n8] a(0,0,0,0,0,0,0, :ok) } diff --git a/transcode.c b/transcode.c index 507bce78e1357f..072e1942b1ae14 100644 --- a/transcode.c +++ b/transcode.c @@ -19,6 +19,7 @@ #include "internal/object.h" #include "internal/string.h" #include "internal/transcode.h" +#include "internal/encoding.h" #include "ruby/encoding.h" #include "vm_sync.h" @@ -1826,7 +1827,9 @@ rb_econv_asciicompat_encoding(const char *ascii_incompat_name) st_table *table2; struct asciicompat_encoding_t data = {0}; - RB_VM_LOCKING() { + unsigned int lev; + RB_VM_LOCK_ENTER_LEV(&lev); + { if (st_lookup(transcoder_table, (st_data_t)ascii_incompat_name, &v)) { table2 = (st_table *)v; /* @@ -1839,12 +1842,25 @@ rb_econv_asciicompat_encoding(const char *ascii_incompat_name) if (table2->num_entries == 1) { data.ascii_incompat_name = ascii_incompat_name; data.ascii_compat_name = NULL; - st_foreach(table2, asciicompat_encoding_i, (st_data_t)&data); + if (rb_multi_ractor_p()) { + /* + * We need to unlock in case `load_transcoder_entry` actually loads the encoding + * and table2 could be inserted into when we unlock. + */ + st_table *dup_table2 = st_copy(table2); + RB_VM_LOCK_LEAVE_LEV(&lev); + st_foreach(dup_table2, asciicompat_encoding_i, (st_data_t)&data); + st_free_table(dup_table2); + RB_VM_LOCK_ENTER_LEV(&lev); + } + else { + st_foreach(table2, asciicompat_encoding_i, (st_data_t)&data); + } } } - } + RB_VM_LOCK_LEAVE_LEV(&lev); return data.ascii_compat_name; // can be NULL } @@ -2989,10 +3005,16 @@ static rb_encoding * make_encoding(const char *name) { rb_encoding *enc; - RB_VM_LOCKING() { - enc = rb_enc_find(name); - if (!enc) - enc = make_dummy_encoding(name); + enc = rb_enc_find(name); + if (!enc) { + RB_VM_LOCKING() { + if (rb_enc_registered(name)) { + enc = NULL; + } + else { + enc = make_dummy_encoding(name); + } + } } return enc; } @@ -3029,14 +3051,10 @@ econv_s_asciicompat_encoding(VALUE klass, VALUE arg) VALUE enc = Qnil; enc_arg(&arg, &arg_name, &arg_enc); - - RB_VM_LOCKING() { - result_name = rb_econv_asciicompat_encoding(arg_name); - - if (result_name) { - result_enc = make_encoding(result_name); - enc = rb_enc_from_encoding(result_enc); - } + result_name = rb_econv_asciicompat_encoding(arg_name); + if (result_name) { + result_enc = make_encoding(result_name); + enc = rb_enc_from_encoding(result_enc); } return enc; } diff --git a/zjit/src/codegen.rs b/zjit/src/codegen.rs index 0549365666e5b7..16d44c74b0e37e 100644 --- a/zjit/src/codegen.rs +++ b/zjit/src/codegen.rs @@ -395,6 +395,7 @@ fn gen_insn(cb: &mut CodeBlock, jit: &mut JITState, asm: &mut Assembler, functio Insn::GetSpecialNumber { nth, state } => gen_getspecial_number(asm, *nth, &function.frame_state(*state)), &Insn::IncrCounter(counter) => no_output!(gen_incr_counter(asm, counter)), Insn::ObjToString { val, cd, state, .. } => gen_objtostring(jit, asm, opnd!(val), *cd, &function.frame_state(*state)), + &Insn::CheckInterrupts { state } => no_output!(gen_check_interrupts(jit, asm, &function.frame_state(state))), Insn::ArrayExtend { .. } | Insn::ArrayMax { .. } | Insn::ArrayPush { .. } @@ -674,6 +675,17 @@ fn gen_getspecial_number(asm: &mut Assembler, nth: u64, state: &FrameState) -> O asm_ccall!(asm, rb_reg_nth_match, Opnd::Imm((nth >> 1).try_into().unwrap()), backref) } +fn gen_check_interrupts(jit: &mut JITState, asm: &mut Assembler, state: &FrameState) { + // Check for interrupts + // see RUBY_VM_CHECK_INTS(ec) macro + asm_comment!(asm, "RUBY_VM_CHECK_INTS(ec)"); + // Not checking interrupt_mask since it's zero outside finalize_deferred_heap_pages, + // signal_exec, or rb_postponed_job_flush. + let interrupt_flag = asm.load(Opnd::mem(32, EC, RUBY_OFFSET_EC_INTERRUPT_FLAG)); + asm.test(interrupt_flag, interrupt_flag); + asm.jnz(side_exit(jit, state, SideExitReason::Interrupt)); +} + /// Compile an interpreter entry block to be inserted into an ISEQ fn gen_entry_prologue(asm: &mut Assembler, iseq: IseqPtr) { asm_comment!(asm, "ZJIT entry point: {}", iseq_get_location(iseq, 0)); diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index e7aaf64f288eb7..1fdca5a688ac63 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -440,6 +440,7 @@ pub enum SideExitReason { ObjToStringFallback, UnknownSpecialVariable(u64), UnhandledDefinedType(usize), + Interrupt, } impl std::fmt::Display for SideExitReason { @@ -600,6 +601,10 @@ pub enum Insn { /// Increment a counter in ZJIT stats IncrCounter(Counter), + + /// Equivalent of RUBY_VM_CHECK_INTS. Automatically inserted by the compiler before jumps and + /// return instructions. + CheckInterrupts { state: InsnId }, } impl Insn { @@ -610,7 +615,8 @@ impl Insn { | Insn::IfTrue { .. } | Insn::IfFalse { .. } | Insn::Return { .. } | Insn::PatchPoint { .. } | Insn::SetIvar { .. } | Insn::ArrayExtend { .. } | Insn::ArrayPush { .. } | Insn::SideExit { .. } | Insn::SetGlobal { .. } - | Insn::SetLocal { .. } | Insn::Throw { .. } | Insn::IncrCounter(_) => false, + | Insn::SetLocal { .. } | Insn::Throw { .. } | Insn::IncrCounter(_) + | Insn::CheckInterrupts { .. } => false, _ => true, } } @@ -867,6 +873,7 @@ impl<'a> std::fmt::Display for InsnPrinter<'a> { write!(f, ", {val}") } Insn::IncrCounter(counter) => write!(f, "IncrCounter {counter:?}"), + Insn::CheckInterrupts { .. } => write!(f, "CheckInterrupts"), } } } @@ -1292,6 +1299,7 @@ impl Function { &ToNewArray { val, state } => ToNewArray { val: find!(val), state }, &ArrayExtend { left, right, state } => ArrayExtend { left: find!(left), right: find!(right), state }, &ArrayPush { array, val, state } => ArrayPush { array: find!(array), val: find!(val), state }, + &CheckInterrupts { state } => CheckInterrupts { state }, } } @@ -1318,7 +1326,8 @@ impl Function { Insn::SetGlobal { .. } | Insn::Jump(_) | Insn::IfTrue { .. } | Insn::IfFalse { .. } | Insn::Return { .. } | Insn::Throw { .. } | Insn::PatchPoint { .. } | Insn::SetIvar { .. } | Insn::ArrayExtend { .. } - | Insn::ArrayPush { .. } | Insn::SideExit { .. } | Insn::SetLocal { .. } | Insn::IncrCounter(_) => + | Insn::ArrayPush { .. } | Insn::SideExit { .. } | Insn::SetLocal { .. } | Insn::IncrCounter(_) + | Insn::CheckInterrupts { .. } => panic!("Cannot infer type of instruction with no output: {}", self.insns[insn.0]), Insn::Const { val: Const::Value(val) } => Type::from_value(*val), Insn::Const { val: Const::CBool(val) } => Type::from_cbool(*val), @@ -1952,6 +1961,7 @@ impl Function { | &Insn::IncrCounter(_) => {} &Insn::PatchPoint { state, .. } + | &Insn::CheckInterrupts { state } | &Insn::GetConstantPath { ic: _, state } => { worklist.push_back(state); } @@ -3028,10 +3038,11 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result { state.stack_push(fun.push_insn(block, Insn::GetConstantPath { ic, state: snapshot })); } YARVINSN_branchunless => { + let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state }); + 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 }); - // TODO(max): Check interrupts 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::IfFalse { @@ -3041,10 +3052,11 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result { queue.push_back((state.clone(), target, target_idx)); } YARVINSN_branchif => { + let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state }); + 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 }); - // TODO(max): Check interrupts 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::IfTrue { @@ -3054,10 +3066,11 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result { queue.push_back((state.clone(), target, target_idx)); } YARVINSN_branchnil => { + let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state }); + 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 }); - // TODO(max): Check interrupts 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::IfTrue { @@ -3067,8 +3080,9 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result { queue.push_back((state.clone(), target, target_idx)); } YARVINSN_opt_new => { + let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state }); + fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); let offset = get_arg(pc, 1).as_i64(); - // TODO(max): Check interrupts let target_idx = insn_idx_at_offset(insn_idx, offset); let target = insn_idx_to_block[&target_idx]; // Skip the fast-path and go straight to the fallback code. We will let the @@ -3079,7 +3093,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result { } YARVINSN_jump => { let offset = get_arg(pc, 0).as_i64(); - // TODO(max): Check interrupts + let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state }); + 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( @@ -3228,6 +3243,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result { } YARVINSN_leave => { + let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state }); + fun.push_insn(block, Insn::CheckInterrupts { state: exit_id }); fun.push_insn(block, Insn::Return { val: state.stack_pop()? }); break; // Don't enqueue the next block as a successor } @@ -3925,6 +3942,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject): v2:Fixnum[123] = Const Value(123) + CheckInterrupts Return v2 "#]]); } @@ -3936,6 +3954,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject): v3:ArrayExact = NewArray + CheckInterrupts Return v3 "#]]); } @@ -3947,6 +3966,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject, v1:BasicObject): v4:ArrayExact = NewArray v1 + CheckInterrupts Return v4 "#]]); } @@ -3958,6 +3978,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:ArrayExact = NewArray v1, v2 + CheckInterrupts Return v5 "#]]); } @@ -3970,6 +3991,7 @@ mod tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[10] = Const Value(10) v5:RangeExact = NewRange v1 NewRangeInclusive v3 + CheckInterrupts Return v5 "#]]); } @@ -3981,6 +4003,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:RangeExact = NewRange v1 NewRangeInclusive v2 + CheckInterrupts Return v5 "#]]); } @@ -3993,6 +4016,7 @@ mod tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[10] = Const Value(10) v5:RangeExact = NewRange v1 NewRangeExclusive v3 + CheckInterrupts Return v5 "#]]); } @@ -4004,6 +4028,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:RangeExact = NewRange v1 NewRangeExclusive v2 + CheckInterrupts Return v5 "#]]); } @@ -4016,6 +4041,7 @@ mod tests { bb0(v0:BasicObject): v2:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:ArrayExact = ArrayDup v2 + CheckInterrupts Return v4 "#]]); } @@ -4028,6 +4054,7 @@ mod tests { bb0(v0:BasicObject): v2:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:HashExact = HashDup v2 + CheckInterrupts Return v4 "#]]); } @@ -4039,6 +4066,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject): v3:HashExact = NewHash + CheckInterrupts Return v3 "#]]); } @@ -4052,6 +4080,7 @@ mod tests { v4:StaticSymbol[:a] = Const Value(VALUE(0x1000)) v5:StaticSymbol[:b] = Const Value(VALUE(0x1008)) v7:HashExact = NewHash v4: v1, v5: v2 + CheckInterrupts Return v7 "#]]); } @@ -4064,6 +4093,7 @@ mod tests { bb0(v0:BasicObject): v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:StringExact = StringCopy v2 + CheckInterrupts Return v4 "#]]); } @@ -4075,6 +4105,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject): v2:Bignum[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + CheckInterrupts Return v2 "#]]); } @@ -4086,6 +4117,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject): v2:Flonum[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + CheckInterrupts Return v2 "#]]); } @@ -4097,6 +4129,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject): v2:HeapFloat[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + CheckInterrupts Return v2 "#]]); } @@ -4108,6 +4141,7 @@ mod tests { fn test@:1: bb0(v0:BasicObject): v2:StaticSymbol[:foo] = Const Value(VALUE(0x1000)) + CheckInterrupts Return v2 "#]]); } @@ -4121,6 +4155,7 @@ mod tests { v2:Fixnum[1] = Const Value(1) v3:Fixnum[2] = Const Value(2) v5:BasicObject = SendWithoutBlock v2, :+, v3 + CheckInterrupts Return v5 "#]]); } @@ -4135,6 +4170,7 @@ mod tests { bb0(v0:BasicObject): v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:BasicObject = SendWithoutBlock v3, :freeze + CheckInterrupts Return v4 "#]]); } @@ -4149,6 +4185,7 @@ mod tests { bb0(v0:BasicObject): v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:BasicObject = SendWithoutBlock v3, :freeze + CheckInterrupts Return v4 "#]]); } @@ -4163,6 +4200,7 @@ mod tests { bb0(v0:BasicObject): v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:BasicObject = SendWithoutBlock v3, :freeze + CheckInterrupts Return v4 "#]]); } @@ -4177,6 +4215,7 @@ mod tests { bb0(v0:BasicObject): v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:BasicObject = SendWithoutBlock v3, :-@ + CheckInterrupts Return v4 "#]]); } @@ -4194,6 +4233,7 @@ mod tests { bb0(v0:BasicObject): v1:NilClass = Const Value(nil) v3:Fixnum[1] = Const Value(1) + CheckInterrupts Return v3 "#]]); } @@ -4233,6 +4273,7 @@ mod tests { v10:BasicObject = GetLocal l3, EP@5 v12:BasicObject = SendWithoutBlock v9, :+, v10 SetLocal l3, EP@5, v12 + CheckInterrupts Return v12 "#]] ); @@ -4247,6 +4288,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject): v3:BasicObject = DefinedIvar v0, :@foo + CheckInterrupts Return v3 "#]]); } @@ -4265,6 +4307,7 @@ mod tests { v7:NilClass = Const Value(nil) v9:StringExact|NilClass = Defined global-variable, v7 v11:ArrayExact = NewArray v4, v6, v9 + CheckInterrupts Return v11 "#]]); } @@ -4283,13 +4326,16 @@ mod tests { assert_method_hir_with_opcode("test", YARVINSN_leave, expect![[r#" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): - v3:CBool = Test v1 - IfFalse v3, bb1(v0, v1) - v5:Fixnum[3] = Const Value(3) - Return v5 - bb1(v7:BasicObject, v8:BasicObject): - v10:Fixnum[4] = Const Value(4) - Return v10 + CheckInterrupts + v5:CBool = Test v1 + IfFalse v5, bb1(v0, v1) + v7:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v7 + bb1(v11:BasicObject, v12:BasicObject): + v14:Fixnum[4] = Const Value(4) + CheckInterrupts + Return v14 "#]]); } @@ -4309,15 +4355,18 @@ mod tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject): v2:NilClass = Const Value(nil) - v4:CBool = Test v1 - IfFalse v4, bb1(v0, v1, v2) - v6:Fixnum[3] = Const Value(3) - Jump bb2(v0, v1, v6) - bb1(v8:BasicObject, v9:BasicObject, v10:NilClass): - v12:Fixnum[4] = Const Value(4) - Jump bb2(v8, v9, v12) - bb2(v14:BasicObject, v15:BasicObject, v16:Fixnum): - Return v16 + CheckInterrupts + v6:CBool = Test v1 + IfFalse v6, bb1(v0, v1, v2) + v8:Fixnum[3] = Const Value(3) + CheckInterrupts + Jump bb2(v0, v1, v8) + bb1(v12:BasicObject, v13:BasicObject, v14:NilClass): + v16:Fixnum[4] = Const Value(4) + Jump bb2(v12, v13, v16) + bb2(v18:BasicObject, v19:BasicObject, v20:Fixnum): + CheckInterrupts + Return v20 "#]]); } @@ -4331,6 +4380,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :+, v2 + CheckInterrupts Return v5 "#]]); } @@ -4345,6 +4395,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :-, v2 + CheckInterrupts Return v5 "#]]); } @@ -4359,6 +4410,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :*, v2 + CheckInterrupts Return v5 "#]]); } @@ -4373,6 +4425,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :/, v2 + CheckInterrupts Return v5 "#]]); } @@ -4387,6 +4440,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :%, v2 + CheckInterrupts Return v5 "#]]); } @@ -4401,6 +4455,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :==, v2 + CheckInterrupts Return v5 "#]]); } @@ -4415,6 +4470,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :!=, v2 + CheckInterrupts Return v5 "#]]); } @@ -4429,6 +4485,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :<, v2 + CheckInterrupts Return v5 "#]]); } @@ -4443,6 +4500,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :<=, v2 + CheckInterrupts Return v5 "#]]); } @@ -4457,6 +4515,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :>, v2 + CheckInterrupts Return v5 "#]]); } @@ -4482,20 +4541,23 @@ mod tests { v2:NilClass = Const Value(nil) v4:Fixnum[0] = Const Value(0) v5:Fixnum[10] = Const Value(10) + CheckInterrupts Jump bb2(v0, v4, v5) - bb2(v7:BasicObject, v8:BasicObject, v9:BasicObject): - v11:Fixnum[0] = Const Value(0) - v13:BasicObject = SendWithoutBlock v9, :>, v11 - v14:CBool = Test v13 - IfTrue v14, bb1(v7, v8, v9) - v16:NilClass = Const Value(nil) - Return v8 - bb1(v18:BasicObject, v19:BasicObject, v20:BasicObject): - v22:Fixnum[1] = Const Value(1) - v24:BasicObject = SendWithoutBlock v19, :+, v22 - v25:Fixnum[1] = Const Value(1) - v27:BasicObject = SendWithoutBlock v20, :-, v25 - Jump bb2(v18, v24, v27) + bb2(v9:BasicObject, v10:BasicObject, v11:BasicObject): + v13:Fixnum[0] = Const Value(0) + v15:BasicObject = SendWithoutBlock v11, :>, v13 + CheckInterrupts + v18:CBool = Test v15 + IfTrue v18, bb1(v9, v10, v11) + v20:NilClass = Const Value(nil) + CheckInterrupts + Return v10 + bb1(v24:BasicObject, v25:BasicObject, v26:BasicObject): + v28:Fixnum[1] = Const Value(1) + v30:BasicObject = SendWithoutBlock v25, :+, v28 + v31:Fixnum[1] = Const Value(1) + v33:BasicObject = SendWithoutBlock v26, :-, v31 + Jump bb2(v24, v30, v33) "#]]); } @@ -4509,6 +4571,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :>=, v2 + CheckInterrupts Return v5 "#]]); } @@ -4530,13 +4593,16 @@ mod tests { bb0(v0:BasicObject): v1:NilClass = Const Value(nil) v3:TrueClass = Const Value(true) - v4:CBool[true] = Test v3 - IfFalse v4, bb1(v0, v3) - v6:Fixnum[3] = Const Value(3) - Return v6 - bb1(v8, v9): - v11 = Const Value(4) - Return v11 + CheckInterrupts + v6:CBool[true] = Test v3 + IfFalse v6, bb1(v0, v3) + v8:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v8 + bb1(v12, v13): + v15 = Const Value(4) + CheckInterrupts + Return v15 "#]]); } @@ -4556,6 +4622,7 @@ mod tests { v2:Fixnum[2] = Const Value(2) v3:Fixnum[3] = Const Value(3) v5:BasicObject = SendWithoutBlock v0, :bar, v2, v3 + CheckInterrupts Return v5 "#]]); } @@ -4574,6 +4641,7 @@ mod tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject): v4:BasicObject = Send v1, 0x1000, :each + CheckInterrupts Return v4 "#]]); } @@ -4594,6 +4662,7 @@ mod tests { v7:String = AnyToString v3, str: v5 v9:StringExact = StringConcat v2, v7 v11:Symbol = StringIntern v9 + CheckInterrupts Return v11 "#]]); } @@ -4615,6 +4684,7 @@ mod tests { v11:StringExact[VALUE(0x1010)] = Const Value(VALUE(0x1010)) v13:StringExact = StringCopy v11 v15:BasicObject = SendWithoutBlock v0, :unknown_method, v4, v7, v10, v13 + CheckInterrupts Return v15 "#]]); } @@ -4764,12 +4834,14 @@ mod tests { bb0(v0:BasicObject): v3:BasicObject = GetConstantPath 0x1000 v4:NilClass = Const Value(nil) + CheckInterrupts Jump bb1(v0, v4, v3) - bb1(v6:BasicObject, v7:NilClass, v8:BasicObject): - v11:BasicObject = SendWithoutBlock v8, :new - Jump bb2(v6, v11, v7) - bb2(v13:BasicObject, v14:BasicObject, v15:NilClass): - Return v14 + bb1(v8:BasicObject, v9:NilClass, v10:BasicObject): + v13:BasicObject = SendWithoutBlock v10, :new + Jump bb2(v8, v13, v9) + bb2(v15:BasicObject, v16:BasicObject, v17:NilClass): + CheckInterrupts + Return v16 "#]]); } @@ -4784,6 +4856,7 @@ mod tests { bb0(v0:BasicObject): PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_MAX) v4:BasicObject = ArrayMax + CheckInterrupts Return v4 "#]]); } @@ -4798,6 +4871,7 @@ mod tests { bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_MAX) v6:BasicObject = ArrayMax v1, v2 + CheckInterrupts Return v6 "#]]); } @@ -4896,6 +4970,7 @@ mod tests { bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:ArrayExact = NewArray v1, v2 v7:BasicObject = SendWithoutBlock v5, :length + CheckInterrupts Return v7 "#]]); } @@ -4910,6 +4985,7 @@ mod tests { bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:ArrayExact = NewArray v1, v2 v7:BasicObject = SendWithoutBlock v5, :size + CheckInterrupts Return v7 "#]]); } @@ -4924,6 +5000,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject): v3:BasicObject = GetIvar v0, :@foo + CheckInterrupts Return v3 "#]]); } @@ -4939,6 +5016,7 @@ mod tests { bb0(v0:BasicObject): v2:Fixnum[1] = Const Value(1) SetIvar v0, :@foo, v2 + CheckInterrupts Return v2 "#]]); } @@ -4954,6 +5032,7 @@ mod tests { bb0(v0:BasicObject): v2:Fixnum[1] = Const Value(1) SetGlobal :$foo, v2 + CheckInterrupts Return v2 "#]]); } @@ -4968,6 +5047,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject): v3:BasicObject = GetGlobal :$foo + CheckInterrupts Return v3 "#]]); } @@ -4981,6 +5061,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): v4:ArrayExact = ToNewArray v1 + CheckInterrupts Return v4 "#]]); } @@ -4997,6 +5078,7 @@ mod tests { v5:ArrayExact = NewArray v3 v7:ArrayExact = ToArray v1 ArrayExtend v5, v7 + CheckInterrupts Return v5 "#]]); } @@ -5012,6 +5094,7 @@ mod tests { v4:ArrayExact = ToNewArray v1 v5:Fixnum[1] = Const Value(1) ArrayPush v4, v5 + CheckInterrupts Return v4 "#]]); } @@ -5031,6 +5114,7 @@ mod tests { ArrayPush v4, v5 ArrayPush v4, v6 ArrayPush v4, v7 + CheckInterrupts Return v4 "#]]); } @@ -5046,6 +5130,7 @@ mod tests { v4:NilClass = Const Value(nil) v5:Fixnum[1] = Const Value(1) v7:BasicObject = SendWithoutBlock v1, :[]=, v2, v5 + CheckInterrupts Return v5 "#]]); } @@ -5059,6 +5144,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :[], v2 + CheckInterrupts Return v5 "#]]); } @@ -5073,6 +5159,7 @@ mod tests { bb0(v0:BasicObject, v1:BasicObject): v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v5:BasicObject = SendWithoutBlock v1, :[], v3 + CheckInterrupts Return v5 "#]]); } @@ -5086,6 +5173,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): v4:BasicObject = SendWithoutBlock v1, :empty? + CheckInterrupts Return v4 "#]]); } @@ -5099,6 +5187,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): v4:BasicObject = SendWithoutBlock v1, :succ + CheckInterrupts Return v4 "#]]); } @@ -5112,6 +5201,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :&, v2 + CheckInterrupts Return v5 "#]]); } @@ -5125,6 +5215,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :|, v2 + CheckInterrupts Return v5 "#]]); } @@ -5138,6 +5229,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): v4:BasicObject = SendWithoutBlock v1, :! + CheckInterrupts Return v4 "#]]); } @@ -5151,6 +5243,7 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :=~, v2 + CheckInterrupts Return v5 "#]]); } @@ -5172,6 +5265,7 @@ mod tests { v4:StaticSymbol[:aliased] = Const Value(VALUE(0x1008)) v5:StaticSymbol[:__callee__] = Const Value(VALUE(0x1010)) v7:BasicObject = SendWithoutBlock v2, :core#set_method_alias, v3, v4, v5 + CheckInterrupts Return v7 "#]]); } @@ -5199,6 +5293,7 @@ mod tests { v8:BasicObject = GetIvar v0, :@b v10:BasicObject = GetIvar v0, :@c v12:ArrayExact = NewArray v6, v8, v10 + CheckInterrupts Return v12 "#]]); assert_method_hir_with_opcode("reverse_even", YARVINSN_opt_reverse, expect![[r#" @@ -5213,6 +5308,7 @@ mod tests { v11:BasicObject = GetIvar v0, :@c v13:BasicObject = GetIvar v0, :@d v15:ArrayExact = NewArray v7, v9, v11, v13 + CheckInterrupts Return v15 "#]]); } @@ -5225,12 +5321,14 @@ mod tests { assert_method_hir_with_opcode("test", YARVINSN_branchnil, expect![[r#" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:CBool = IsNil v1 - IfTrue v3, bb1(v0, v1, v1) - v6:BasicObject = SendWithoutBlock v1, :itself - Jump bb1(v0, v1, v6) - bb1(v8:BasicObject, v9:BasicObject, v10:BasicObject): - Return v10 + CheckInterrupts + v5:CBool = IsNil v1 + IfTrue v5, bb1(v0, v1, v1) + v8:BasicObject = SendWithoutBlock v1, :itself + Jump bb1(v0, v1, v8) + bb1(v10:BasicObject, v11:BasicObject, v12:BasicObject): + CheckInterrupts + Return v12 "#]]); } @@ -5242,6 +5340,7 @@ mod tests { v6:Float = InvokeBuiltin rb_f_float, v0, v1, v2 Jump bb1(v0, v1, v2, v3, v6) bb1(v8:BasicObject, v9:BasicObject, v10:BasicObject, v11:BasicObject, v12:Float): + CheckInterrupts Return v12 "#]]); } @@ -5254,6 +5353,7 @@ mod tests { v3:Class = InvokeBuiltin _bi20, v0 Jump bb1(v0, v3) bb1(v5:BasicObject, v6:Class): + CheckInterrupts Return v6 "#]]); } @@ -5284,6 +5384,7 @@ mod tests { v3:BasicObject = InvokeBuiltin gc_enable, v0 Jump bb1(v0, v3) bb1(v5:BasicObject, v6:BasicObject): + CheckInterrupts Return v6 "#]]); } @@ -5298,6 +5399,7 @@ mod tests { bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject, v3:BasicObject, v4:BasicObject): v6:FalseClass = Const Value(false) v8:BasicObject = InvokeBuiltin gc_start_internal, v0, v1, v2, v3, v6 + CheckInterrupts Return v8 "#]]); } @@ -5314,13 +5416,16 @@ mod tests { v4:Fixnum[0] = Const Value(0) v5:Fixnum[1] = Const Value(1) v7:BasicObject = SendWithoutBlock v1, :[], v4, v5 - v8:CBool = Test v7 - IfTrue v8, bb1(v0, v1, v3, v1, v4, v5, v7) - v10:Fixnum[2] = Const Value(2) - v12:BasicObject = SendWithoutBlock v1, :[]=, v4, v5, v10 - Return v10 - bb1(v14:BasicObject, v15:BasicObject, v16:NilClass, v17:BasicObject, v18:Fixnum[0], v19:Fixnum[1], v20:BasicObject): - Return v20 + CheckInterrupts + v10:CBool = Test v7 + IfTrue v10, bb1(v0, v1, v3, v1, v4, v5, v7) + v12:Fixnum[2] = Const Value(2) + v14:BasicObject = SendWithoutBlock v1, :[]=, v4, v5, v12 + CheckInterrupts + Return v12 + bb1(v18:BasicObject, v19:BasicObject, v20:NilClass, v21:BasicObject, v22:Fixnum[0], v23:Fixnum[1], v24:BasicObject): + CheckInterrupts + Return v24 "#]]); } @@ -5337,6 +5442,7 @@ mod tests { v5:BasicObject = ObjToString v3 v7:String = AnyToString v3, str: v5 v9:StringExact = StringConcat v2, v7 + CheckInterrupts Return v9 "#]]); } @@ -5359,6 +5465,7 @@ mod tests { v14:BasicObject = ObjToString v12 v16:String = AnyToString v12, str: v14 v18:StringExact = StringConcat v6, v11, v16 + CheckInterrupts Return v18 "#]]); } @@ -5376,6 +5483,7 @@ mod tests { v5:BasicObject = ObjToString v3 v7:String = AnyToString v3, str: v5 v9:StringExact = StringConcat v2, v7 + CheckInterrupts Return v9 "#]]); } @@ -5398,6 +5506,7 @@ mod tests { v14:BasicObject = ObjToString v12 v16:String = AnyToString v12, str: v14 v18:RegexpExact = ToRegexp v6, v11, v16 + CheckInterrupts Return v18 "#]]); } @@ -5417,6 +5526,7 @@ mod tests { v9:BasicObject = ObjToString v7 v11:String = AnyToString v7, str: v9 v13:RegexpExact = ToRegexp v6, v11, MULTILINE|IGNORECASE|EXTENDED|NOENCODING + CheckInterrupts Return v13 "#]]); } @@ -5471,11 +5581,12 @@ mod graphviz_tests { mode=hier; overlap=false; splines=true; bb0 [label=< - - - - - + + + + + +
bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject) 
PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, 29) 
v8:Fixnum = GuardType v1, Fixnum 
v9:Fixnum = GuardType v2, Fixnum 
v10:Fixnum = FixnumOr v8, v9 
Return v10 
PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, 29) 
v10:Fixnum = GuardType v1, Fixnum 
v11:Fixnum = GuardType v2, Fixnum 
v12:Fixnum = FixnumOr v10, v11 
CheckInterrupts 
Return v12 
>]; } "#]]); @@ -5501,16 +5612,19 @@ mod graphviz_tests { mode=hier; overlap=false; splines=true; bb0 [label=< - - - - + + + + + +
bb0(v0:BasicObject, v1:BasicObject) 
v3:CBool = Test v1 
IfFalse v3, bb1(v0, v1) 
v5:Fixnum[3] = Const Value(3) 
Return v5 
CheckInterrupts 
v5:CBool = Test v1 
IfFalse v5, bb1(v0, v1) 
v7:Fixnum[3] = Const Value(3) 
CheckInterrupts 
Return v7 
>]; - bb0:v4 -> bb1:params; + bb0:v6 -> bb1:params; bb1 [label=< - - - + + + +
bb1(v7:BasicObject, v8:BasicObject) 
v10:Fixnum[4] = Const Value(4) 
Return v10 
bb1(v11:BasicObject, v12:BasicObject) 
v14:Fixnum[4] = Const Value(4) 
CheckInterrupts 
Return v14 
>]; } "#]]); @@ -5548,8 +5662,11 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject): - v6:Fixnum[3] = Const Value(3) - Return v6 + v3:TrueClass = Const Value(true) + CheckInterrupts + v8:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v8 "#]]); } @@ -5568,8 +5685,11 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject): - v11:Fixnum[4] = Const Value(4) - Return v11 + v3:FalseClass = Const Value(false) + CheckInterrupts + v15:Fixnum[4] = Const Value(4) + CheckInterrupts + Return v15 "#]]); } @@ -5586,11 +5706,12 @@ mod opt_tests { v2:Fixnum[1] = Const Value(1) v3:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v14:Fixnum[3] = Const Value(3) + v16:Fixnum[3] = Const Value(3) v6:Fixnum[3] = Const Value(3) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v15:Fixnum[6] = Const Value(6) - Return v15 + v17:Fixnum[6] = Const Value(6) + CheckInterrupts + Return v17 "#]]); } @@ -5607,11 +5728,12 @@ mod opt_tests { v2:Fixnum[5] = Const Value(5) v3:Fixnum[3] = Const Value(3) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MINUS) - v14:Fixnum[2] = Const Value(2) + v16:Fixnum[2] = Const Value(2) v6:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MINUS) - v15:Fixnum[1] = Const Value(1) - Return v15 + v17:Fixnum[1] = Const Value(1) + CheckInterrupts + Return v17 "#]]); } @@ -5628,8 +5750,9 @@ mod opt_tests { v2:Fixnum[0] = Const Value(0) v3:Fixnum[1073741825] = Const Value(1073741825) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MINUS) - v9:Fixnum[-1073741825] = Const Value(-1073741825) - Return v9 + v11:Fixnum[-1073741825] = Const Value(-1073741825) + CheckInterrupts + Return v11 "#]]); } @@ -5646,8 +5769,9 @@ mod opt_tests { v2:Fixnum[6] = Const Value(6) v3:Fixnum[7] = Const Value(7) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v9:Fixnum[42] = Const Value(42) - Return v9 + v11:Fixnum[42] = Const Value(42) + CheckInterrupts + Return v11 "#]]); } @@ -5664,15 +5788,16 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[0] = Const Value(0) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v13:Fixnum = GuardType v1, Fixnum - v20:Fixnum[0] = Const Value(0) + v15:Fixnum = GuardType v1, Fixnum + v22:Fixnum[0] = Const Value(0) v6:Fixnum[0] = Const Value(0) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v16:Fixnum = GuardType v1, Fixnum - v21:Fixnum[0] = Const Value(0) + v18:Fixnum = GuardType v1, Fixnum + v23:Fixnum[0] = Const Value(0) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v22:Fixnum[0] = Const Value(0) - Return v22 + v24:Fixnum[0] = Const Value(0) + CheckInterrupts + Return v24 "#]]); } @@ -5693,8 +5818,11 @@ mod opt_tests { v2:Fixnum[1] = Const Value(1) v3:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v8:Fixnum[3] = Const Value(3) - Return v8 + v22:TrueClass = Const Value(true) + CheckInterrupts + v10:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v10 "#]]); } @@ -5715,11 +5843,16 @@ mod opt_tests { v2:Fixnum[1] = Const Value(1) v3:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LE) - v8:Fixnum[2] = Const Value(2) - v9:Fixnum[2] = Const Value(2) + v32:TrueClass = Const Value(true) + CheckInterrupts + v10:Fixnum[2] = Const Value(2) + v11:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LE) - v14:Fixnum[3] = Const Value(3) - Return v14 + v34:TrueClass = Const Value(true) + CheckInterrupts + v18:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v18 "#]]); } @@ -5740,8 +5873,11 @@ mod opt_tests { v2:Fixnum[2] = Const Value(2) v3:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GT) - v8:Fixnum[3] = Const Value(3) - Return v8 + v22:TrueClass = Const Value(true) + CheckInterrupts + v10:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v10 "#]]); } @@ -5762,11 +5898,16 @@ mod opt_tests { v2:Fixnum[2] = Const Value(2) v3:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GE) - v8:Fixnum[2] = Const Value(2) - v9:Fixnum[2] = Const Value(2) + v32:TrueClass = Const Value(true) + CheckInterrupts + v10:Fixnum[2] = Const Value(2) + v11:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GE) - v14:Fixnum[3] = Const Value(3) - Return v14 + v34:TrueClass = Const Value(true) + CheckInterrupts + v18:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v18 "#]]); } @@ -5787,8 +5928,11 @@ mod opt_tests { v2:Fixnum[1] = Const Value(1) v3:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) - v12:Fixnum[4] = Const Value(4) - Return v12 + v22:FalseClass = Const Value(false) + CheckInterrupts + v16:Fixnum[4] = Const Value(4) + CheckInterrupts + Return v16 "#]]); } @@ -5809,8 +5953,11 @@ mod opt_tests { v2:Fixnum[2] = Const Value(2) v3:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) - v8:Fixnum[3] = Const Value(3) - Return v8 + v22:TrueClass = Const Value(true) + CheckInterrupts + v10:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v10 "#]]); } @@ -5832,8 +5979,11 @@ mod opt_tests { v3:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_NEQ) - v8:Fixnum[3] = Const Value(3) - Return v8 + v23:TrueClass = Const Value(true) + CheckInterrupts + v10:Fixnum[3] = Const Value(3) + CheckInterrupts + Return v10 "#]]); } @@ -5855,8 +6005,11 @@ mod opt_tests { v3:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_NEQ) - v12:Fixnum[4] = Const Value(4) - Return v12 + v23:FalseClass = Const Value(false) + CheckInterrupts + v16:Fixnum[4] = Const Value(4) + CheckInterrupts + Return v16 "#]]); } @@ -5873,9 +6026,10 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v8:Fixnum = GuardType v1, Fixnum - v9:Fixnum = FixnumAdd v8, v3 - Return v9 + v10:Fixnum = GuardType v1, Fixnum + v11:Fixnum = FixnumAdd v10, v3 + CheckInterrupts + Return v11 "#]]); } @@ -5892,28 +6046,33 @@ mod opt_tests { assert_optimized_method_hir("rest", expect![[r#" fn rest@:2: bb0(v0:BasicObject, v1:ArrayExact): + CheckInterrupts Return v1 "#]]); // extra hidden param for the set of specified keywords assert_optimized_method_hir("kw", expect![[r#" fn kw@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): + CheckInterrupts Return v1 "#]]); assert_optimized_method_hir("kw_rest", expect![[r#" fn kw_rest@:4: bb0(v0:BasicObject, v1:BasicObject): + CheckInterrupts Return v1 "#]]); assert_optimized_method_hir("block", expect![[r#" fn block@:6: bb0(v0:BasicObject, v1:BasicObject): v3:NilClass = Const Value(nil) + CheckInterrupts Return v3 "#]]); assert_optimized_method_hir("post", expect![[r#" fn post@:5: bb0(v0:BasicObject, v1:ArrayExact, v2:BasicObject): + CheckInterrupts Return v2 "#]]); } @@ -5932,9 +6091,10 @@ mod opt_tests { fn test@:5: bb0(v0:BasicObject): PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v6:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v7:BasicObject = SendWithoutBlockDirect v6, :foo (0x1038) - Return v7 + v8:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v9:BasicObject = SendWithoutBlockDirect v8, :foo (0x1038) + CheckInterrupts + Return v9 "#]]); } @@ -5953,6 +6113,7 @@ mod opt_tests { fn test@:5: bb0(v0:BasicObject): v3:BasicObject = SendWithoutBlock v0, :foo + CheckInterrupts Return v3 "#]]); } @@ -5972,9 +6133,10 @@ mod opt_tests { fn test@:6: bb0(v0:BasicObject): PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v6:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v7:BasicObject = SendWithoutBlockDirect v6, :foo (0x1038) - Return v7 + v8:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v9:BasicObject = SendWithoutBlockDirect v8, :foo (0x1038) + CheckInterrupts + Return v9 "#]]); } @@ -5991,9 +6153,10 @@ mod opt_tests { bb0(v0:BasicObject): v2:Fixnum[3] = Const Value(3) PatchPoint MethodRedefined(Object@0x1000, Integer@0x1008, cme:0x1010) - v7:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v8:BasicObject = SendWithoutBlockDirect v7, :Integer (0x1038), v2 - Return v8 + v9:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v10:BasicObject = SendWithoutBlockDirect v9, :Integer (0x1038), v2 + CheckInterrupts + Return v10 "#]]); } @@ -6013,9 +6176,10 @@ mod opt_tests { v2:Fixnum[1] = Const Value(1) v3:Fixnum[2] = Const Value(2) PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v8:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v9:BasicObject = SendWithoutBlockDirect v8, :foo (0x1038), v2, v3 - Return v9 + v10:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v11:BasicObject = SendWithoutBlockDirect v10, :foo (0x1038), v2, v3 + CheckInterrupts + Return v11 "#]]); } @@ -6036,12 +6200,13 @@ mod opt_tests { fn test@:7: bb0(v0:BasicObject): PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v8:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v9:BasicObject = SendWithoutBlockDirect v8, :foo (0x1038) + v10:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v11:BasicObject = SendWithoutBlockDirect v10, :foo (0x1038) PatchPoint MethodRedefined(Object@0x1000, bar@0x1040, cme:0x1048) - v11:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v12:BasicObject = SendWithoutBlockDirect v11, :bar (0x1038) - Return v12 + v13:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v14:BasicObject = SendWithoutBlockDirect v13, :bar (0x1038) + CheckInterrupts + Return v14 "#]]); } @@ -6060,6 +6225,7 @@ mod opt_tests { fn test@:7: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:BasicObject = SendWithoutBlock v1, :+, v2 + CheckInterrupts Return v5 "#]]); } @@ -6074,10 +6240,11 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v8:Fixnum = GuardType v1, Fixnum - v9:Fixnum = GuardType v2, Fixnum - v10:Fixnum = FixnumAdd v8, v9 - Return v10 + v10:Fixnum = GuardType v1, Fixnum + v11:Fixnum = GuardType v2, Fixnum + v12:Fixnum = FixnumAdd v10, v11 + CheckInterrupts + Return v12 "#]]); } @@ -6092,9 +6259,10 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v8:Fixnum = GuardType v1, Fixnum - v9:Fixnum = FixnumAdd v8, v3 - Return v9 + v10:Fixnum = GuardType v1, Fixnum + v11:Fixnum = FixnumAdd v10, v3 + CheckInterrupts + Return v11 "#]]); } @@ -6109,9 +6277,10 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v8:Fixnum = GuardType v1, Fixnum - v9:Fixnum = FixnumAdd v3, v8 - Return v9 + v10:Fixnum = GuardType v1, Fixnum + v11:Fixnum = FixnumAdd v3, v10 + CheckInterrupts + Return v11 "#]]); } @@ -6125,10 +6294,11 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v8:Fixnum = GuardType v1, Fixnum - v9:Fixnum = GuardType v2, Fixnum - v10:BoolExact = FixnumLt v8, v9 - Return v10 + v10:Fixnum = GuardType v1, Fixnum + v11:Fixnum = GuardType v2, Fixnum + v12:BoolExact = FixnumLt v10, v11 + CheckInterrupts + Return v12 "#]]); } @@ -6143,9 +6313,10 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v8:Fixnum = GuardType v1, Fixnum - v9:BoolExact = FixnumLt v8, v3 - Return v9 + v10:Fixnum = GuardType v1, Fixnum + v11:BoolExact = FixnumLt v10, v3 + CheckInterrupts + Return v11 "#]]); } @@ -6160,9 +6331,10 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v8:Fixnum = GuardType v1, Fixnum - v9:BoolExact = FixnumLt v3, v8 - Return v9 + v10:Fixnum = GuardType v1, Fixnum + v11:BoolExact = FixnumLt v3, v10 + CheckInterrupts + Return v11 "#]]); } @@ -6178,7 +6350,10 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject): + v1:NilClass = Const Value(nil) + v4:ArrayExact = NewArray v5:Fixnum[5] = Const Value(5) + CheckInterrupts Return v5 "#]]); } @@ -6195,7 +6370,9 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject): + v3:RangeExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:Fixnum[5] = Const Value(5) + CheckInterrupts Return v4 "#]]); } @@ -6219,6 +6396,7 @@ mod opt_tests { v8:StringExact = StringCopy v6 v10:RangeExact = NewRange v4 NewRangeInclusive v8 v11:Fixnum[0] = Const Value(0) + CheckInterrupts Return v11 "#]]); } @@ -6235,7 +6413,10 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): + v2:NilClass = Const Value(nil) + v5:ArrayExact = NewArray v1 v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6251,7 +6432,10 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject): + v1:NilClass = Const Value(nil) + v4:HashExact = NewHash v5:Fixnum[5] = Const Value(5) + CheckInterrupts Return v5 "#]]); } @@ -6272,6 +6456,7 @@ mod opt_tests { v6:StaticSymbol[:b] = Const Value(VALUE(0x1008)) v8:HashExact = NewHash v5: v1, v6: v2 v9:Fixnum[5] = Const Value(5) + CheckInterrupts Return v9 "#]]); } @@ -6288,7 +6473,11 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject): + v1:NilClass = Const Value(nil) + v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:ArrayExact = ArrayDup v3 v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6304,7 +6493,11 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject): + v1:NilClass = Const Value(nil) + v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:HashExact = HashDup v3 v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6322,6 +6515,7 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v3:Fixnum[5] = Const Value(5) + CheckInterrupts Return v3 "#]]); } @@ -6338,7 +6532,11 @@ mod opt_tests { assert_optimized_method_hir("test", expect![[r#" fn test@:3: bb0(v0:BasicObject): + v1:NilClass = Const Value(nil) + v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:StringExact = StringCopy v3 v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6356,9 +6554,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6376,9 +6575,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MINUS) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6396,9 +6596,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6416,10 +6617,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_DIV) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum - v11:Fixnum = FixnumDiv v9, v10 + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum + v13:Fixnum = FixnumDiv v11, v12 v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6437,10 +6639,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MOD) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum - v11:Fixnum = FixnumMod v9, v10 + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum + v13:Fixnum = FixnumMod v11, v12 v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6458,9 +6661,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6478,9 +6682,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LE) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6498,9 +6703,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GT) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6518,9 +6724,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GE) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6538,9 +6745,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) - v9:Fixnum = GuardType v1, Fixnum - v10:Fixnum = GuardType v2, Fixnum + v11:Fixnum = GuardType v1, Fixnum + v12:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6559,9 +6767,10 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_NEQ) - v10:Fixnum = GuardType v1, Fixnum - v11:Fixnum = GuardType v2, Fixnum + v12:Fixnum = GuardType v1, Fixnum + v13:Fixnum = GuardType v2, Fixnum v6:Fixnum[5] = Const Value(5) + CheckInterrupts Return v6 "#]]); } @@ -6579,6 +6788,7 @@ mod opt_tests { bb0(v0:BasicObject): v3:BasicObject = GetConstantPath 0x1000 v4:Fixnum[5] = Const Value(5) + CheckInterrupts Return v4 "#]]); } @@ -6594,9 +6804,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Integer@0x1000, itself@0x1008, cme:0x1010) - v7:Fixnum = GuardType v1, Fixnum - v8:BasicObject = CCall itself@0x1038, v7 - Return v8 + v9:Fixnum = GuardType v1, Fixnum + v10:BasicObject = CCall itself@0x1038, v9 + CheckInterrupts + Return v10 "#]]); } @@ -6610,8 +6821,9 @@ mod opt_tests { bb0(v0:BasicObject): v3:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, itself@0x1008, cme:0x1010) - v8:BasicObject = CCall itself@0x1038, v3 - Return v8 + v10:BasicObject = CCall itself@0x1038, v3 + CheckInterrupts + Return v10 "#]]); } @@ -6629,7 +6841,9 @@ mod opt_tests { v1:NilClass = Const Value(nil) v4:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, itself@0x1008, cme:0x1010) + v12:BasicObject = CCall itself@0x1038, v4 v7:Fixnum[1] = Const Value(1) + CheckInterrupts Return v7 "#]]); } @@ -6650,9 +6864,11 @@ mod opt_tests { v1:NilClass = Const Value(nil) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, M) - v11:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v13:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(Module@0x1010, name@0x1018, cme:0x1020) + v15:StringExact|NilClass = CCall name@0x1048, v13 v7:Fixnum[1] = Const Value(1) + CheckInterrupts Return v7 "#]]); } @@ -6671,7 +6887,9 @@ mod opt_tests { v1:NilClass = Const Value(nil) v4:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, length@0x1008, cme:0x1010) + v12:Fixnum = CCall length@0x1038, v4 v7:Fixnum[5] = Const Value(5) + CheckInterrupts Return v7 "#]]); } @@ -6688,8 +6906,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, C) - v7:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - Return v7 + v9:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + CheckInterrupts + Return v9 "#]]); } @@ -6704,17 +6923,18 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, String) - v15:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v17:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1010, Class) - v18:Class[VALUE(0x1018)] = Const Value(VALUE(0x1018)) + v20:Class[VALUE(0x1018)] = Const Value(VALUE(0x1018)) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1020, Module) - v21:Class[VALUE(0x1028)] = Const Value(VALUE(0x1028)) + v23:Class[VALUE(0x1028)] = Const Value(VALUE(0x1028)) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1030, BasicObject) - v24:Class[VALUE(0x1038)] = Const Value(VALUE(0x1038)) - v11:ArrayExact = NewArray v15, v18, v21, v24 + v26:Class[VALUE(0x1038)] = Const Value(VALUE(0x1038)) + v11:ArrayExact = NewArray v17, v20, v23, v26 + CheckInterrupts Return v11 "#]]); } @@ -6730,11 +6950,12 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, Enumerable) - v11:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v13:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1010, Kernel) - v14:ModuleExact[VALUE(0x1018)] = Const Value(VALUE(0x1018)) - v7:ArrayExact = NewArray v11, v14 + v16:ModuleExact[VALUE(0x1018)] = Const Value(VALUE(0x1018)) + v7:ArrayExact = NewArray v13, v16 + CheckInterrupts Return v7 "#]]); } @@ -6752,8 +6973,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, MY_MODULE) - v7:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - Return v7 + v9:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + CheckInterrupts + Return v9 "#]]); } @@ -6771,7 +6993,9 @@ mod opt_tests { v1:NilClass = Const Value(nil) v4:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, size@0x1008, cme:0x1010) + v12:Fixnum = CCall size@0x1038, v4 v7:Fixnum[5] = Const Value(5) + CheckInterrupts Return v7 "#]]); } @@ -6790,6 +7014,7 @@ mod opt_tests { v2:Fixnum[1] = Const Value(1) v3:Fixnum[0] = Const Value(0) v5:BasicObject = SendWithoutBlock v2, :itself, v3 + CheckInterrupts Return v5 "#]]); } @@ -6804,8 +7029,9 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Integer@0x1000, zero?@0x1008, cme:0x1010) - v8:BasicObject = SendWithoutBlockDirect v3, :zero? (0x1038) - Return v8 + v10:BasicObject = SendWithoutBlockDirect v3, :zero? (0x1038) + CheckInterrupts + Return v10 "#]]); } @@ -6824,8 +7050,9 @@ mod opt_tests { v4:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v6:ArrayExact = ArrayDup v4 PatchPoint MethodRedefined(Array@0x1008, first@0x1010, cme:0x1018) - v11:BasicObject = SendWithoutBlockDirect v6, :first (0x1040) - Return v11 + v13:BasicObject = SendWithoutBlockDirect v6, :first (0x1040) + CheckInterrupts + Return v13 "#]]); } @@ -6842,10 +7069,11 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, M) - v9:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v11:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(Module@0x1010, class@0x1018, cme:0x1020) - v11:BasicObject = SendWithoutBlockDirect v9, :class (0x1048) - Return v11 + v13:BasicObject = SendWithoutBlockDirect v11, :class (0x1048) + CheckInterrupts + Return v13 "#]]); } @@ -6868,9 +7096,10 @@ mod opt_tests { fn test@:8: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(C@0x1000, foo@0x1008, cme:0x1010) - v7:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v8:BasicObject = SendWithoutBlockDirect v7, :foo (0x1038) - Return v8 + v9:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v10:BasicObject = SendWithoutBlockDirect v9, :foo (0x1038) + CheckInterrupts + Return v10 "#]]); } @@ -6887,6 +7116,7 @@ mod opt_tests { bb0(v0:BasicObject): v2:Fixnum[1] = Const Value(1) v4:BasicObject = SendWithoutBlock v0, :foo, v2 + CheckInterrupts Return v4 "#]]); } @@ -6903,6 +7133,7 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v3:BasicObject = Send v0, 0x1000, :foo + CheckInterrupts Return v3 "#]]); } @@ -6920,6 +7151,7 @@ mod opt_tests { bb0(v0:BasicObject): v2:Fixnum[1] = Const Value(1) v4:BasicObject = SendWithoutBlock v0, :foo, v2 + CheckInterrupts Return v4 "#]]); } @@ -6969,8 +7201,9 @@ mod opt_tests { v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:StringExact = StringCopy v2 PatchPoint MethodRedefined(String@0x1008, bytesize@0x1010, cme:0x1018) - v9:Fixnum = CCall bytesize@0x1040, v4 - Return v9 + v11:Fixnum = CCall bytesize@0x1040, v4 + CheckInterrupts + Return v11 "#]]); } @@ -6983,6 +7216,7 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject): v3:BasicObject = GetConstantPath 0x1000 + CheckInterrupts Return v3 "#]]); } @@ -6998,6 +7232,7 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject): v3:BasicObject = GetConstantPath 0x1000 + CheckInterrupts Return v3 "#]]); } @@ -7013,8 +7248,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, Kernel) - v7:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - Return v7 + v9:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + CheckInterrupts + Return v9 "#]]); } @@ -7035,8 +7271,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, Foo::Bar::C) - v7:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - Return v7 + v9:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + CheckInterrupts + Return v9 "#]]); } @@ -7052,10 +7289,12 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, C) - v20:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v24:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) v4:NilClass = Const Value(nil) - v11:BasicObject = SendWithoutBlock v20, :new - Return v11 + CheckInterrupts + v13:BasicObject = SendWithoutBlock v24, :new + CheckInterrupts + Return v13 "#]]); } @@ -7075,11 +7314,13 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, C) - v22:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v26:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) v4:NilClass = Const Value(nil) v5:Fixnum[1] = Const Value(1) - v13:BasicObject = SendWithoutBlock v22, :new, v5 - Return v13 + CheckInterrupts + v15:BasicObject = SendWithoutBlock v26, :new, v5 + CheckInterrupts + Return v15 "#]]); } @@ -7093,8 +7334,9 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:ArrayExact = NewArray v1, v2 PatchPoint MethodRedefined(Array@0x1000, length@0x1008, cme:0x1010) - v10:Fixnum = CCall length@0x1038, v5 - Return v10 + v12:Fixnum = CCall length@0x1038, v5 + CheckInterrupts + Return v12 "#]]); } @@ -7108,8 +7350,9 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v5:ArrayExact = NewArray v1, v2 PatchPoint MethodRedefined(Array@0x1000, size@0x1008, cme:0x1010) - v10:Fixnum = CCall size@0x1038, v5 - Return v10 + v12:Fixnum = CCall size@0x1038, v5 + CheckInterrupts + Return v12 "#]]); } @@ -7122,6 +7365,7 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject): v3:BasicObject = GetIvar v0, :@foo + CheckInterrupts Return v3 "#]]); } @@ -7136,6 +7380,7 @@ mod opt_tests { bb0(v0:BasicObject): v2:Fixnum[1] = Const Value(1) SetIvar v0, :@foo, v2 + CheckInterrupts Return v2 "#]]); } @@ -7150,6 +7395,7 @@ mod opt_tests { bb0(v0:BasicObject): v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(HASH_REDEFINED_OP_FLAG, BOP_FREEZE) + CheckInterrupts Return v3 "#]]); } @@ -7167,6 +7413,7 @@ mod opt_tests { bb0(v0:BasicObject): v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:BasicObject = SendWithoutBlock v3, :freeze + CheckInterrupts Return v4 "#]]); } @@ -7182,6 +7429,7 @@ mod opt_tests { v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(HASH_REDEFINED_OP_FLAG, BOP_FREEZE) PatchPoint BOPRedefined(HASH_REDEFINED_OP_FLAG, BOP_FREEZE) + CheckInterrupts Return v3 "#]]); } @@ -7197,6 +7445,7 @@ mod opt_tests { v3:HashExact = NewHash v5:BasicObject = SendWithoutBlock v3, :dup v7:BasicObject = SendWithoutBlock v5, :freeze + CheckInterrupts Return v7 "#]]); } @@ -7212,6 +7461,7 @@ mod opt_tests { v3:HashExact = NewHash v4:NilClass = Const Value(nil) v6:BasicObject = SendWithoutBlock v3, :freeze, v4 + CheckInterrupts Return v6 "#]]); } @@ -7226,6 +7476,7 @@ mod opt_tests { bb0(v0:BasicObject): v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) + CheckInterrupts Return v3 "#]]); } @@ -7241,6 +7492,7 @@ mod opt_tests { v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) + CheckInterrupts Return v3 "#]]); } @@ -7256,6 +7508,7 @@ mod opt_tests { v3:ArrayExact = NewArray v5:BasicObject = SendWithoutBlock v3, :dup v7:BasicObject = SendWithoutBlock v5, :freeze + CheckInterrupts Return v7 "#]]); } @@ -7271,6 +7524,7 @@ mod opt_tests { v3:ArrayExact = NewArray v4:NilClass = Const Value(nil) v6:BasicObject = SendWithoutBlock v3, :freeze, v4 + CheckInterrupts Return v6 "#]]); } @@ -7285,6 +7539,7 @@ mod opt_tests { bb0(v0:BasicObject): v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_FREEZE) + CheckInterrupts Return v3 "#]]); } @@ -7300,6 +7555,7 @@ mod opt_tests { v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_FREEZE) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_FREEZE) + CheckInterrupts Return v3 "#]]); } @@ -7316,6 +7572,7 @@ mod opt_tests { v4:StringExact = StringCopy v2 v6:BasicObject = SendWithoutBlock v4, :dup v8:BasicObject = SendWithoutBlock v6, :freeze + CheckInterrupts Return v8 "#]]); } @@ -7332,6 +7589,7 @@ mod opt_tests { v4:StringExact = StringCopy v2 v5:NilClass = Const Value(nil) v7:BasicObject = SendWithoutBlock v4, :freeze, v5 + CheckInterrupts Return v7 "#]]); } @@ -7346,6 +7604,7 @@ mod opt_tests { bb0(v0:BasicObject): v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_UMINUS) + CheckInterrupts Return v3 "#]]); } @@ -7361,6 +7620,7 @@ mod opt_tests { v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_FREEZE) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_UMINUS) + CheckInterrupts Return v3 "#]]); } @@ -7377,6 +7637,7 @@ mod opt_tests { v4:StringExact = StringCopy v2 v6:BasicObject = SendWithoutBlock v4, :dup v8:BasicObject = SendWithoutBlock v6, :-@ + CheckInterrupts Return v8 "#]]); } @@ -7393,6 +7654,7 @@ mod opt_tests { v3:StringExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) v5:StringExact = StringCopy v3 v11:StringExact = StringConcat v2, v5 + CheckInterrupts Return v11 "#]]); } @@ -7410,6 +7672,7 @@ mod opt_tests { v5:BasicObject = ObjToString v3 v7:String = AnyToString v3, str: v5 v9:StringExact = StringConcat v2, v7 + CheckInterrupts Return v9 "#]]); } @@ -7427,6 +7690,8 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v3:NilClass = Const Value(nil) + CheckInterrupts + CheckInterrupts Return v3 "#]]); } @@ -7444,9 +7709,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v3:Fixnum[1] = Const Value(1) + CheckInterrupts PatchPoint MethodRedefined(Integer@0x1000, itself@0x1008, cme:0x1010) - v15:BasicObject = CCall itself@0x1038, v3 - Return v15 + v19:BasicObject = CCall itself@0x1038, v3 + CheckInterrupts + Return v19 "#]]); } @@ -7462,8 +7729,9 @@ mod opt_tests { PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) v5:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_AREF) - v11:Fixnum[5] = Const Value(5) - Return v11 + v13:Fixnum[5] = Const Value(5) + CheckInterrupts + Return v13 "#]]); } @@ -7479,8 +7747,9 @@ mod opt_tests { PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) v5:Fixnum[-3] = Const Value(-3) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_AREF) - v11:Fixnum[4] = Const Value(4) - Return v11 + v13:Fixnum[4] = Const Value(4) + CheckInterrupts + Return v13 "#]]); } @@ -7496,8 +7765,9 @@ mod opt_tests { PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) v5:Fixnum[-10] = Const Value(-10) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_AREF) - v11:NilClass = Const Value(nil) - Return v11 + v13:NilClass = Const Value(nil) + CheckInterrupts + Return v13 "#]]); } @@ -7513,8 +7783,9 @@ mod opt_tests { PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) v5:Fixnum[10] = Const Value(10) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_AREF) - v11:NilClass = Const Value(nil) - Return v11 + v13:NilClass = Const Value(nil) + CheckInterrupts + Return v13 "#]]); } @@ -7533,6 +7804,7 @@ mod opt_tests { PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) v5:Fixnum[10] = Const Value(10) v7:BasicObject = SendWithoutBlock v3, :[], v5 + CheckInterrupts Return v7 "#]]); } @@ -7551,8 +7823,9 @@ mod opt_tests { v2:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) v4:ArrayExact = ArrayDup v2 PatchPoint MethodRedefined(Array@0x1008, max@0x1010, cme:0x1018) - v9:BasicObject = SendWithoutBlockDirect v4, :max (0x1040) - Return v9 + v11:BasicObject = SendWithoutBlockDirect v4, :max (0x1040) + CheckInterrupts + Return v11 "#]]); } @@ -7571,8 +7844,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, MY_SET) - v7:SetExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - Return v7 + v9:SetExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + CheckInterrupts + Return v9 "#]]); } @@ -7585,6 +7859,7 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject): v2:RegexpExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + CheckInterrupts Return v2 "#]]); } @@ -7599,8 +7874,9 @@ mod opt_tests { bb0(v0:BasicObject): v2:NilClass = Const Value(nil) PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) - v7:TrueClass = CCall nil?@0x1038, v2 - Return v7 + v9:TrueClass = CCall nil?@0x1038, v2 + CheckInterrupts + Return v9 "#]]); } @@ -7618,6 +7894,7 @@ mod opt_tests { v2:NilClass = Const Value(nil) PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) v5:Fixnum[1] = Const Value(1) + CheckInterrupts Return v5 "#]]); } @@ -7632,8 +7909,9 @@ mod opt_tests { bb0(v0:BasicObject): v2:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) - v7:FalseClass = CCall nil?@0x1038, v2 - Return v7 + v9:FalseClass = CCall nil?@0x1038, v2 + CheckInterrupts + Return v9 "#]]); } @@ -7651,6 +7929,7 @@ mod opt_tests { v2:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) v5:Fixnum[2] = Const Value(2) + CheckInterrupts Return v5 "#]]); } @@ -7666,9 +7945,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) - v7:NilClass = GuardType v1, NilClass - v8:TrueClass = CCall nil?@0x1038, v7 - Return v8 + v9:NilClass = GuardType v1, NilClass + v10:TrueClass = CCall nil?@0x1038, v9 + CheckInterrupts + Return v10 "#]]); } @@ -7683,9 +7963,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(FalseClass@0x1000, nil?@0x1008, cme:0x1010) - v7:FalseClass = GuardType v1, FalseClass - v8:FalseClass = CCall nil?@0x1038, v7 - Return v8 + v9:FalseClass = GuardType v1, FalseClass + v10:FalseClass = CCall nil?@0x1038, v9 + CheckInterrupts + Return v10 "#]]); } @@ -7700,9 +7981,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(TrueClass@0x1000, nil?@0x1008, cme:0x1010) - v7:TrueClass = GuardType v1, TrueClass - v8:FalseClass = CCall nil?@0x1038, v7 - Return v8 + v9:TrueClass = GuardType v1, TrueClass + v10:FalseClass = CCall nil?@0x1038, v9 + CheckInterrupts + Return v10 "#]]); } @@ -7717,9 +7999,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Symbol@0x1000, nil?@0x1008, cme:0x1010) - v7:StaticSymbol = GuardType v1, StaticSymbol - v8:FalseClass = CCall nil?@0x1038, v7 - Return v8 + v9:StaticSymbol = GuardType v1, StaticSymbol + v10:FalseClass = CCall nil?@0x1038, v9 + CheckInterrupts + Return v10 "#]]); } @@ -7734,9 +8017,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) - v7:Fixnum = GuardType v1, Fixnum - v8:FalseClass = CCall nil?@0x1038, v7 - Return v8 + v9:Fixnum = GuardType v1, Fixnum + v10:FalseClass = CCall nil?@0x1038, v9 + CheckInterrupts + Return v10 "#]]); } @@ -7751,9 +8035,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Float@0x1000, nil?@0x1008, cme:0x1010) - v7:Flonum = GuardType v1, Flonum - v8:FalseClass = CCall nil?@0x1038, v7 - Return v8 + v9:Flonum = GuardType v1, Flonum + v10:FalseClass = CCall nil?@0x1038, v9 + CheckInterrupts + Return v10 "#]]); } @@ -7768,9 +8053,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(String@0x1000, nil?@0x1008, cme:0x1010) - v7:StringExact = GuardType v1, StringExact - v8:FalseClass = CCall nil?@0x1038, v7 - Return v8 + v9:StringExact = GuardType v1, StringExact + v10:FalseClass = CCall nil?@0x1038, v9 + CheckInterrupts + Return v10 "#]]); } @@ -7785,10 +8071,11 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, 28) - v8:Fixnum = GuardType v1, Fixnum - v9:Fixnum = GuardType v2, Fixnum - v10:Fixnum = FixnumAnd v8, v9 - Return v10 + v10:Fixnum = GuardType v1, Fixnum + v11:Fixnum = GuardType v2, Fixnum + v12:Fixnum = FixnumAnd v10, v11 + CheckInterrupts + Return v12 "#]]); } @@ -7803,10 +8090,11 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, 29) - v8:Fixnum = GuardType v1, Fixnum - v9:Fixnum = GuardType v2, Fixnum - v10:Fixnum = FixnumOr v8, v9 - Return v10 + v10:Fixnum = GuardType v1, Fixnum + v11:Fixnum = GuardType v2, Fixnum + v12:Fixnum = FixnumOr v10, v11 + CheckInterrupts + Return v12 "#]]); } @@ -7823,9 +8111,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v6:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v7:BasicObject = SendWithoutBlockDirect v6, :foo (0x1038) - Return v7 + v8:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v9:BasicObject = SendWithoutBlockDirect v8, :foo (0x1038) + CheckInterrupts + Return v9 "#]]); } @@ -7846,10 +8135,11 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, O) - v9:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v11:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(C@0x1010, foo@0x1018, cme:0x1020) - v11:BasicObject = GetIvar v9, :@foo - Return v11 + v13:BasicObject = GetIvar v11, :@foo + CheckInterrupts + Return v13 "#]]); } @@ -7870,10 +8160,11 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, O) - v9:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v11:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(C@0x1010, foo@0x1018, cme:0x1020) - v11:BasicObject = GetIvar v9, :@foo - Return v11 + v13:BasicObject = GetIvar v11, :@foo + CheckInterrupts + Return v13 "#]]); } @@ -7892,9 +8183,10 @@ mod opt_tests { fn test@:6: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(C@0x1000, foo@0x1008, cme:0x1010) - v7:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v8:BasicObject = GetIvar v7, :@foo - Return v8 + v9:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v10:BasicObject = GetIvar v9, :@foo + CheckInterrupts + Return v10 "#]]); } @@ -7913,9 +8205,10 @@ mod opt_tests { fn test@:6: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(C@0x1000, foo@0x1008, cme:0x1010) - v7:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v8:BasicObject = GetIvar v7, :@foo - Return v8 + v9:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v10:BasicObject = GetIvar v9, :@foo + CheckInterrupts + Return v10 "#]]); } }