Skip to content

Commit

Permalink
Replace getInt with asInt in native collections
Browse files Browse the repository at this point in the history
Reviewed By: mhorowitz

Differential Revision: D5904751

fbshipit-source-id: 995412196fd76ea60a65253719e49852322be6e6
  • Loading branch information
johnislarry authored and facebook-github-bot committed Oct 5, 2017
1 parent f8e1386 commit 790eabc
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 18 deletions.
13 changes: 3 additions & 10 deletions ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,9 @@ jdouble ReadableNativeArray::getDouble(jint index) {
}

jint ReadableNativeArray::getInt(jint index) {
auto integer = array_.at(index).getInt();
static_assert(std::is_same<decltype(integer), int64_t>::value,
"folly::dynamic int is not int64_t");
jint javaint = static_cast<jint>(integer);
if (integer != javaint) {
throwNewJavaException(
exceptions::gUnexpectedNativeTypeExceptionClass,
"Value '%lld' doesn't fit into a 32 bit signed int", integer);
}
return javaint;
const folly::dynamic& val = array_.at(index);
int64_t integer = convertDynamicIfIntegral(val);
return makeJIntOrThrow(integer);
}

const char* ReadableNativeArray::getString(jint index) {
Expand Down
35 changes: 27 additions & 8 deletions ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,9 @@ double ReadableNativeMap::getDoubleKey(const std::string& key) {
}

jint ReadableNativeMap::getIntKey(const std::string& key) {
auto integer = getMapValue(key).getInt();
jint javaint = static_cast<jint>(integer);
if (integer != javaint) {
throwNewJavaException(
exceptions::gUnexpectedNativeTypeExceptionClass,
"Value '%lld' doesn't fit into a 32 bit signed int", integer);
}
return javaint;
const folly::dynamic& val = getMapValue(key);
int64_t integer = convertDynamicIfIntegral(val);
return makeJIntOrThrow(integer);
}

local_ref<jstring> ReadableNativeMap::getStringKey(const std::string& key) {
Expand Down Expand Up @@ -146,5 +141,29 @@ void ReadableNativeMapKeySetIterator::registerNatives() {
});
}

jint makeJIntOrThrow(int64_t integer) {
jint javaint = static_cast<jint>(integer);
if (integer != javaint) {
throwNewJavaException(
exceptions::gUnexpectedNativeTypeExceptionClass,
"Value '%lld' doesn't fit into a 32 bit signed int", integer);
}
return javaint;
}

int64_t convertDynamicIfIntegral(const folly::dynamic& val) {
if (val.isInt()) {
return val.getInt();
}
double dbl = val.getDouble();
int64_t result = static_cast<int64_t>(dbl);
if (dbl != result) {
throwNewJavaException(
exceptions::gUnexpectedNativeTypeExceptionClass,
"Tried to read an int, but got a non-integral double: %f", dbl);
}
return result;
}

} // namespace react
} // namespace facebook
3 changes: 3 additions & 0 deletions ReactAndroid/src/main/jni/react/jni/ReadableNativeMap.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,8 @@ struct ReadableNativeMapKeySetIterator : jni::HybridClass<ReadableNativeMapKeySe
const folly::dynamic& map_;
};

jint makeJIntOrThrow(int64_t integer);
int64_t convertDynamicIfIntegral(const folly::dynamic&);

} // namespace react
} // namespace facebook

0 comments on commit 790eabc

Please sign in to comment.