diff --git a/build.gradle.kts b/build.gradle.kts index 93ee587..9ac26cf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ java { allprojects { group = "com.instancify.scriptify" - version = "1.3.6-SNAPSHOT" + version = "1.3.7-SNAPSHOT" } subprojects { diff --git a/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsFunction.java b/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsFunction.java index 5e344e4..f21920e 100644 --- a/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsFunction.java +++ b/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsFunction.java @@ -4,8 +4,11 @@ import com.instancify.scriptify.api.script.Script; import com.instancify.scriptify.api.script.function.ScriptFunction; import com.instancify.scriptify.api.script.function.argument.ScriptFunctionArgument; -import org.graalvm.polyglot.proxy.ProxyExecutable; import org.graalvm.polyglot.Value; +import org.graalvm.polyglot.proxy.ProxyExecutable; + +import java.util.ArrayList; +import java.util.List; public class JsFunction implements ProxyExecutable { @@ -21,7 +24,7 @@ public JsFunction(Script script, ScriptFunction function) { public Object execute(Value... arguments) { ScriptFunctionArgument[] args = new ScriptFunctionArgument[arguments.length]; for (int i = 0; i < arguments.length; i++) { - args[i] = ScriptFunctionArgument.of(arguments[i].as(Object.class)); + args[i] = ScriptFunctionArgument.of(convertValue(arguments[i])); } try { return function.invoke(script, args); @@ -29,4 +32,29 @@ public Object execute(Value... arguments) { throw new RuntimeException(e); } } + + /** + * Converts the Value object to the appropriate Java type. + */ + private Object convertValue(Value value) { + if (value.isNull()) { + return null; + } else if (value.hasArrayElements()) { + List list = new ArrayList<>(); + for (long j = 0; j < value.getArraySize(); j++) { + list.add(convertValue(value.getArrayElement(j))); + } + return list; + } else if (value.isHostObject()) { + return value.asHostObject(); + } else if (value.isString()) { + return value.asString(); + } else if (value.isBoolean()) { + return value.asBoolean(); + } else if (value.isNumber()) { + return value.as(Number.class); + } else { + return value.as(Object.class); + } + } }