1879827bbSŁukasz Kosmaty // Copyright © 2021-present 650 Industries, Inc. (aka Expo)
2879827bbSŁukasz Kosmaty
3879827bbSŁukasz Kosmaty #include "JavaScriptFunction.h"
4879827bbSŁukasz Kosmaty #include "types/JNIToJSIConverter.h"
5879827bbSŁukasz Kosmaty #include "types/AnyType.h"
6879827bbSŁukasz Kosmaty
7879827bbSŁukasz Kosmaty namespace expo {
8879827bbSŁukasz Kosmaty
registerNatives()9879827bbSŁukasz Kosmaty void JavaScriptFunction::registerNatives() {
10879827bbSŁukasz Kosmaty registerHybrid({
11879827bbSŁukasz Kosmaty makeNativeMethod("invoke", JavaScriptFunction::invoke),
12879827bbSŁukasz Kosmaty });
13879827bbSŁukasz Kosmaty }
14879827bbSŁukasz Kosmaty
JavaScriptFunction(std::weak_ptr<JavaScriptRuntime> runtime,std::shared_ptr<jsi::Function> jsFunction)15879827bbSŁukasz Kosmaty JavaScriptFunction::JavaScriptFunction(
16879827bbSŁukasz Kosmaty std::weak_ptr<JavaScriptRuntime> runtime,
17879827bbSŁukasz Kosmaty std::shared_ptr<jsi::Function> jsFunction
18879827bbSŁukasz Kosmaty ) : runtimeHolder(std::move(runtime)), jsFunction(std::move(jsFunction)) {
19879827bbSŁukasz Kosmaty runtimeHolder.ensureRuntimeIsValid();
20879827bbSŁukasz Kosmaty }
21879827bbSŁukasz Kosmaty
JavaScriptFunction(WeakRuntimeHolder runtime,std::shared_ptr<jsi::Function> jsFunction)22879827bbSŁukasz Kosmaty JavaScriptFunction::JavaScriptFunction(
23879827bbSŁukasz Kosmaty WeakRuntimeHolder runtime,
24879827bbSŁukasz Kosmaty std::shared_ptr<jsi::Function> jsFunction
25879827bbSŁukasz Kosmaty ) : runtimeHolder(std::move(runtime)), jsFunction(std::move(jsFunction)) {
26879827bbSŁukasz Kosmaty runtimeHolder.ensureRuntimeIsValid();
27879827bbSŁukasz Kosmaty }
28879827bbSŁukasz Kosmaty
get()29879827bbSŁukasz Kosmaty std::shared_ptr<jsi::Function> JavaScriptFunction::get() {
30879827bbSŁukasz Kosmaty return jsFunction;
31879827bbSŁukasz Kosmaty }
32879827bbSŁukasz Kosmaty
invoke(jni::alias_ref<jni::JArrayClass<jni::JObject>> args,jni::alias_ref<ExpectedType::javaobject> expectedReturnType)33879827bbSŁukasz Kosmaty jobject JavaScriptFunction::invoke(
34879827bbSŁukasz Kosmaty jni::alias_ref<jni::JArrayClass<jni::JObject>> args,
35879827bbSŁukasz Kosmaty jni::alias_ref<ExpectedType::javaobject> expectedReturnType
36879827bbSŁukasz Kosmaty ) {
37879827bbSŁukasz Kosmaty auto &rt = runtimeHolder.getJSRuntime();
38879827bbSŁukasz Kosmaty auto moduleRegistry = runtimeHolder.getModuleRegistry();
39879827bbSŁukasz Kosmaty JNIEnv *env = jni::Environment::current();
40879827bbSŁukasz Kosmaty
41879827bbSŁukasz Kosmaty size_t size = args->size();
42879827bbSŁukasz Kosmaty std::vector<jsi::Value> convertedArgs;
43879827bbSŁukasz Kosmaty convertedArgs.reserve(size);
44879827bbSŁukasz Kosmaty
45879827bbSŁukasz Kosmaty for (size_t i = 0; i < size; i++) {
46879827bbSŁukasz Kosmaty jni::local_ref<jni::JObject> arg = args->getElement(i);
47879827bbSŁukasz Kosmaty convertedArgs.push_back(convert(moduleRegistry, env, rt, std::move(arg)));
48879827bbSŁukasz Kosmaty }
49879827bbSŁukasz Kosmaty
50879827bbSŁukasz Kosmaty // TODO(@lukmccall): add better error handling
51879827bbSŁukasz Kosmaty jsi::Value result = jsFunction->call(rt, (const jsi::Value *) convertedArgs.data(), size);
52879827bbSŁukasz Kosmaty auto converter = AnyType(jni::make_local(expectedReturnType)).converter;
53879827bbSŁukasz Kosmaty auto convertedResult = converter->convert(rt, env, moduleRegistry, result);
54879827bbSŁukasz Kosmaty return convertedResult;
55879827bbSŁukasz Kosmaty }
56*29e8b6f8SŁukasz Kosmaty
newInstance(JSIInteropModuleRegistry * jsiInteropModuleRegistry,std::weak_ptr<JavaScriptRuntime> runtime,std::shared_ptr<jsi::Function> jsFunction)57*29e8b6f8SŁukasz Kosmaty jni::local_ref<JavaScriptFunction::javaobject> JavaScriptFunction::newInstance(
58*29e8b6f8SŁukasz Kosmaty JSIInteropModuleRegistry *jsiInteropModuleRegistry,
59*29e8b6f8SŁukasz Kosmaty std::weak_ptr<JavaScriptRuntime> runtime,
60*29e8b6f8SŁukasz Kosmaty std::shared_ptr<jsi::Function> jsFunction
61*29e8b6f8SŁukasz Kosmaty ) {
62*29e8b6f8SŁukasz Kosmaty auto function = JavaScriptFunction::newObjectCxxArgs(
63*29e8b6f8SŁukasz Kosmaty std::move(runtime),
64*29e8b6f8SŁukasz Kosmaty std::move(jsFunction)
65*29e8b6f8SŁukasz Kosmaty );
66*29e8b6f8SŁukasz Kosmaty jsiInteropModuleRegistry->jniDeallocator->addReference(function);
67*29e8b6f8SŁukasz Kosmaty return function;
68*29e8b6f8SŁukasz Kosmaty }
69879827bbSŁukasz Kosmaty } // namespace expo
70