Skip to content

Commit 912b104

Browse files
alanleedevfacebook-github-bot
authored andcommitted
Fix crash with wrong type comparison in TurboModuleInteropUtils.kt (#50744)
Summary: Pull Request resolved: #50744 Crash was discovered after converting source code from Java to Kotlin. This was due to type checking against Kotlin types instead of Java types. Also added minor refactoring of code Changelog: [Internal] Reviewed By: Abbondanzo Differential Revision: D73064216 fbshipit-source-id: 3429f0627740438be3bbc345c9e7b2c4a535da7e
1 parent cd031e5 commit 912b104

File tree

1 file changed

+32
-32
lines changed

1 file changed

+32
-32
lines changed

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/turbomodule/core/TurboModuleInteropUtils.kt

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
package com.facebook.react.internal.turbomodule.core
99

10-
import com.facebook.infer.annotation.Assertions
1110
import com.facebook.proguard.annotations.DoNotStrip
1211
import com.facebook.react.bridge.Callback
1312
import com.facebook.react.bridge.Dynamic
@@ -56,9 +55,9 @@ internal object TurboModuleInteropUtils {
5655
if (returnType != MutableMap::class.java) {
5756
throw ParsingException(moduleName, "getConstants must return a Map")
5857
}
59-
} else if (annotation != null &&
60-
(annotation.isBlockingSynchronousMethod && returnType == Void.TYPE ||
61-
!annotation.isBlockingSynchronousMethod && returnType != Void.TYPE)) {
58+
} else if ((annotation != null) &&
59+
((annotation.isBlockingSynchronousMethod && returnType == java.lang.Void.TYPE) ||
60+
(!annotation.isBlockingSynchronousMethod && returnType != java.lang.Void.TYPE))) {
6261
throw ParsingException(
6362
moduleName,
6463
"TurboModule system assumes returnType == void iff the method is synchronous.")
@@ -77,8 +76,8 @@ internal object TurboModuleInteropUtils {
7776

7877
private fun getMethodsFromModule(module: NativeModule): Array<Method> {
7978
var classForMethods: Class<out NativeModule> = module.javaClass
80-
val superClass = classForMethods.superclass as Class<out NativeModule>
81-
if (TurboModule::class.java.isAssignableFrom(superClass)) {
79+
val superClass = classForMethods.superclass as? Class<out NativeModule>
80+
if (superClass != null && TurboModule::class.java.isAssignableFrom(superClass)) {
8281
// For java module that is based on generated flow-type spec, inspect the
8382
// spec abstract class instead, which is the super class of the given java
8483
// module.
@@ -123,11 +122,11 @@ internal object TurboModuleInteropUtils {
123122
return "F"
124123
}
125124

126-
if (paramClass == Boolean::class.java ||
127-
paramClass == Int::class.java ||
128-
paramClass == Double::class.java ||
129-
paramClass == Float::class.java ||
130-
paramClass == String::class.java ||
125+
if (paramClass == java.lang.Boolean::class.java ||
126+
paramClass == java.lang.Integer::class.java ||
127+
paramClass == java.lang.Double::class.java ||
128+
paramClass == java.lang.Float::class.java ||
129+
paramClass == java.lang.String::class.java ||
131130
paramClass == Callback::class.java ||
132131
paramClass == Promise::class.java ||
133132
paramClass == ReadableMap::class.java ||
@@ -147,31 +146,31 @@ internal object TurboModuleInteropUtils {
147146
methodName: String,
148147
returnClass: Class<*>
149148
): String {
150-
if (returnClass == Boolean::class.javaPrimitiveType) {
149+
if (returnClass == java.lang.Boolean::class.javaPrimitiveType) {
151150
return "Z"
152151
}
153152

154-
if (returnClass == Int::class.javaPrimitiveType) {
153+
if (returnClass == java.lang.Integer::class.javaPrimitiveType) {
155154
return "I"
156155
}
157156

158-
if (returnClass == Double::class.javaPrimitiveType) {
157+
if (returnClass == java.lang.Double::class.javaPrimitiveType) {
159158
return "D"
160159
}
161160

162-
if (returnClass == Float::class.javaPrimitiveType) {
161+
if (returnClass == java.lang.Float::class.javaPrimitiveType) {
163162
return "F"
164163
}
165164

166-
if (returnClass == Void.TYPE) {
165+
if (returnClass == java.lang.Void.TYPE) {
167166
return "V"
168167
}
169168

170-
if (returnClass == Boolean::class.java ||
171-
returnClass == Int::class.java ||
172-
returnClass == Double::class.java ||
173-
returnClass == Float::class.java ||
174-
returnClass == String::class.java ||
169+
if (returnClass == java.lang.Boolean::class.java ||
170+
returnClass == java.lang.Integer::class.java ||
171+
returnClass == java.lang.Double::class.java ||
172+
returnClass == java.lang.Float::class.java ||
173+
returnClass == java.lang.String::class.java ||
175174
returnClass == WritableMap::class.java ||
176175
returnClass == WritableArray::class.java ||
177176
returnClass == MutableMap::class.java) {
@@ -186,8 +185,8 @@ internal object TurboModuleInteropUtils {
186185

187186
private fun convertClassToJniType(cls: Class<*>): String {
188187
val canonicalName = cls.canonicalName
189-
Assertions.assertNotNull(canonicalName, "Class must have a canonical name")
190-
return 'L'.toString() + canonicalName!!.replace('.', '/') + ';'
188+
requireNotNull(canonicalName) { "Class must have a canonical name" }
189+
return 'L'.toString() + canonicalName.replace('.', '/') + ';'
191190
}
192191

193192
private fun getJsArgCount(
@@ -234,24 +233,25 @@ internal object TurboModuleInteropUtils {
234233
i += 1
235234
}
236235

237-
if (returnClass == Boolean::class.javaPrimitiveType || returnClass == Boolean::class.java) {
236+
if (returnClass == java.lang.Boolean::class.javaPrimitiveType ||
237+
returnClass == java.lang.Boolean::class.java) {
238238
return "BooleanKind"
239239
}
240240

241-
if (returnClass == Double::class.javaPrimitiveType ||
242-
returnClass == Double::class.java ||
243-
returnClass == Float::class.javaPrimitiveType ||
244-
returnClass == Float::class.java ||
245-
returnClass == Int::class.javaPrimitiveType ||
246-
returnClass == Int::class.java) {
241+
if (returnClass == java.lang.Double::class.javaPrimitiveType ||
242+
returnClass == java.lang.Double::class.java ||
243+
returnClass == java.lang.Float::class.javaPrimitiveType ||
244+
returnClass == java.lang.Float::class.java ||
245+
returnClass == java.lang.Integer::class.javaPrimitiveType ||
246+
returnClass == java.lang.Integer::class.java) {
247247
return "NumberKind"
248248
}
249249

250-
if (returnClass == String::class.java) {
250+
if (returnClass == java.lang.String::class.java) {
251251
return "StringKind"
252252
}
253253

254-
if (returnClass == Void.TYPE) {
254+
if (returnClass == java.lang.Void.TYPE) {
255255
return "VoidKind"
256256
}
257257

0 commit comments

Comments
 (0)