diff --git a/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt b/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt index 30381f6aaae..94a86cc5fe4 100644 --- a/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt +++ b/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt @@ -174,26 +174,27 @@ class KotlinJsr223ScriptEngineIT { @Test fun testInvocable() { val engine = ScriptEngineManager().getEngineByExtension("kts")!! - val res1 = engine.eval(""" + val res0 = engine.eval(""" fun fn(x: Int) = x + 2 val obj = object { fun fn1(x: Int) = x + 3 } obj """) - Assert.assertNotNull(res1) + Assert.assertNotNull(res0) val invocator = engine as? Invocable Assert.assertNotNull(invocator) + val res1 = invocator!!.invokeFunction("fn", 6) + Assert.assertEquals(8, res1) assertThrows(NoSuchMethodException::class.java) { - invocator!!.invokeFunction("fn1", 3) + invocator.invokeFunction("fn1", 3) } - val res2 = invocator!!.invokeFunction("fn", 3) + val res2 = invocator.invokeFunction("fn", 3) Assert.assertEquals(5, res2) - // TODO: fix and restore -// assertThrows(NoSuchMethodException::class.java) { -// invocator!!.invokeMethod(res1, "fn", 3) -// } - val res3 = invocator.invokeMethod(res1, "fn1", 3) + assertThrows(NoSuchMethodException::class.java) { + invocator.invokeMethod(res0, "fn", 3) + } + val res3 = invocator.invokeMethod(res0, "fn1", 3) Assert.assertEquals(6, res3) } diff --git a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223InvocableScriptEngine.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223InvocableScriptEngine.kt index 250f9ca81db..319642330e0 100644 --- a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223InvocableScriptEngine.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223InvocableScriptEngine.kt @@ -24,9 +24,6 @@ interface KotlinJsr223InvocableScriptEngine : Invocable { val baseClassLoader: ClassLoader - fun instancesForInvokeSearch(requestedReceiver: Any) = - sequenceOf(requestedReceiver) + backwardInstancesHistory.filterNot { it == requestedReceiver } - override fun invokeFunction(name: String?, vararg args: Any?): Any? { if (name == null) throw AssertionError("function name cannot be null") return invokeImpl(backwardInstancesHistory, name, args) @@ -35,7 +32,7 @@ interface KotlinJsr223InvocableScriptEngine : Invocable { override fun invokeMethod(thiz: Any?, name: String?, vararg args: Any?): Any? { if (name == null) throw java.lang.NullPointerException("method name cannot be null") if (thiz == null) throw IllegalArgumentException("cannot invoke method on the null object") - return invokeImpl(instancesForInvokeSearch(thiz), name, args) + return invokeImpl(sequenceOf(thiz), name, args) } private fun invokeImpl(possibleReceivers: Sequence, name: String, args: Array): Any? { @@ -68,7 +65,7 @@ interface KotlinJsr223InvocableScriptEngine : Invocable { override fun getInterface(thiz: Any?, clasz: Class?): T? { if (thiz == null) throw IllegalArgumentException("object cannot be null") - return proxyInterface(instancesForInvokeSearch(thiz), clasz) + return proxyInterface(sequenceOf(thiz), clasz) } private fun proxyInterface(possibleReceivers: Sequence, clasz: Class?): T? {