commit 102e2df4e78c2fbde21cf33f533be2281c75abeb
parent 0ba1eb4a8b067c8c8535409b3d432c912dc2e1a3
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sun,  8 Oct 2023 18:47:18 +0200

feat(core/scripting): primitive value handler

Diffstat:
Mcore/src/main/kotlin/me/rhunk/snapenhance/scripting/JSModule.kt | 2+-
Acore/src/main/kotlin/me/rhunk/snapenhance/scripting/PrimitiveUtil.kt | 18++++++++++++++++++
Mcore/src/main/kotlin/me/rhunk/snapenhance/scripting/core/impl/ScriptHooker.kt | 31+++++++++++--------------------
3 files changed, 30 insertions(+), 21 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 @@ -42,7 +42,7 @@ class JSModule( val value = args[2] val field = obj.unwrap().javaClass.declaredFields.find { it.name == name } ?: return@putFunction Undefined.instance field.isAccessible = true - field.set(obj.unwrap(), value) + field.set(obj.unwrap(), value.toPrimitiveValue(lazy { field.type.name })) Undefined.instance } diff --git a/core/src/main/kotlin/me/rhunk/snapenhance/scripting/PrimitiveUtil.kt b/core/src/main/kotlin/me/rhunk/snapenhance/scripting/PrimitiveUtil.kt @@ -0,0 +1,17 @@ +package me.rhunk.snapenhance.scripting + +fun Any?.toPrimitiveValue(type: Lazy<String>) = when (this) { + is Number -> when (type.value) { + "byte" -> this.toByte() + "short" -> this.toShort() + "int" -> this.toInt() + "long" -> this.toLong() + "float" -> this.toFloat() + "double" -> this.toDouble() + "boolean" -> this.toByte() != 0.toByte() + "char" -> this.toInt().toChar() + else -> this + } + is Boolean -> if (type.value == "boolean") this.toString().toBoolean() else this + else -> this +}+ \ No newline at end of file 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 @@ -6,6 +6,7 @@ import me.rhunk.snapenhance.hook.HookStage import me.rhunk.snapenhance.hook.Hooker import me.rhunk.snapenhance.hook.hook import me.rhunk.snapenhance.hook.hookConstructor +import me.rhunk.snapenhance.scripting.toPrimitiveValue import me.rhunk.snapenhance.scripting.type.ModuleInfo import org.mozilla.javascript.annotations.JSGetter import org.mozilla.javascript.annotations.JSSetter @@ -19,7 +20,12 @@ class ScriptHookCallback( ) { var result @JSGetter("result") get() = hookAdapter.getResult() - @JSSetter("result") set(result) = hookAdapter.setResult(result) + @JSSetter("result") set(result) = hookAdapter.setResult(result.toPrimitiveValue(lazy { + when (val member = hookAdapter.method()) { + is Method -> member.returnType.name + else -> "void" + } + })) val thisObject @JSGetter("thisObject") get() = hookAdapter.nullableThisObject<Any>() @@ -43,29 +49,14 @@ class ScriptHookCallback( fun arg(index: Int) = hookAdapter.argNullable<Any>(index) 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) + hookAdapter.setArg(index, value.toPrimitiveValue(lazy { parameterTypes[index].name })) } fun invokeOriginal() = hookAdapter.invokeOriginal() - fun invokeOriginal(args: Array<Any>) = hookAdapter.invokeOriginal(args) + fun invokeOriginal(args: Array<Any>) = hookAdapter.invokeOriginal(args.map { + it.toPrimitiveValue(lazy { parameterTypes[args.indexOf(it)].name }) ?: it + }.toTypedArray()) override fun toString(): String { return "ScriptHookCallback(\n" +