commit 80fcdc27792df8e8fffe509fc912e6f5a24eae26
parent 7a23afaa826cf2239608516c5e2e65ba0bca662e
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Mon, 27 May 2024 22:05:49 +0200

fix(scripting): function arguments

Diffstat:
Mcommon/src/main/kotlin/me/rhunk/snapenhance/common/scripting/JSModule.kt | 24++++++++++--------------
Mcommon/src/main/kotlin/me/rhunk/snapenhance/common/scripting/ktx/RhinoKtx.kt | 6+++++-
2 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/scripting/JSModule.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/scripting/JSModule.kt @@ -14,7 +14,6 @@ import me.rhunk.snapenhance.common.scripting.type.ModuleInfo import me.rhunk.snapenhance.common.scripting.type.Permissions import me.rhunk.snapenhance.common.scripting.ui.InterfaceManager import org.mozilla.javascript.Function -import org.mozilla.javascript.NativeJavaObject import org.mozilla.javascript.ScriptableObject import org.mozilla.javascript.Undefined import org.mozilla.javascript.Wrapper @@ -73,26 +72,21 @@ class JSModule( ) moduleObject.putFunction("setField") { args -> - val obj = args?.get(0) as? NativeJavaObject ?: return@putFunction Undefined.instance + val obj = args?.get(0) ?: return@putFunction Undefined.instance val name = args[1].toString() - val value = args[2].let { - when (it) { - is Wrapper -> it.unwrap() - else -> it - } - } - val field = obj.unwrap().javaClass.declaredFields.find { it.name == name } ?: return@putFunction Undefined.instance + val value = args[2] + val field = obj.javaClass.declaredFields.find { it.name == name } ?: return@putFunction Undefined.instance field.isAccessible = true - field.set(obj.unwrap(), value.toPrimitiveValue(lazy { field.type.name })) + field.set(obj, value.toPrimitiveValue(lazy { field.type.name })) Undefined.instance } moduleObject.putFunction("getField") { args -> - val obj = args?.get(0) as? NativeJavaObject ?: return@putFunction Undefined.instance + val obj = args?.get(0) ?: return@putFunction Undefined.instance val name = args[1].toString() - val field = obj.unwrap().javaClass.declaredFields.find { it.name == name } ?: return@putFunction Undefined.instance + val field = obj.javaClass.declaredFields.find { it.name == name } ?: return@putFunction Undefined.instance field.isAccessible = true - field.get(obj.unwrap()) + field.get(obj) } moduleObject.putFunction("sleep") { args -> @@ -126,7 +120,9 @@ class JSModule( scriptableObject("JavaClassWrapper") { putFunction("newInstance") newInstance@{ args -> val constructor = clazz.declaredConstructors.find { - it.parameterCount == (args?.size ?: 0) + it.parameterTypes.zip(args ?: emptyArray()).all { (type, arg) -> + type.isAssignableFrom(arg?.javaClass ?: return@all false) + } } ?: return@newInstance Undefined.instance constructor.newInstance(*args ?: emptyArray()) } diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/scripting/ktx/RhinoKtx.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/scripting/ktx/RhinoKtx.kt @@ -42,7 +42,11 @@ fun ScriptableObject.putFunction(name: String, proxy: Scriptable.(Array<out Any? thisObj: Scriptable, args: Array<out Any>? ): Any? { - return thisObj.proxy(args) + return thisObj.proxy(args?.map { + if (it is Wrapper) { + it.unwrap() + } else it + }?.toTypedArray()) } }) }