Skip to content

Commit 42a1eeb

Browse files
committed
ZJIT: Guard an array is not frozen before popping from it
1 parent 29c6c1c commit 42a1eeb

2 files changed

Lines changed: 10 additions & 8 deletions

File tree

zjit/src/cruby_methods.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ fn inline_array_pop(fun: &mut hir::Function, block: hir::BlockId, recv: hir::Ins
409409
let &[] = args else { return None; };
410410
if !fun.likely_a(recv, types::Array, state) { return None; }
411411
let recv = fun.coerce_to(block, recv, types::Array, state);
412+
fun.guard_not_frozen(block, recv, state);
412413
fun.guard_not_shared(block, recv, state);
413414
Some(fun.push_insn(block, hir::Insn::ArrayPop { array: recv, state }))
414415
}

zjit/src/hir/opt_tests.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9704,17 +9704,18 @@ mod hir_opt_tests {
97049704
v20:CallableMethodEntry[VALUE(0x1040)] = GuardBitEquals v19, Value(VALUE(0x1040))
97059705
v21:RubyValue = LoadField v18, :_ep_specval@0x1048
97069706
v22:FalseClass = GuardBitEquals v21, Value(false)
9707-
v28:CPtr = GetEP 0
9708-
v29:RubyValue = LoadField v28, :_ep_method_entry@0x1038
9709-
v30:CallableMethodEntry[VALUE(0x1040)] = GuardBitEquals v29, Value(VALUE(0x1040))
9710-
v31:RubyValue = LoadField v28, :_ep_specval@0x1048
9711-
v32:FalseClass = GuardBitEquals v31, Value(false)
9707+
v30:CPtr = GetEP 0
9708+
v31:RubyValue = LoadField v30, :_ep_method_entry@0x1038
9709+
v32:CallableMethodEntry[VALUE(0x1040)] = GuardBitEquals v31, Value(VALUE(0x1040))
9710+
v33:RubyValue = LoadField v30, :_ep_specval@0x1048
9711+
v34:FalseClass = GuardBitEquals v33, Value(false)
97129712
v23:Array = GuardType v6, Array
97139713
v24:CUInt64 = LoadField v23, :_rbasic_flags@0x1049
9714-
v25:CUInt64 = GuardNoBitsSet v24, RUBY_ELTS_SHARED=CUInt64(4096)
9715-
v26:BasicObject = ArrayPop v23
9714+
v25:CUInt64 = GuardNoBitsSet v24, RUBY_FL_FREEZE=CUInt64(2048)
9715+
v27:CUInt64 = GuardNoBitsSet v24, RUBY_ELTS_SHARED=CUInt64(4096)
9716+
v28:BasicObject = ArrayPop v23
97169717
CheckInterrupts
9717-
Return v26
9718+
Return v28
97189719
");
97199720
}
97209721

0 commit comments

Comments
 (0)