From b8d6ff01a69692f8387680bf470f4ff8012cbc7c Mon Sep 17 00:00:00 2001 From: sergeych Date: Sat, 1 Nov 2025 22:07:22 +0100 Subject: [PATCH] fixed invoke overriden field problem in dynamic and the dynamic's Lyng class. --- .../net/sergeych/lyng/obj/ObjDynamic.kt | 22 +++++++++++++++++-- lynglib/src/commonTest/kotlin/OOTest.kt | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjDynamic.kt b/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjDynamic.kt index eacabd2..6d1ea87 100644 --- a/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjDynamic.kt +++ b/lynglib/src/commonMain/kotlin/net/sergeych/lyng/obj/ObjDynamic.kt @@ -47,7 +47,9 @@ class ObjDynamicContext(val delegate: ObjDynamic) : Obj() { } } -open class ObjDynamic(var readCallback: Statement? = null,var writeCallback: Statement? = null) : Obj() { +open class ObjDynamic(var readCallback: Statement? = null, var writeCallback: Statement? = null) : Obj() { + + override val objClass: ObjClass = type override suspend fun readField(scope: Scope, name: String): ObjRecord { return readCallback?.execute(scope.createChildScope(Arguments(ObjString(name))))?.let { @@ -59,13 +61,29 @@ open class ObjDynamic(var readCallback: Statement? = null,var writeCallback: Sta ?: super.readField(scope, name) } + override suspend fun invokeInstanceMethod( + scope: Scope, + name: String, + args: Arguments, + onNotFoundResult: (() -> Obj?)? + ): Obj { + val over = readCallback?.execute( + scope.createChildScope( + Arguments(ObjString(name) + ) + ) + ) + return over?.invoke(scope, scope.thisObj, args) + ?: super.invokeInstanceMethod(scope, name, args, onNotFoundResult) + } + override suspend fun writeField(scope: Scope, name: String, newValue: Obj) { writeCallback?.execute(scope.createChildScope(Arguments(ObjString(name), newValue))) ?: super.writeField(scope, name, newValue) } override suspend fun getAt(scope: Scope, index: Obj): Obj { - return readCallback?.execute( scope.createChildScope(Arguments(index))) + return readCallback?.execute(scope.createChildScope(Arguments(index))) ?: super.getAt(scope, index) } diff --git a/lynglib/src/commonTest/kotlin/OOTest.kt b/lynglib/src/commonTest/kotlin/OOTest.kt index b2ce59e..0804683 100644 --- a/lynglib/src/commonTest/kotlin/OOTest.kt +++ b/lynglib/src/commonTest/kotlin/OOTest.kt @@ -183,7 +183,7 @@ class OOTest { x(1,2,3) assertEquals(6, x(1,2,3)) // v HERE v - assertEquals(15, (cc.foo.bar)(10,2,3)) + assertEquals(15, cc.foo.bar(10,2,3)) """) } } \ No newline at end of file