Fix stdlib drop and add bytecode return/break test
This commit is contained in:
parent
8dfdbaa0a0
commit
7b3d92beb9
@ -5102,4 +5102,32 @@ class ScriptTest {
|
|||||||
assertEquals(ObjInt(3), r1)
|
assertEquals(ObjInt(3), r1)
|
||||||
assertEquals(ObjInt(4), r2)
|
assertEquals(ObjInt(4), r2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testReturnBreakValueBytecodeDisasm() = runTest {
|
||||||
|
val scope = Script.newScope()
|
||||||
|
scope.eval("""
|
||||||
|
fun firstPositive() {
|
||||||
|
for (i in 0..5)
|
||||||
|
if (i > 0) return i
|
||||||
|
-1
|
||||||
|
}
|
||||||
|
|
||||||
|
fun firstEvenOrMinus() {
|
||||||
|
val r = for (i in 1..7)
|
||||||
|
if (i % 2 == 0) break i
|
||||||
|
r
|
||||||
|
}
|
||||||
|
""".trimIndent())
|
||||||
|
val disasmReturn = scope.disassembleSymbol("firstPositive")
|
||||||
|
val disasmBreak = scope.disassembleSymbol("firstEvenOrMinus")
|
||||||
|
println("[DEBUG_LOG] firstPositive disasm:\n$disasmReturn")
|
||||||
|
println("[DEBUG_LOG] firstEvenOrMinus disasm:\n$disasmBreak")
|
||||||
|
assertFalse(disasmReturn.contains("not a compiled body"))
|
||||||
|
assertFalse(disasmBreak.contains("not a compiled body"))
|
||||||
|
assertFalse(disasmReturn.contains("EVAL_FALLBACK"))
|
||||||
|
assertFalse(disasmBreak.contains("EVAL_FALLBACK"))
|
||||||
|
assertEquals(ObjInt(1), scope.eval("firstPositive()"))
|
||||||
|
assertEquals(ObjInt(2), scope.eval("firstEvenOrMinus()"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,7 +65,11 @@ fun Iterable.filterNotNull(): List {
|
|||||||
/* Skip the first N elements of this iterable. */
|
/* Skip the first N elements of this iterable. */
|
||||||
fun Iterable.drop(n) {
|
fun Iterable.drop(n) {
|
||||||
var cnt = 0
|
var cnt = 0
|
||||||
filter { cnt++ >= n }
|
val result = []
|
||||||
|
for( item in this ) {
|
||||||
|
if( cnt++ >= n ) result.add(item)
|
||||||
|
}
|
||||||
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the first element or throw if the iterable is empty. */
|
/* Return the first element or throw if the iterable is empty. */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user