Replace getInt with asInt in native collections

Reviewed By: mhorowitz

Differential Revision: D5904751

fbshipit-source-id: 995412196fd76ea60a65253719e49852322be6e6
This commit is contained in:
Max Sherman 2017-10-05 09:57:46 -07:00 committed by Facebook Github Bot
parent f8e13868dd
commit 790eabcdff
3 changed files with 33 additions and 18 deletions

View File

@ -43,16 +43,9 @@ jdouble ReadableNativeArray::getDouble(jint index) {
} }
jint ReadableNativeArray::getInt(jint index) { jint ReadableNativeArray::getInt(jint index) {
auto integer = array_.at(index).getInt(); const folly::dynamic& val = array_.at(index);
static_assert(std::is_same<decltype(integer), int64_t>::value, int64_t integer = convertDynamicIfIntegral(val);
"folly::dynamic int is not int64_t"); return makeJIntOrThrow(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;
} }
const char* ReadableNativeArray::getString(jint index) { const char* ReadableNativeArray::getString(jint index) {

View File

@ -46,14 +46,9 @@ double ReadableNativeMap::getDoubleKey(const std::string& key) {
} }
jint ReadableNativeMap::getIntKey(const std::string& key) { jint ReadableNativeMap::getIntKey(const std::string& key) {
auto integer = getMapValue(key).getInt(); const folly::dynamic& val = getMapValue(key);
jint javaint = static_cast<jint>(integer); int64_t integer = convertDynamicIfIntegral(val);
if (integer != javaint) { return makeJIntOrThrow(integer);
throwNewJavaException(
exceptions::gUnexpectedNativeTypeExceptionClass,
"Value '%lld' doesn't fit into a 32 bit signed int", integer);
}
return javaint;
} }
local_ref<jstring> ReadableNativeMap::getStringKey(const std::string& key) { local_ref<jstring> ReadableNativeMap::getStringKey(const std::string& key) {
@ -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 react
} // namespace facebook } // namespace facebook

View File

@ -55,5 +55,8 @@ struct ReadableNativeMapKeySetIterator : jni::HybridClass<ReadableNativeMapKeySe
const folly::dynamic& map_; const folly::dynamic& map_;
}; };
jint makeJIntOrThrow(int64_t integer);
int64_t convertDynamicIfIntegral(const folly::dynamic&);
} // namespace react } // namespace react
} // namespace facebook } // namespace facebook