mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-12 13:17:42 +02:00
feat(core/scripting): handle setArg primitive
- add toString for Wrapper objects
This commit is contained in:
@ -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
|
||||
}
|
||||
|
||||
|
@ -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" +
|
||||
")"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user