Propagate exact callable refs across expressions

This commit is contained in:
sergeych committed 2026-04-21 14:33:23 +03:00
1 parent ffa64d691b
commit 029fe874fa
2 files changed
+364 -37

No files matched your search

@@ -567,6 +567,111 @@ class BytecodeRecentOpsTest {
assertEquals(2, scope.eval("calc()").toInt())
}
@Test
fun constructorNameUsesDirectCall() = runTest {
val scope = Script.newScope()
scope.eval(
"""
fun calc() {
Map().size
}
""".trimIndent()
)
val disasm = scope.disassembleSymbol("calc")
assertTrue(disasm.contains("CALL_DIRECT"), disasm)
assertFalse(disasm.contains("CALL_SLOT"), disasm)
assertEquals(0, scope.eval("calc()").toInt())
}
@Test
fun constructorAliasUsesDirectCall() = runTest {
val scope = Script.newScope()
scope.eval(
"""
fun calc() {
val ctor = Map
val m = ctor() as Map
m.size
}
""".trimIndent()
)
val disasm = scope.disassembleSymbol("calc")
assertTrue(disasm.contains("CALL_DIRECT"), disasm)
assertFalse(disasm.contains("CALL_SLOT"), disasm)
assertEquals(0, scope.eval("calc()").toInt())
}
@Test
fun ifExpressionConstructorAliasUsesDirectCall() = runTest {
val scope = Script.newScope()
scope.eval(
"""
fun calc(flag: Bool) {
val ctor = if(flag) Map else Map
val m = ctor() as Map
m.size
}
""".trimIndent()
)
val disasm = scope.disassembleSymbol("calc")
assertTrue(disasm.contains("CALL_DIRECT"), disasm)
assertFalse(disasm.contains("CALL_SLOT"), disasm)
assertEquals(0, scope.eval("calc(true)").toInt())
}
@Test
fun elvisConstructorAliasUsesDirectCall() = runTest {
val scope = Script.newScope()
scope.eval(
"""
fun calc() {
val ctor = null ?: Map
val m = ctor() as Map
m.size
}
""".trimIndent()
)
val disasm = scope.disassembleSymbol("calc")
assertTrue(disasm.contains("CALL_DIRECT"), disasm)
assertFalse(disasm.contains("CALL_SLOT"), disasm)
assertEquals(0, scope.eval("calc()").toInt())
}
@Test
fun localNamedFunctionUsesDirectCall() = runTest {
val scope = Script.newScope()
scope.eval(
"""
fun calc() {
fun twice(x: Int) { x * 2 }
twice(3)
}
""".trimIndent()
)
val disasm = scope.disassembleSymbol("calc")
assertTrue(disasm.contains("CALL_DIRECT"), disasm)
assertFalse(disasm.contains("CALL_SLOT"), disasm)
assertEquals(6, scope.eval("calc()").toInt())
}
@Test
fun localNamedFunctionAliasUsesDirectCall() = runTest {
val scope = Script.newScope()
scope.eval(
"""
fun calc() {
fun twice(x: Int) { x * 2 }
val f = twice
f(3)
}
""".trimIndent()
)
val disasm = scope.disassembleSymbol("calc")
assertTrue(disasm.contains("CALL_DIRECT"), disasm)
assertFalse(disasm.contains("CALL_SLOT"), disasm)
assertEquals(6, scope.eval("calc()").toInt())
}
@Test
fun optionalIndexPreIncSkipsOnNullReceiver() = runTest {
eval(