fix #37 AppliedContext optimization

This commit is contained in:
Sergey Chernov 2025-06-17 09:45:36 +04:00
parent 2d4c4d345d
commit d969d6d572
5 changed files with 31 additions and 17 deletions

View File

@ -0,0 +1,17 @@
package net.sergeych.lyng
/**
* Special version of the [Context] used to `apply` new this object to
* _parent context property.
*
* @param _parent context to apply to
* @param args arguments for the new context
* @param appliedContext the new context to apply, it will have lower priority except for `this` which
* will be reset by appliedContext's `this`.
*/
class AppliedContext(_parent: Context, args: Arguments, val appliedContext: Context)
: Context(_parent, args, appliedContext.pos, appliedContext.thisObj) {
override fun get(name: String): ObjRecord? =
if (name == "this") thisObj.asReadonly
else super.get(name) ?: appliedContext[name]
}

View File

@ -387,14 +387,14 @@ class Compiler(
val argsDeclaration = parseArgsDeclaration(cc)
if (argsDeclaration != null && argsDeclaration.endTokenType != Token.Type.ARROW)
throw ScriptError(startPos, "lambda must have either valid arguments declaration with '->' or no arguments")
val pos = cc.currentPos()
val body = parseBlock(cc, skipLeadingBrace = true)
var closure: Context? = null
val callStatement = statement {
// and the source closure of the lambda which might have other thisObj.
val context = closure!!.copy(pos, args).applyContext(this)
val context = AppliedContext(closure!!,args,this)
if (argsDeclaration == null) {
// no args: automatic var 'it'
val l = args.list

View File

@ -1,6 +1,6 @@
package net.sergeych.lyng
class Context(
open class Context(
val parent: Context?,
val args: Arguments = Arguments.EMPTY,
var pos: Pos = Pos.builtIn,
@ -13,15 +13,6 @@ class Context(
)
: this(Script.defaultContext, args, pos)
/**
* Making this context priority one
*/
fun applyContext(other: Context): Context {
if (other.thisObj != ObjVoid) thisObj = other.thisObj
appliedContext = other
return this
}
fun raiseNotImplemented(what: String = "operation"): Nothing = raiseError("$what is not implemented")
@Suppress("unused")
@ -74,15 +65,13 @@ class Context(
inline fun <reified T : Obj> thisAs(): T = (thisObj as? T)
?: raiseClassCastError("Cannot cast ${thisObj.objClass.className} to ${T::class.simpleName}")
internal var appliedContext: Context? = null
internal val objects = mutableMapOf<String, ObjRecord>()
operator fun get(name: String): ObjRecord? =
open operator fun get(name: String): ObjRecord? =
if (name == "this") thisObj.asReadonly
else {
objects[name]
?: parent?.get(name)
?: appliedContext?.get(name)
}
fun copy(pos: Pos, args: Arguments = Arguments.EMPTY, newThisObj: Obj? = null): Context =
@ -137,5 +126,4 @@ class Context(
fun containsLocal(name: String): Boolean = name in objects
}

View File

@ -1,4 +1,3 @@
package io.github.kotlin.fibonacci
import kotlinx.coroutines.test.runTest
import net.sergeych.lyng.*

View File

@ -0,0 +1,10 @@
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
class TypesTest {
@Test
fun testTypeCollection1() = runTest {
}
}