Skip to content

Commit 690ba2c

Browse files
committed
ZJIT: Guard an array is not frozen before popping from it
1 parent 9f4aac2 commit 690ba2c

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
@@ -9638,17 +9638,18 @@ mod hir_opt_tests {
96389638
v20:CallableMethodEntry[VALUE(0x1040)] = GuardBitEquals v19, Value(VALUE(0x1040))
96399639
v21:RubyValue = LoadField v18, :_ep_specval@0x1048
96409640
v22:FalseClass = GuardBitEquals v21, Value(false)
9641-
v28:CPtr = GetEP 0
9642-
v29:RubyValue = LoadField v28, :_ep_method_entry@0x1038
9643-
v30:CallableMethodEntry[VALUE(0x1040)] = GuardBitEquals v29, Value(VALUE(0x1040))
9644-
v31:RubyValue = LoadField v28, :_ep_specval@0x1048
9645-
v32:FalseClass = GuardBitEquals v31, Value(false)
9641+
v30:CPtr = GetEP 0
9642+
v31:RubyValue = LoadField v30, :_ep_method_entry@0x1038
9643+
v32:CallableMethodEntry[VALUE(0x1040)] = GuardBitEquals v31, Value(VALUE(0x1040))
9644+
v33:RubyValue = LoadField v30, :_ep_specval@0x1048
9645+
v34:FalseClass = GuardBitEquals v33, Value(false)
96469646
v23:Array = GuardType v6, Array
96479647
v24:CUInt64 = LoadField v23, :_rbasic_flags@0x1049
9648-
v25:CUInt64 = GuardNoBitsSet v24, RUBY_ELTS_SHARED=CUInt64(4096)
9649-
v26:BasicObject = ArrayPop v23
9648+
v25:CUInt64 = GuardNoBitsSet v24, RUBY_FL_FREEZE=CUInt64(2048)
9649+
v27:CUInt64 = GuardNoBitsSet v24, RUBY_ELTS_SHARED=CUInt64(4096)
9650+
v28:BasicObject = ArrayPop v23
96509651
CheckInterrupts
9651-
Return v26
9652+
Return v28
96529653
");
96539654
}
96549655

0 commit comments

Comments
 (0)