Skip to content

Commit a5f6050

Browse files
committed
ZJIT: Add HIR tests for block arg nil and non-nil
1 parent 64cf605 commit a5f6050

1 file changed

Lines changed: 103 additions & 0 deletions

File tree

zjit/src/hir/opt_tests.rs

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9743,6 +9743,109 @@ mod hir_opt_tests {
97439743
");
97449744
}
97459745

9746+
#[test]
9747+
fn test_send_with_non_nil_block_arg() {
9748+
eval(r#"
9749+
def foo = 42
9750+
9751+
def test
9752+
block = :to_s
9753+
foo(&block)
9754+
end
9755+
test; test
9756+
"#);
9757+
assert_snapshot!(hir_string("test"), @"
9758+
fn test@<compiled>:5:
9759+
bb1():
9760+
EntryPoint interpreter
9761+
v1:BasicObject = LoadSelf
9762+
v2:NilClass = Const Value(nil)
9763+
Jump bb3(v1, v2)
9764+
bb2():
9765+
EntryPoint JIT(0)
9766+
v5:BasicObject = LoadArg :self@0
9767+
v6:NilClass = Const Value(nil)
9768+
Jump bb3(v5, v6)
9769+
bb3(v8:BasicObject, v9:NilClass):
9770+
v13:StaticSymbol[:to_s] = Const Value(VALUE(0x1000))
9771+
v19:BasicObject = Send v8, &block, :foo, v13 # SendFallbackReason: Complex argument passing
9772+
CheckInterrupts
9773+
Return v19
9774+
");
9775+
}
9776+
9777+
#[test]
9778+
fn test_send_with_statically_nil_block_arg() {
9779+
eval(r#"
9780+
def foo = 42
9781+
9782+
def test
9783+
block = nil
9784+
foo(&block)
9785+
end
9786+
test; test
9787+
"#);
9788+
assert_snapshot!(hir_string("test"), @"
9789+
fn test@<compiled>:5:
9790+
bb1():
9791+
EntryPoint interpreter
9792+
v1:BasicObject = LoadSelf
9793+
v2:NilClass = Const Value(nil)
9794+
Jump bb3(v1, v2)
9795+
bb2():
9796+
EntryPoint JIT(0)
9797+
v5:BasicObject = LoadArg :self@0
9798+
v6:NilClass = Const Value(nil)
9799+
Jump bb3(v5, v6)
9800+
bb3(v8:BasicObject, v9:NilClass):
9801+
v13:NilClass = Const Value(nil)
9802+
v19:BasicObject = Send v8, &block, :foo, v13 # SendFallbackReason: Complex argument passing
9803+
CheckInterrupts
9804+
Return v19
9805+
");
9806+
}
9807+
9808+
#[test]
9809+
fn test_send_with_monomorphically_nil_block_arg() {
9810+
eval(r#"
9811+
def foo = 42
9812+
9813+
def test(&block)
9814+
foo(&block)
9815+
end
9816+
test; test
9817+
"#);
9818+
assert_snapshot!(hir_string("test"), @"
9819+
fn test@<compiled>:5:
9820+
bb1():
9821+
EntryPoint interpreter
9822+
v1:BasicObject = LoadSelf
9823+
v2:CPtr = LoadSP
9824+
v3:BasicObject = LoadField v2, :block@0x1000
9825+
Jump bb3(v1, v3)
9826+
bb2():
9827+
EntryPoint JIT(0)
9828+
v6:BasicObject = LoadArg :self@0
9829+
v7:BasicObject = LoadArg :block@1
9830+
Jump bb3(v6, v7)
9831+
bb3(v9:BasicObject, v10:BasicObject):
9832+
v17:CPtr = GetEP 0
9833+
v18:CBool = IsBlockParamModified v17
9834+
IfTrue v18, bb4()
9835+
v23:CInt64 = LoadField v17, :_env_data_index_specval@0x1001
9836+
v24:CInt64[0] = GuardBitEquals v23, CInt64(0)
9837+
v25:NilClass = Const Value(nil)
9838+
Jump bb6(v25, v10)
9839+
bb4():
9840+
v21:BasicObject = LoadField v17, :block@0x1002
9841+
Jump bb6(v21, v21)
9842+
bb6(v15:BasicObject, v16:BasicObject):
9843+
v28:BasicObject = Send v9, &block, :foo, v15 # SendFallbackReason: Complex argument passing
9844+
CheckInterrupts
9845+
Return v28
9846+
");
9847+
}
9848+
97469849
#[test]
97479850
fn test_inline_attr_reader_constant() {
97489851
eval("

0 commit comments

Comments
 (0)