Skip to content

Commit dd888d3

Browse files
Dmitry Zakharovfacebook-github-bot
Dmitry Zakharov
authored andcommitted
Fix boolean conversion in sync RN method calls.
Reviewed By: fromcelticpark Differential Revision: D6408182 fbshipit-source-id: 251ab0cfe3197e59de0cb86816d5f0b908433b43
1 parent f5beceb commit dd888d3

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

ReactAndroid/src/main/jni/react/jni/MethodInvoker.cpp

+16-3
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ MethodInvoker::MethodInvoker(alias_ref<JReflectMethod::javaobject> method, std::
158158
isSync_(isSync) {
159159
CHECK(signature_.at(1) == '.') << "Improper module method signature";
160160
CHECK(isSync_ || signature_.at(0) == 'v') << "Non-sync hooks cannot have a non-void return type";
161-
}
161+
}
162162

163163
MethodCallResult MethodInvoker::invoke(std::weak_ptr<Instance>& instance, alias_ref<JBaseJavaModule::javaobject> module, const folly::dynamic& params) {
164164
#ifdef WITH_FBSYSTRACE
@@ -191,13 +191,26 @@ MethodCallResult MethodInvoker::invoke(std::weak_ptr<Instance>& instance, alias_
191191
return folly::dynamic(result); \
192192
}
193193

194+
#define PRIMITIVE_CASE_CASTING(METHOD, RESULT_TYPE) { \
195+
auto result = env->Call ## METHOD ## MethodA(module.get(), method_, args); \
196+
throwPendingJniExceptionAsCppException(); \
197+
return folly::dynamic(static_cast<RESULT_TYPE>(result)); \
198+
}
199+
194200
#define OBJECT_CASE(JNI_CLASS, ACTIONS) { \
195201
auto jobject = env->CallObjectMethodA(module.get(), method_, args); \
196202
throwPendingJniExceptionAsCppException(); \
197203
auto result = adopt_local(static_cast<JNI_CLASS::javaobject>(jobject)); \
198204
return folly::dynamic(result->ACTIONS()); \
199205
}
200206

207+
#define OBJECT_CASE_CASTING(JNI_CLASS, ACTIONS, RESULT_TYPE) { \
208+
auto jobject = env->CallObjectMethodA(module.get(), method_, args); \
209+
throwPendingJniExceptionAsCppException(); \
210+
auto result = adopt_local(static_cast<JNI_CLASS::javaobject>(jobject)); \
211+
return folly::dynamic(static_cast<RESULT_TYPE>(result->ACTIONS())); \
212+
}
213+
201214
char returnType = signature_.at(0);
202215
switch (returnType) {
203216
case 'v':
@@ -206,9 +219,9 @@ MethodCallResult MethodInvoker::invoke(std::weak_ptr<Instance>& instance, alias_
206219
return folly::none;
207220

208221
case 'z':
209-
PRIMITIVE_CASE(Boolean)
222+
PRIMITIVE_CASE_CASTING(Boolean, bool)
210223
case 'Z':
211-
OBJECT_CASE(JBoolean, value)
224+
OBJECT_CASE_CASTING(JBoolean, value, bool)
212225
case 'i':
213226
PRIMITIVE_CASE(Int)
214227
case 'I':

0 commit comments

Comments
 (0)