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:
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" +
+ ")"
+ }
}