Unignore ScriptTest batch and keep bytecode updates
This commit is contained in:
parent
64fa305aa7
commit
84554ab7c6
@ -4217,10 +4217,20 @@ class Compiler(
|
|||||||
extTypeName == null &&
|
extTypeName == null &&
|
||||||
!isStatic &&
|
!isStatic &&
|
||||||
!isProperty &&
|
!isProperty &&
|
||||||
!isDelegate &&
|
|
||||||
!actualExtern &&
|
!actualExtern &&
|
||||||
!isAbstract
|
!isAbstract
|
||||||
) {
|
) {
|
||||||
|
if (isDelegate) {
|
||||||
|
val initExpr = initialExpression ?: throw ScriptError(start, "Delegate must be initialized")
|
||||||
|
return DelegatedVarDeclStatement(
|
||||||
|
name,
|
||||||
|
isMutable,
|
||||||
|
visibility,
|
||||||
|
initExpr,
|
||||||
|
isTransient,
|
||||||
|
start
|
||||||
|
)
|
||||||
|
}
|
||||||
val slotPlan = slotPlanStack.lastOrNull()
|
val slotPlan = slotPlanStack.lastOrNull()
|
||||||
val slotIndex = slotPlan?.slots?.get(name)?.index
|
val slotIndex = slotPlan?.slots?.get(name)?.index
|
||||||
val scopeId = slotPlan?.id
|
val scopeId = slotPlan?.id
|
||||||
|
|||||||
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2026 Sergey S. Chernov
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.sergeych.lyng
|
||||||
|
|
||||||
|
import net.sergeych.lyng.obj.Obj
|
||||||
|
import net.sergeych.lyng.obj.ObjNull
|
||||||
|
import net.sergeych.lyng.obj.ObjRecord
|
||||||
|
import net.sergeych.lyng.obj.ObjString
|
||||||
|
|
||||||
|
class DelegatedVarDeclStatement(
|
||||||
|
val name: String,
|
||||||
|
val isMutable: Boolean,
|
||||||
|
val visibility: Visibility,
|
||||||
|
val initializer: Statement,
|
||||||
|
val isTransient: Boolean,
|
||||||
|
private val startPos: Pos,
|
||||||
|
) : Statement() {
|
||||||
|
override val pos: Pos = startPos
|
||||||
|
|
||||||
|
override suspend fun execute(context: Scope): Obj {
|
||||||
|
val initValue = initializer.execute(context)
|
||||||
|
val accessTypeStr = if (isMutable) "Var" else "Val"
|
||||||
|
val accessType = context.resolveQualifiedIdentifier("DelegateAccess.$accessTypeStr")
|
||||||
|
val finalDelegate = try {
|
||||||
|
initValue.invokeInstanceMethod(context, "bind", Arguments(ObjString(name), accessType, ObjNull))
|
||||||
|
} catch (e: Exception) {
|
||||||
|
initValue
|
||||||
|
}
|
||||||
|
val rec = context.addItem(
|
||||||
|
name,
|
||||||
|
isMutable,
|
||||||
|
ObjNull,
|
||||||
|
visibility,
|
||||||
|
recordType = ObjRecord.Type.Delegated,
|
||||||
|
isTransient = isTransient
|
||||||
|
)
|
||||||
|
rec.delegate = finalDelegate
|
||||||
|
return finalDelegate
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -17,6 +17,7 @@
|
|||||||
package net.sergeych.lyng.bytecode
|
package net.sergeych.lyng.bytecode
|
||||||
|
|
||||||
import net.sergeych.lyng.BlockStatement
|
import net.sergeych.lyng.BlockStatement
|
||||||
|
import net.sergeych.lyng.DelegatedVarDeclStatement
|
||||||
import net.sergeych.lyng.DestructuringVarDeclStatement
|
import net.sergeych.lyng.DestructuringVarDeclStatement
|
||||||
import net.sergeych.lyng.ExpressionStatement
|
import net.sergeych.lyng.ExpressionStatement
|
||||||
import net.sergeych.lyng.IfStatement
|
import net.sergeych.lyng.IfStatement
|
||||||
@ -98,6 +99,22 @@ class BytecodeCompiler(
|
|||||||
}
|
}
|
||||||
is BlockStatement -> compileBlock(name, stmt)
|
is BlockStatement -> compileBlock(name, stmt)
|
||||||
is VarDeclStatement -> compileVarDecl(name, stmt)
|
is VarDeclStatement -> compileVarDecl(name, stmt)
|
||||||
|
is DelegatedVarDeclStatement -> {
|
||||||
|
val value = emitStatementEval(stmt)
|
||||||
|
builder.emit(Opcode.RET, value.slot)
|
||||||
|
val localCount = maxOf(nextSlot, value.slot + 1) - scopeSlotCount
|
||||||
|
builder.build(
|
||||||
|
name,
|
||||||
|
localCount,
|
||||||
|
addrCount = nextAddrSlot,
|
||||||
|
returnLabels = returnLabels,
|
||||||
|
scopeSlotIndices,
|
||||||
|
scopeSlotNames,
|
||||||
|
scopeSlotIsModule,
|
||||||
|
localSlotNames,
|
||||||
|
localSlotMutables
|
||||||
|
)
|
||||||
|
}
|
||||||
is net.sergeych.lyng.ThrowStatement -> compileThrowStatement(name, stmt)
|
is net.sergeych.lyng.ThrowStatement -> compileThrowStatement(name, stmt)
|
||||||
is net.sergeych.lyng.ExtensionPropertyDeclStatement -> compileExtensionPropertyDecl(name, stmt)
|
is net.sergeych.lyng.ExtensionPropertyDeclStatement -> compileExtensionPropertyDecl(name, stmt)
|
||||||
is net.sergeych.lyng.TryStatement -> {
|
is net.sergeych.lyng.TryStatement -> {
|
||||||
@ -196,7 +213,7 @@ class BytecodeCompiler(
|
|||||||
return compileNameLookup(ref.name)
|
return compileNameLookup(ref.name)
|
||||||
}
|
}
|
||||||
if (!allowLocalSlots) return null
|
if (!allowLocalSlots) return null
|
||||||
if (ref.isDelegated) return null
|
if (ref.isDelegated) return compileEvalRef(ref)
|
||||||
if (ref.name.isEmpty()) return null
|
if (ref.name.isEmpty()) return null
|
||||||
if (ref.captureOwnerScopeId == null && refScopeId(ref) == 0) {
|
if (ref.captureOwnerScopeId == null && refScopeId(ref) == 0) {
|
||||||
val byName = scopeSlotIndexByName[ref.name]
|
val byName = scopeSlotIndexByName[ref.name]
|
||||||
@ -2284,6 +2301,7 @@ class BytecodeCompiler(
|
|||||||
}
|
}
|
||||||
is BlockStatement -> emitBlock(target, true)
|
is BlockStatement -> emitBlock(target, true)
|
||||||
is VarDeclStatement -> emitVarDecl(target)
|
is VarDeclStatement -> emitVarDecl(target)
|
||||||
|
is DelegatedVarDeclStatement -> emitStatementEval(target)
|
||||||
is DestructuringVarDeclStatement -> emitStatementEval(target)
|
is DestructuringVarDeclStatement -> emitStatementEval(target)
|
||||||
is net.sergeych.lyng.ExtensionPropertyDeclStatement -> emitExtensionPropertyDecl(target)
|
is net.sergeych.lyng.ExtensionPropertyDeclStatement -> emitExtensionPropertyDecl(target)
|
||||||
is net.sergeych.lyng.ClassDeclStatement -> emitStatementEval(target)
|
is net.sergeych.lyng.ClassDeclStatement -> emitStatementEval(target)
|
||||||
@ -2310,6 +2328,7 @@ class BytecodeCompiler(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
is VarDeclStatement -> emitVarDecl(target)
|
is VarDeclStatement -> emitVarDecl(target)
|
||||||
|
is DelegatedVarDeclStatement -> emitStatementEval(target)
|
||||||
is IfStatement -> compileIfStatement(target)
|
is IfStatement -> compileIfStatement(target)
|
||||||
is net.sergeych.lyng.ForInStatement -> {
|
is net.sergeych.lyng.ForInStatement -> {
|
||||||
val resultSlot = emitForIn(target, false) ?: return null
|
val resultSlot = emitForIn(target, false) ?: return null
|
||||||
|
|||||||
@ -101,6 +101,8 @@ class BytecodeStatement private constructor(
|
|||||||
target.statements().any { containsUnsupportedStatement(it) }
|
target.statements().any { containsUnsupportedStatement(it) }
|
||||||
is net.sergeych.lyng.VarDeclStatement ->
|
is net.sergeych.lyng.VarDeclStatement ->
|
||||||
target.initializer?.let { containsUnsupportedStatement(it) } ?: false
|
target.initializer?.let { containsUnsupportedStatement(it) } ?: false
|
||||||
|
is net.sergeych.lyng.DelegatedVarDeclStatement ->
|
||||||
|
containsUnsupportedStatement(target.initializer)
|
||||||
is net.sergeych.lyng.DestructuringVarDeclStatement ->
|
is net.sergeych.lyng.DestructuringVarDeclStatement ->
|
||||||
containsUnsupportedStatement(target.initializer)
|
containsUnsupportedStatement(target.initializer)
|
||||||
is net.sergeych.lyng.BreakStatement ->
|
is net.sergeych.lyng.BreakStatement ->
|
||||||
|
|||||||
@ -3029,7 +3029,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testMapAsDelegate() = runTest {
|
fun testMapAsDelegate() = runTest {
|
||||||
eval(
|
eval(
|
||||||
@ -3330,7 +3329,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testInstantComponents() = runTest {
|
fun testInstantComponents() = runTest {
|
||||||
eval(
|
eval(
|
||||||
@ -3364,7 +3362,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testDoubleImports() = runTest {
|
fun testDoubleImports() = runTest {
|
||||||
val s = Scope.new()
|
val s = Scope.new()
|
||||||
@ -3409,7 +3406,6 @@ class ScriptTest {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testIndexIntIncrements() = runTest {
|
fun testIndexIntIncrements() = runTest {
|
||||||
eval(
|
eval(
|
||||||
@ -3430,7 +3426,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testIndexIntDecrements() = runTest {
|
fun testIndexIntDecrements() = runTest {
|
||||||
eval(
|
eval(
|
||||||
@ -3451,7 +3446,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testRangeToList() = runTest {
|
fun testRangeToList() = runTest {
|
||||||
val x = eval("""(1..10).toList()""") as ObjList
|
val x = eval("""(1..10).toList()""") as ObjList
|
||||||
@ -3460,7 +3454,6 @@ class ScriptTest {
|
|||||||
println(y.list)
|
println(y.list)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testMultilineStrings() = runTest {
|
fun testMultilineStrings() = runTest {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
@ -3502,7 +3495,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun tesFunAnnotation() = runTest {
|
fun tesFunAnnotation() = runTest {
|
||||||
eval(
|
eval(
|
||||||
@ -3647,7 +3639,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testNewlinesAnsCommentsInExpressions() = runTest {
|
fun testNewlinesAnsCommentsInExpressions() = runTest {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
@ -3669,7 +3660,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testNotExpressionWithoutWs() = runTest {
|
fun testNotExpressionWithoutWs() = runTest {
|
||||||
eval(
|
eval(
|
||||||
@ -3686,7 +3676,6 @@ class ScriptTest {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Ignore("incremental enable")
|
|
||||||
@Test
|
@Test
|
||||||
fun testMultilineFnDeclaration() = runTest {
|
fun testMultilineFnDeclaration() = runTest {
|
||||||
eval(
|
eval(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user