commit 7a77ea6935f8098f6e6835aa4a013f4efd0b3744
parent f2813d45c7cebbe59e0f37cd40fc303f536e209b
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sun,  8 Oct 2023 17:02:13 +0200

feat(core/scripting): handle setArg primitive
- add toString for Wrapper objects

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/scripting/JSModule.kt | 8+++++++-
Mcore/src/main/kotlin/me/rhunk/snapenhance/scripting/core/impl/ScriptHooker.kt | 40+++++++++++++++++++++++++++++++++++++++-
2 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/scripting/JSModule.kt b/core/src/main/kotlin/me/rhunk/snapenhance/scripting/JSModule.kt @@ -10,6 +10,7 @@ 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 import java.lang.reflect.Modifier class JSModule( @@ -88,7 +89,12 @@ class JSModule( } moduleObject.putFunction("logInfo") { args -> - scriptRuntime.logger.info(args?.joinToString(" ") ?: "") + scriptRuntime.logger.info(args?.joinToString(" ") { + when (it) { + is Wrapper -> it.unwrap().toString() + else -> it.toString() + } + } ?: "null") Undefined.instance } diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/scripting/core/impl/ScriptHooker.kt b/core/src/main/kotlin/me/rhunk/snapenhance/scripting/core/impl/ScriptHooker.kt @@ -9,7 +9,9 @@ import me.rhunk.snapenhance.hook.hookConstructor import me.rhunk.snapenhance.scripting.type.ModuleInfo import org.mozilla.javascript.annotations.JSGetter import org.mozilla.javascript.annotations.JSSetter +import java.lang.reflect.Constructor import java.lang.reflect.Member +import java.lang.reflect.Method class ScriptHookCallback( @@ -28,14 +30,50 @@ class ScriptHookCallback( val args @JSGetter("args") get() = hookAdapter.args().toList() + private val parameterTypes by lazy { + when (val member = hookAdapter.method()) { + is Method -> member.parameterTypes + is Constructor<*> -> member.parameterTypes + else -> emptyArray() + }.toList() + } + fun cancel() = hookAdapter.setResult(null) fun arg(index: Int) = hookAdapter.argNullable<Any>(index) - fun setArg(index: Int, any: Any) = hookAdapter.setArg(index, any) + fun setArg(index: Int, value: Any) { + val parameterType by lazy { parameterTypes[index] } + + if (value is Number && parameterType.isPrimitive) { + hookAdapter.setArg(index, when (parameterType.name) { + "byte" -> value.toByte() + "short" -> value.toShort() + "int" -> value.toInt() + "long" -> value.toLong() + "float" -> value.toFloat() + "double" -> value.toDouble() + "boolean" -> value.toByte() != 0.toByte() + "char" -> value.toInt().toChar() + else -> value + }) + return + } + + hookAdapter.setArg(index, value) + } fun invokeOriginal() = hookAdapter.invokeOriginal() + fun invokeOriginal(args: Array<Any>) = hookAdapter.invokeOriginal(args) + + override fun toString(): String { + return "ScriptHookCallback(\n" + + " thisObject=${ runCatching { thisObject.toString() }.getOrNull() },\n" + + " args=${ runCatching { args.toString() }.getOrNull() }\n" + + " result=${ runCatching { result.toString() }.getOrNull() },\n" + + ")" + } }