diff --git a/class.c b/class.c index 84c8668b6be3a3..469cc5e54fef86 100644 --- a/class.c +++ b/class.c @@ -496,6 +496,13 @@ class_get_subclasses_for_ns(struct st_table *tbl, VALUE ns_id) return NULL; } +static int +remove_class_from_subclasses_replace_first_entry(st_data_t *key, st_data_t *value, st_data_t arg, int existing) +{ + *value = arg; + return ST_CONTINUE; +} + static void remove_class_from_subclasses(struct st_table *tbl, VALUE ns_id, VALUE klass) { @@ -516,7 +523,7 @@ remove_class_from_subclasses(struct st_table *tbl, VALUE ns_id, VALUE klass) if (first_entry) { if (next) { - st_insert(tbl, ns_id, (st_data_t)next); + st_update(tbl, ns_id, remove_class_from_subclasses_replace_first_entry, (st_data_t)next); } else { // no subclass entries in this ns diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb index 6ed0842963e6f0..01788a6a5f17d5 100644 --- a/lib/rubygems/remote_fetcher.rb +++ b/lib/rubygems/remote_fetcher.rb @@ -245,11 +245,14 @@ def fetch_http(uri, last_modified = nil, head = false, depth = 0) def fetch_path(uri, mtime = nil, head = false) uri = Gem::Uri.new uri - unless uri.scheme - raise ArgumentError, "uri scheme is invalid: #{uri.scheme.inspect}" - end - - data = send "fetch_#{uri.scheme}", uri, mtime, head + method = { + "http" => "fetch_http", + "https" => "fetch_http", + "s3" => "fetch_s3", + "file" => "fetch_file", + }.fetch(uri.scheme) { raise ArgumentError, "uri scheme is invalid: #{uri.scheme.inspect}" } + + data = send method, uri, mtime, head if data && !head && uri.to_s.end_with?(".gz") begin diff --git a/zjit/src/codegen.rs b/zjit/src/codegen.rs index 049501dd1518fb..42501de2423888 100644 --- a/zjit/src/codegen.rs +++ b/zjit/src/codegen.rs @@ -711,7 +711,6 @@ fn gen_ccall_with_frame(jit: &mut JITState, asm: &mut Assembler, cfunc: *const u /// Lowering for [`Insn::CCall`]. This is a low-level raw call that doesn't know /// anything about the callee, so handling for e.g. GC safety is dealt with elsewhere. fn gen_ccall(asm: &mut Assembler, cfunc: *const u8, args: Vec) -> lir::Opnd { - gen_incr_counter(asm, Counter::inline_cfunc_optimized_send_count); asm.ccall(cfunc, args) } diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index 633e4d64f7b024..48011bd0883e5b 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -2412,6 +2412,7 @@ impl Function { assert_ne!(block, tmp_block); let insns = std::mem::take(&mut fun.blocks[tmp_block.0].insns); fun.blocks[block.0].insns.extend(insns); + fun.push_insn(block, Insn::IncrCounter(Counter::inline_cfunc_optimized_send_count)); fun.make_equal_to(send_insn_id, replacement); fun.remove_block(tmp_block); return Ok(()); @@ -2425,6 +2426,7 @@ impl Function { let elidable = props.elidable; // Filter for a leaf and GC free function if props.leaf && props.no_gc { + fun.push_insn(block, Insn::IncrCounter(Counter::inline_cfunc_optimized_send_count)); let ccall = fun.push_insn(block, Insn::CCall { cfunc, args: cfunc_args, name: method_id, return_type, elidable }); fun.make_equal_to(send_insn_id, ccall); } else { @@ -2467,6 +2469,7 @@ impl Function { assert_ne!(block, tmp_block); let insns = std::mem::take(&mut fun.blocks[tmp_block.0].insns); fun.blocks[block.0].insns.extend(insns); + fun.push_insn(block, Insn::IncrCounter(Counter::inline_cfunc_optimized_send_count)); fun.make_equal_to(send_insn_id, replacement); fun.remove_block(tmp_block); return Ok(()); @@ -2506,12 +2509,22 @@ impl Function { Err(()) } + fn qualified_method_name(class: VALUE, method_id: ID) -> String { + let method_name = method_id.contents_lossy(); + // rb_zjit_singleton_class_p also checks if it's a class + if unsafe { rb_zjit_singleton_class_p(class) } { + let class_name = get_class_name(unsafe { rb_class_attached_object(class) }); + format!("{}.{}", class_name, method_name) + } else { + let class_name = get_class_name(class); + format!("{}#{}", class_name, method_name) + } + } + fn count_not_inlined_cfunc(fun: &mut Function, block: BlockId, cme: *const rb_callable_method_entry_t) { let owner = unsafe { (*cme).owner }; let called_id = unsafe { (*cme).called_id }; - let class_name = get_class_name(owner); - let method_name = called_id.contents_lossy(); - let qualified_method_name = format!("{}#{}", class_name, method_name); + let qualified_method_name = qualified_method_name(owner, called_id); let not_inlined_cfunc_counter_pointers = ZJITState::get_not_inlined_cfunc_counter_pointers(); let counter_ptr = not_inlined_cfunc_counter_pointers.entry(qualified_method_name.clone()).or_insert_with(|| Box::new(0)); let counter_ptr = &mut **counter_ptr as *mut u64; @@ -2522,9 +2535,7 @@ impl Function { fn count_not_annotated_cfunc(fun: &mut Function, block: BlockId, cme: *const rb_callable_method_entry_t) { let owner = unsafe { (*cme).owner }; let called_id = unsafe { (*cme).called_id }; - let class_name = get_class_name(owner); - let method_name = called_id.contents_lossy(); - let qualified_method_name = format!("{}#{}", class_name, method_name); + let qualified_method_name = qualified_method_name(owner, called_id); let not_annotated_cfunc_counter_pointers = ZJITState::get_not_annotated_cfunc_counter_pointers(); let counter_ptr = not_annotated_cfunc_counter_pointers.entry(qualified_method_name.clone()).or_insert_with(|| Box::new(0)); let counter_ptr = &mut **counter_ptr as *mut u64; @@ -9235,6 +9246,7 @@ mod opt_tests { PatchPoint NoSingletonClass(Array@0x1000) v26:ArrayExact = GuardType v9, ArrayExact v27:BasicObject = ArrayArefFixnum v26, v13 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v27 "); @@ -9264,6 +9276,7 @@ mod opt_tests { PatchPoint NoSingletonClass(Hash@0x1000) v26:HashExact = GuardType v9, HashExact v27:BasicObject = HashAref v26, v13 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v27 "); @@ -9911,6 +9924,7 @@ mod opt_tests { bb2(v8:BasicObject, v9:BasicObject): PatchPoint MethodRedefined(Integer@0x1000, itself@0x1008, cme:0x1010) v22:Fixnum = GuardType v9, Fixnum + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v22 "); @@ -9934,6 +9948,7 @@ mod opt_tests { v11:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, itself@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v11 "); @@ -9962,6 +9977,7 @@ mod opt_tests { v14:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, itself@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) + IncrCounter inline_cfunc_optimized_send_count PatchPoint NoEPEscape(test) v21:Fixnum[1] = Const Value(1) CheckInterrupts @@ -9996,7 +10012,8 @@ mod opt_tests { v29:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(Module@0x1010, name@0x1018, cme:0x1020) PatchPoint NoSingletonClass(Module@0x1010) - v33:StringExact|NilClass = CCall name@0x1048, v29 + IncrCounter inline_cfunc_optimized_send_count + v34:StringExact|NilClass = CCall name@0x1048, v29 PatchPoint NoEPEscape(test) v21:Fixnum[1] = Const Value(1) CheckInterrupts @@ -10027,7 +10044,8 @@ mod opt_tests { v14:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, length@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) - v30:Fixnum = CCall length@0x1038, v14 + IncrCounter inline_cfunc_optimized_send_count + v31:Fixnum = CCall length@0x1038, v14 v21:Fixnum[5] = Const Value(5) CheckInterrupts Return v21 @@ -10170,7 +10188,8 @@ mod opt_tests { v14:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, size@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) - v30:Fixnum = CCall size@0x1038, v14 + IncrCounter inline_cfunc_optimized_send_count + v31:Fixnum = CCall size@0x1038, v14 v21:Fixnum[5] = Const Value(5) CheckInterrupts Return v21 @@ -10497,9 +10516,10 @@ mod opt_tests { v12:StringExact = StringCopy v10 PatchPoint MethodRedefined(String@0x1008, bytesize@0x1010, cme:0x1018) PatchPoint NoSingletonClass(String@0x1008) - v23:Fixnum = CCall bytesize@0x1040, v12 + IncrCounter inline_cfunc_optimized_send_count + v24:Fixnum = CCall bytesize@0x1040, v12 CheckInterrupts - Return v23 + Return v24 "); } @@ -10627,6 +10647,7 @@ mod opt_tests { PatchPoint MethodRedefined(C@0x1008, initialize@0x1040, cme:0x1048) PatchPoint NoSingletonClass(C@0x1008) v47:NilClass = Const Value(nil) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts CheckInterrupts Return v43 @@ -10695,6 +10716,7 @@ mod opt_tests { PatchPoint MethodRedefined(Object@0x1008, initialize@0x1040, cme:0x1048) PatchPoint NoSingletonClass(Object@0x1008) v47:NilClass = Const Value(nil) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts CheckInterrupts Return v43 @@ -10726,6 +10748,7 @@ mod opt_tests { PatchPoint MethodRedefined(BasicObject@0x1008, initialize@0x1040, cme:0x1048) PatchPoint NoSingletonClass(BasicObject@0x1008) v47:NilClass = Const Value(nil) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts CheckInterrupts Return v43 @@ -10906,9 +10929,10 @@ mod opt_tests { v17:ArrayExact = NewArray v11, v12 PatchPoint MethodRedefined(Array@0x1000, length@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) - v30:Fixnum = CCall length@0x1038, v17 + IncrCounter inline_cfunc_optimized_send_count + v31:Fixnum = CCall length@0x1038, v17 CheckInterrupts - Return v30 + Return v31 "); } @@ -10932,9 +10956,10 @@ mod opt_tests { v17:ArrayExact = NewArray v11, v12 PatchPoint MethodRedefined(Array@0x1000, size@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) - v30:Fixnum = CCall size@0x1038, v17 + IncrCounter inline_cfunc_optimized_send_count + v31:Fixnum = CCall size@0x1038, v17 CheckInterrupts - Return v30 + Return v31 "); } @@ -11576,6 +11601,7 @@ mod opt_tests { v13:Fixnum[1] = Const Value(1) CheckInterrupts PatchPoint MethodRedefined(Integer@0x1000, itself@0x1008, cme:0x1010) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v13 "); @@ -11605,6 +11631,7 @@ mod opt_tests { PatchPoint MethodRedefined(Array@0x1010, []@0x1018, cme:0x1020) PatchPoint NoSingletonClass(Array@0x1010) v28:BasicObject = ArrayArefFixnum v24, v12 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v28 "); @@ -11632,9 +11659,10 @@ mod opt_tests { v13:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) PatchPoint NoSingletonClass(Array@0x1008) - v27:Fixnum[5] = Const Value(5) + v28:Fixnum[5] = Const Value(5) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v27 + Return v28 "); } @@ -11658,9 +11686,10 @@ mod opt_tests { v13:Fixnum[-3] = Const Value(-3) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) PatchPoint NoSingletonClass(Array@0x1008) - v27:Fixnum[4] = Const Value(4) + v28:Fixnum[4] = Const Value(4) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v27 + Return v28 "); } @@ -11684,9 +11713,10 @@ mod opt_tests { v13:Fixnum[-10] = Const Value(-10) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) PatchPoint NoSingletonClass(Array@0x1008) - v27:NilClass = Const Value(nil) + v28:NilClass = Const Value(nil) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v27 + Return v28 "); } @@ -11710,9 +11740,10 @@ mod opt_tests { v13:Fixnum[10] = Const Value(10) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) PatchPoint NoSingletonClass(Array@0x1008) - v27:NilClass = Const Value(nil) + v28:NilClass = Const Value(nil) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v27 + Return v28 "); } @@ -11839,9 +11870,10 @@ mod opt_tests { bb2(v6:BasicObject): v10:NilClass = Const Value(nil) PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) - v22:TrueClass = CCall nil?@0x1038, v10 + IncrCounter inline_cfunc_optimized_send_count + v23:TrueClass = CCall nil?@0x1038, v10 CheckInterrupts - Return v22 + Return v23 "); } @@ -11865,6 +11897,7 @@ mod opt_tests { bb2(v6:BasicObject): v10:NilClass = Const Value(nil) PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) + IncrCounter inline_cfunc_optimized_send_count v17:Fixnum[1] = Const Value(1) CheckInterrupts Return v17 @@ -11888,9 +11921,10 @@ mod opt_tests { bb2(v6:BasicObject): v10:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) - v22:FalseClass = CCall nil?@0x1038, v10 + IncrCounter inline_cfunc_optimized_send_count + v23:FalseClass = CCall nil?@0x1038, v10 CheckInterrupts - Return v22 + Return v23 "); } @@ -11914,6 +11948,7 @@ mod opt_tests { bb2(v6:BasicObject): v10:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) + IncrCounter inline_cfunc_optimized_send_count v17:Fixnum[2] = Const Value(2) CheckInterrupts Return v17 @@ -11940,9 +11975,10 @@ mod opt_tests { bb2(v8:BasicObject, v9:BasicObject): PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) v24:NilClass = GuardType v9, NilClass - v25:TrueClass = CCall nil?@0x1038, v24 + IncrCounter inline_cfunc_optimized_send_count + v26:TrueClass = CCall nil?@0x1038, v24 CheckInterrupts - Return v25 + Return v26 "); } @@ -11966,9 +12002,10 @@ mod opt_tests { bb2(v8:BasicObject, v9:BasicObject): PatchPoint MethodRedefined(FalseClass@0x1000, nil?@0x1008, cme:0x1010) v24:FalseClass = GuardType v9, FalseClass - v25:FalseClass = CCall nil?@0x1038, v24 + IncrCounter inline_cfunc_optimized_send_count + v26:FalseClass = CCall nil?@0x1038, v24 CheckInterrupts - Return v25 + Return v26 "); } @@ -11992,9 +12029,10 @@ mod opt_tests { bb2(v8:BasicObject, v9:BasicObject): PatchPoint MethodRedefined(TrueClass@0x1000, nil?@0x1008, cme:0x1010) v24:TrueClass = GuardType v9, TrueClass - v25:FalseClass = CCall nil?@0x1038, v24 + IncrCounter inline_cfunc_optimized_send_count + v26:FalseClass = CCall nil?@0x1038, v24 CheckInterrupts - Return v25 + Return v26 "); } @@ -12018,9 +12056,10 @@ mod opt_tests { bb2(v8:BasicObject, v9:BasicObject): PatchPoint MethodRedefined(Symbol@0x1000, nil?@0x1008, cme:0x1010) v24:StaticSymbol = GuardType v9, StaticSymbol - v25:FalseClass = CCall nil?@0x1038, v24 + IncrCounter inline_cfunc_optimized_send_count + v26:FalseClass = CCall nil?@0x1038, v24 CheckInterrupts - Return v25 + Return v26 "); } @@ -12044,9 +12083,10 @@ mod opt_tests { bb2(v8:BasicObject, v9:BasicObject): PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) v24:Fixnum = GuardType v9, Fixnum - v25:FalseClass = CCall nil?@0x1038, v24 + IncrCounter inline_cfunc_optimized_send_count + v26:FalseClass = CCall nil?@0x1038, v24 CheckInterrupts - Return v25 + Return v26 "); } @@ -12070,9 +12110,10 @@ mod opt_tests { bb2(v8:BasicObject, v9:BasicObject): PatchPoint MethodRedefined(Float@0x1000, nil?@0x1008, cme:0x1010) v24:Flonum = GuardType v9, Flonum - v25:FalseClass = CCall nil?@0x1038, v24 + IncrCounter inline_cfunc_optimized_send_count + v26:FalseClass = CCall nil?@0x1038, v24 CheckInterrupts - Return v25 + Return v26 "); } @@ -12097,9 +12138,10 @@ mod opt_tests { PatchPoint MethodRedefined(String@0x1000, nil?@0x1008, cme:0x1010) PatchPoint NoSingletonClass(String@0x1000) v25:StringExact = GuardType v9, StringExact - v26:FalseClass = CCall nil?@0x1038, v25 + IncrCounter inline_cfunc_optimized_send_count + v27:FalseClass = CCall nil?@0x1038, v25 CheckInterrupts - Return v26 + Return v27 "); } @@ -12124,9 +12166,10 @@ mod opt_tests { PatchPoint MethodRedefined(Array@0x1000, !@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) v25:ArrayExact = GuardType v9, ArrayExact - v26:BoolExact = CCall !@0x1038, v25 + IncrCounter inline_cfunc_optimized_send_count + v27:BoolExact = CCall !@0x1038, v25 CheckInterrupts - Return v26 + Return v27 "); } @@ -12151,9 +12194,10 @@ mod opt_tests { PatchPoint MethodRedefined(Array@0x1000, empty?@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) v25:ArrayExact = GuardType v9, ArrayExact - v26:BoolExact = CCall empty?@0x1038, v25 + IncrCounter inline_cfunc_optimized_send_count + v27:BoolExact = CCall empty?@0x1038, v25 CheckInterrupts - Return v26 + Return v27 "); } @@ -12178,9 +12222,10 @@ mod opt_tests { PatchPoint MethodRedefined(Hash@0x1000, empty?@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Hash@0x1000) v25:HashExact = GuardType v9, HashExact - v26:BoolExact = CCall empty?@0x1038, v25 + IncrCounter inline_cfunc_optimized_send_count + v27:BoolExact = CCall empty?@0x1038, v25 CheckInterrupts - Return v26 + Return v27 "); } @@ -12207,9 +12252,10 @@ mod opt_tests { PatchPoint MethodRedefined(C@0x1000, ==@0x1008, cme:0x1010) PatchPoint NoSingletonClass(C@0x1000) v28:HeapObject[class_exact:C] = GuardType v11, HeapObject[class_exact:C] - v29:BoolExact = CCall ==@0x1038, v28, v12 + IncrCounter inline_cfunc_optimized_send_count + v30:BoolExact = CCall ==@0x1038, v28, v12 CheckInterrupts - Return v29 + Return v30 "); } @@ -12702,6 +12748,7 @@ mod opt_tests { v12:StringExact = StringCopy v10 PatchPoint MethodRedefined(String@0x1008, to_s@0x1010, cme:0x1018) PatchPoint NoSingletonClass(String@0x1008) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v12 "); @@ -12726,6 +12773,7 @@ mod opt_tests { v12:StringExact = StringCopy v10 PatchPoint MethodRedefined(String@0x1008, to_s@0x1010, cme:0x1018) PatchPoint NoSingletonClass(String@0x1008) + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v12 "); @@ -12751,6 +12799,7 @@ mod opt_tests { PatchPoint MethodRedefined(String@0x1000, to_s@0x1008, cme:0x1010) PatchPoint NoSingletonClass(String@0x1000) v23:StringExact = GuardType v9, StringExact + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v23 "); @@ -12782,6 +12831,7 @@ mod opt_tests { PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) PatchPoint NoSingletonClass(Array@0x1008) v31:BasicObject = ArrayArefFixnum v15, v18 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v31 "); @@ -12812,6 +12862,7 @@ mod opt_tests { v28:ArrayExact = GuardType v11, ArrayExact v29:Fixnum = GuardType v12, Fixnum v30:BasicObject = ArrayArefFixnum v28, v29 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v30 "); @@ -12843,6 +12894,7 @@ mod opt_tests { v28:HeapObject[class_exact:C] = GuardType v11, HeapObject[class_exact:C] v29:Fixnum = GuardType v12, Fixnum v30:BasicObject = ArrayArefFixnum v28, v29 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v30 "); @@ -12874,6 +12926,7 @@ mod opt_tests { PatchPoint MethodRedefined(Hash@0x1008, []@0x1010, cme:0x1018) PatchPoint NoSingletonClass(Hash@0x1008) v31:BasicObject = HashAref v15, v18 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v31 "); @@ -12903,6 +12956,7 @@ mod opt_tests { PatchPoint NoSingletonClass(Hash@0x1000) v28:HashExact = GuardType v11, HashExact v29:BasicObject = HashAref v28, v12 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v29 "); @@ -12933,6 +12987,7 @@ mod opt_tests { PatchPoint NoSingletonClass(C@0x1000) v28:HeapObject[class_exact:C] = GuardType v11, HeapObject[class_exact:C] v29:BasicObject = HashAref v28, v12 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v29 "); @@ -12962,6 +13017,7 @@ mod opt_tests { PatchPoint MethodRedefined(Hash@0x1018, []@0x1020, cme:0x1028) PatchPoint NoSingletonClass(Hash@0x1018) v28:BasicObject = HashAref v24, v12 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v28 "); @@ -12988,9 +13044,10 @@ mod opt_tests { v21:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(Class@0x1010, current@0x1018, cme:0x1020) PatchPoint NoSingletonClass(Class@0x1010) - v25:BasicObject = CCall current@0x1048, v21 + IncrCounter inline_cfunc_optimized_send_count + v26:BasicObject = CCall current@0x1048, v21 CheckInterrupts - Return v25 + Return v26 "); } @@ -13074,9 +13131,10 @@ mod opt_tests { PatchPoint MethodRedefined(Array@0x1000, length@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) v25:ArrayExact = GuardType v9, ArrayExact - v26:Fixnum = CCall length@0x1038, v25 + IncrCounter inline_cfunc_optimized_send_count + v27:Fixnum = CCall length@0x1038, v25 CheckInterrupts - Return v26 + Return v27 "); } @@ -13101,9 +13159,10 @@ mod opt_tests { PatchPoint MethodRedefined(Array@0x1000, size@0x1008, cme:0x1010) PatchPoint NoSingletonClass(Array@0x1000) v25:ArrayExact = GuardType v9, ArrayExact - v26:Fixnum = CCall size@0x1038, v25 + IncrCounter inline_cfunc_optimized_send_count + v27:Fixnum = CCall size@0x1038, v25 CheckInterrupts - Return v26 + Return v27 "); } @@ -13158,6 +13217,7 @@ mod opt_tests { v26:StringExact = GuardType v11, StringExact v27:Fixnum = GuardType v12, Fixnum v28:NilClass|Fixnum = StringGetbyteFixnum v26, v27 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v28 "); @@ -13188,6 +13248,7 @@ mod opt_tests { PatchPoint NoSingletonClass(String@0x1000) v29:StringExact = GuardType v11, StringExact v30:Fixnum = GuardType v12, Fixnum + IncrCounter inline_cfunc_optimized_send_count v20:Fixnum[5] = Const Value(5) CheckInterrupts Return v20 @@ -13216,6 +13277,7 @@ mod opt_tests { v24:Fixnum = GuardType v9, Fixnum v25:Fixnum[1] = Const Value(1) v26:Fixnum = FixnumAdd v24, v25 + IncrCounter inline_cfunc_optimized_send_count CheckInterrupts Return v26 "); diff --git a/zjit/src/stats.rs b/zjit/src/stats.rs index 6faa328a1ca736..843806e5be5e89 100644 --- a/zjit/src/stats.rs +++ b/zjit/src/stats.rs @@ -141,7 +141,13 @@ make_counters! { exit_guard_type_not_failure, exit_guard_bit_equals_failure, exit_guard_shape_failure, - exit_patchpoint, + exit_patchpoint_bop_redefined, + exit_patchpoint_method_redefined, + exit_patchpoint_stable_constant_names, + exit_patchpoint_no_tracepoint, + exit_patchpoint_no_ep_escape, + exit_patchpoint_single_ractor_mode, + exit_patchpoint_no_singleton_class, exit_callee_side_exit, exit_obj_to_string_fallback, exit_interrupt, @@ -312,6 +318,7 @@ pub fn exit_counter_for_compile_error(compile_error: &CompileError) -> Counter { pub fn side_exit_counter(reason: crate::hir::SideExitReason) -> Counter { use crate::hir::SideExitReason::*; use crate::hir::CallType::*; + use crate::hir::Invariant; use crate::stats::Counter::*; match reason { UnknownNewarraySend(_) => exit_unknown_newarray_send, @@ -328,13 +335,26 @@ pub fn side_exit_counter(reason: crate::hir::SideExitReason) -> Counter { GuardTypeNot(_) => exit_guard_type_not_failure, GuardBitEquals(_) => exit_guard_bit_equals_failure, GuardShape(_) => exit_guard_shape_failure, - PatchPoint(_) => exit_patchpoint, CalleeSideExit => exit_callee_side_exit, ObjToStringFallback => exit_obj_to_string_fallback, Interrupt => exit_interrupt, StackOverflow => exit_stackoverflow, BlockParamProxyModified => exit_block_param_proxy_modified, BlockParamProxyNotIseqOrIfunc => exit_block_param_proxy_not_iseq_or_ifunc, + PatchPoint(Invariant::BOPRedefined { .. }) + => exit_patchpoint_bop_redefined, + PatchPoint(Invariant::MethodRedefined { .. }) + => exit_patchpoint_method_redefined, + PatchPoint(Invariant::StableConstantNames { .. }) + => exit_patchpoint_stable_constant_names, + PatchPoint(Invariant::NoTracePoint) + => exit_patchpoint_no_tracepoint, + PatchPoint(Invariant::NoEPEscape(_)) + => exit_patchpoint_no_ep_escape, + PatchPoint(Invariant::SingleRactorMode) + => exit_patchpoint_single_ractor_mode, + PatchPoint(Invariant::NoSingletonClass { .. }) + => exit_patchpoint_no_singleton_class, } }