Specialize JSCValueEncoder for id instead of NSArray
Reviewed By: kathryngray Differential Revision: D5355723 fbshipit-source-id: a992514c92143fcac52f8e35824c665a1cb44ea4
This commit is contained in:
parent
782453d35e
commit
1cd276ab5c
|
@ -1164,8 +1164,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
|
|||
RCT_PROFILE_BEGIN_EVENT(0, @"callFunctionOnModule", (@{ @"module": module, @"method": method }));
|
||||
__block JSValue *ret = nil;
|
||||
NSError *errorObj = tryAndReturnError(^{
|
||||
Value result = self->_reactInstance->callFunctionSync(
|
||||
[module UTF8String], [method UTF8String], arguments);
|
||||
Value result = self->_reactInstance->callFunctionSync([module UTF8String], [method UTF8String], (id)arguments);
|
||||
JSContext *context = contextForGlobalContextRef(JSC_JSContextGetGlobalContext(result.context()));
|
||||
ret = [JSC_JSValue(result.context()) valueWithJSValueRef:result inContext:context];
|
||||
});
|
||||
|
|
|
@ -26,16 +26,10 @@ std::vector<std::unique_ptr<NativeModule>> createNativeModules(NSArray<RCTModule
|
|||
|
||||
JSContext *contextForGlobalContextRef(JSGlobalContextRef contextRef);
|
||||
|
||||
/*
|
||||
* The ValueEncoder<NSArray *>::toValue is used by JSCExecutor callFunctionSync.
|
||||
* Note: Because the NSArray * is really a NSArray * __strong the toValue is
|
||||
* accepting NSArray *const __strong instead of NSArray *&&.
|
||||
*/
|
||||
template <>
|
||||
struct ValueEncoder<NSArray *> {
|
||||
static Value toValue(JSGlobalContextRef ctx, NSArray *const __strong array)
|
||||
{
|
||||
JSValue *value = [JSC_JSValue(ctx) valueWithObject:array inContext:contextForGlobalContextRef(ctx)];
|
||||
template<>
|
||||
struct JSCValueEncoder<id> {
|
||||
static Value toJSCValue(JSGlobalContextRef ctx, id obj) {
|
||||
JSValue *value = [JSC_JSValue(ctx) valueWithObject:obj inContext:contextForGlobalContextRef(ctx)];
|
||||
return {ctx, [value JSValueRef]};
|
||||
}
|
||||
};
|
||||
|
|
|
@ -36,8 +36,19 @@ private:
|
|||
folly::dynamic m_jscConfig;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct ValueEncoder;
|
||||
template<typename T>
|
||||
struct JSCValueEncoder {
|
||||
// If you get a build error here, it means the compiler can't see the template instantation of toJSCValue
|
||||
// applicable to your type.
|
||||
static const Value toJSCValue(JSGlobalContextRef ctx, T&& value);
|
||||
};
|
||||
|
||||
template<>
|
||||
struct JSCValueEncoder<folly::dynamic> {
|
||||
static const Value toJSCValue(JSGlobalContextRef ctx, const folly::dynamic &&value) {
|
||||
return Value::fromDynamic(ctx, value);
|
||||
}
|
||||
};
|
||||
|
||||
class RN_EXPORT JSCExecutor : public JSExecutor {
|
||||
public:
|
||||
|
@ -69,7 +80,7 @@ public:
|
|||
Value callFunctionSync(
|
||||
const std::string& module, const std::string& method, T&& args) {
|
||||
return callFunctionSyncWithValue(
|
||||
module, method, ValueEncoder<typename std::decay<T>::type>::toValue(
|
||||
module, method, JSCValueEncoder<typename std::decay<T>::type>::toJSCValue(
|
||||
m_context, std::forward<T>(args)));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue