Skip to content

Commit

Permalink
same cleanup but for ReadableNativeArray
Browse files Browse the repository at this point in the history
Summary: Removes useArrayNativeAccessor and everything needed to support it, similar to D14486283

Reviewed By: mdvacca

Differential Revision: D14487244

fbshipit-source-id: 7cfa91f7cf322c648c82be5951f3622cd6468961
  • Loading branch information
sahrens authored and facebook-github-bot committed Mar 25, 2019
1 parent b257e06 commit a062b34
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 172 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,11 @@ protected ReadableNativeArray(HybridData hybridData) {
private @Nullable ReadableType[] mLocalTypeArray;

private static int jniPassCounter = 0;
public static void setUseNativeAccessor(boolean useNativeAccessor) {
ReactFeatureFlags.useArrayNativeAccessor = useNativeAccessor;
}
public static int getJNIPassCounter() {
return jniPassCounter;
}

private Object[] getLocalArray() {
// Fast, non blocking check for the common case
if (mLocalArray != null) {
return mLocalArray;
}
Expand All @@ -60,7 +56,6 @@ private Object[] getLocalArray() {
private native Object[] importArray();

private ReadableType[] getLocalTypeArray() {
// Fast, non-blocking check for the common case
if (mLocalTypeArray != null) {
return mLocalTypeArray;
}
Expand All @@ -78,95 +73,49 @@ private ReadableType[] getLocalTypeArray() {

@Override
public int size() {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return sizeNative();
}
return getLocalArray().length;
}
private native int sizeNative();

@Override
public boolean isNull(int index) {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return isNullNative(index);
}
return getLocalArray()[index] == null;
}
private native boolean isNullNative(int index);

@Override
public boolean getBoolean(int index) {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return getBooleanNative(index);
}
return ((Boolean) getLocalArray()[index]).booleanValue();
}
private native boolean getBooleanNative(int index);

@Override
public double getDouble(int index) {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return getDoubleNative(index);
}
return ((Double) getLocalArray()[index]).doubleValue();
}
private native double getDoubleNative(int index);

@Override
public int getInt(int index) {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return getIntNative(index);
}
return ((Double) getLocalArray()[index]).intValue();
}
private native int getIntNative(int index);

@Override
public @Nullable String getString(int index) {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return getStringNative(index);
}
return (String) getLocalArray()[index];
}
private native String getStringNative(int index);

@Override
public @Nullable ReadableNativeArray getArray(int index) {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return getArrayNative(index);
}
return (ReadableNativeArray) getLocalArray()[index];
}
private native ReadableNativeArray getArrayNative(int index);

@Override
public @Nullable ReadableNativeMap getMap(int index) {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return getMapNative(index);
}
return (ReadableNativeMap) getLocalArray()[index];
}
private native ReadableNativeMap getMapNative(int index);

@Override
public @Nonnull ReadableType getType(int index) {
if (ReactFeatureFlags.useArrayNativeAccessor) {
jniPassCounter++;
return getTypeNative(index);
}
return getLocalTypeArray()[index];
}

private native ReadableType getTypeNative(int index);

@Override
public @Nonnull Dynamic getDynamic(int index) {
return DynamicFromArray.create(this, index);
Expand Down
122 changes: 16 additions & 106 deletions ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,6 @@ using namespace facebook::jni;
namespace facebook {
namespace react {

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;
}



// This attribute exports the ctor symbol, so ReadableNativeArray to be
// constructed from other DSOs.
__attribute__((visibility("default")))
Expand All @@ -50,124 +24,60 @@ void ReadableNativeArray::mapException(const std::exception& ex) {
}
}

jint ReadableNativeArray::getSize() {
return array_.size();
}

jboolean ReadableNativeArray::isNull(jint index) {
return array_.at(index).isNull() ? JNI_TRUE : JNI_FALSE;
}

jboolean ReadableNativeArray::getBoolean(jint index) {
return array_.at(index).getBool() ? JNI_TRUE : JNI_FALSE;
}

jdouble ReadableNativeArray::getDouble(jint index) {
const folly::dynamic& val = array_.at(index);
if (val.isInt()) {
return val.getInt();
}
return val.getDouble();
}

jint ReadableNativeArray::getInt(jint index) {
const folly::dynamic& val = array_.at(index);
int64_t integer = convertDynamicIfIntegral(val);
return makeJIntOrThrow(integer);
}

const char* ReadableNativeArray::getString(jint index) {
const folly::dynamic& dyn = array_.at(index);
if (dyn.isNull()) {
return nullptr;
}
return dyn.getString().c_str();
}

local_ref<JArrayClass<jobject>> ReadableNativeArray::importArray() {
jint size = array_.size();
auto jarray = JArrayClass<jobject>::newArray(size);
for (jint i = 0; i < size; i++) {
switch(array_.at(i).type()) {
for (jint ii = 0; ii < size; ii++) {
const auto &element = array_.at(ii);
switch(element.type()) {
case folly::dynamic::Type::NULLT: {
jarray->setElement(i, nullptr);
jarray->setElement(ii, nullptr);
break;
}
case folly::dynamic::Type::BOOL: {
(*jarray)[i] = JBoolean::valueOf(ReadableNativeArray::getBoolean(i));
(*jarray)[ii] = JBoolean::valueOf(element.getBool());
break;
}
case folly::dynamic::Type::INT64: {
(*jarray)[ii] = JDouble::valueOf(element.getInt());
break;
}
case folly::dynamic::Type::INT64:
case folly::dynamic::Type::DOUBLE: {
(*jarray)[i] = JDouble::valueOf(ReadableNativeArray::getDouble(i));
(*jarray)[ii] = JDouble::valueOf(element.getDouble());
break;
}
case folly::dynamic::Type::STRING: {
(*jarray)[i] = make_jstring(ReadableNativeArray::getString(i));
(*jarray)[ii] = make_jstring(element.getString());
break;
}
case folly::dynamic::Type::OBJECT: {
(*jarray)[i] = ReadableNativeArray::getMap(i);
(*jarray)[ii] = ReadableNativeMap::newObjectCxxArgs(element);
break;
}
case folly::dynamic::Type::ARRAY: {
(*jarray)[i] = ReadableNativeArray::getArray(i);
(*jarray)[ii] = ReadableNativeArray::newObjectCxxArgs(element);
break;
}
default:
break;
break;
}
}
return jarray;
}

local_ref<ReadableNativeArray::jhybridobject> ReadableNativeArray::getArray(jint index) {
auto& elem = array_.at(index);
if (elem.isNull()) {
return local_ref<ReadableNativeArray::jhybridobject>(nullptr);
} else {
return ReadableNativeArray::newObjectCxxArgs(elem);
}
}

local_ref<ReadableType> ReadableNativeArray::getType(jint index) {
return ReadableType::getType(array_.at(index).type());
}

local_ref<JArrayClass<jobject>> ReadableNativeArray::importTypeArray() {
jint size = array_.size();
auto jarray = JArrayClass<jobject>::newArray(size);
for (jint i = 0; i < size; i++) {
jarray->setElement(i, ReadableNativeArray::getType(i).get());
for (jint ii = 0; ii < size; ii++) {
(*jarray)[ii] = ReadableType::getType(array_.at(ii).type());
}
return jarray;
}

local_ref<NativeMap::jhybridobject> ReadableNativeArray::getMap(jint index) {
auto& elem = array_.at(index);
return ReadableNativeMap::createWithContents(folly::dynamic(elem));
}

namespace {
// This is just to allow signature deduction below.
local_ref<ReadableNativeMap::jhybridobject> getMapFixed(alias_ref<ReadableNativeArray::jhybridobject> array, jint index) {
return static_ref_cast<ReadableNativeMap::jhybridobject>(array->cthis()->getMap(index));
}
}

void ReadableNativeArray::registerNatives() {
registerHybrid({
makeNativeMethod("importArray", ReadableNativeArray::importArray),
makeNativeMethod("importTypeArray", ReadableNativeArray::importTypeArray),
makeNativeMethod("sizeNative", ReadableNativeArray::getSize),
makeNativeMethod("isNullNative", ReadableNativeArray::isNull),
makeNativeMethod("getBooleanNative", ReadableNativeArray::getBoolean),
makeNativeMethod("getDoubleNative", ReadableNativeArray::getDouble),
makeNativeMethod("getIntNative", ReadableNativeArray::getInt),
makeNativeMethod("getStringNative", ReadableNativeArray::getString),
makeNativeMethod("getArrayNative", ReadableNativeArray::getArray),
makeNativeMethod("getMapNative", getMapFixed),
makeNativeMethod("getTypeNative", ReadableNativeArray::getType),
});
}

Expand Down
15 changes: 0 additions & 15 deletions ReactAndroid/src/main/jni/react/jni/ReadableNativeArray.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,6 @@ class ReadableNativeArray : public jni::HybridClass<ReadableNativeArray, NativeA
static void mapException(const std::exception& ex);
jni::local_ref<jni::JArrayClass<jobject>> importArray();
jni::local_ref<jni::JArrayClass<jobject>> importTypeArray();
jint getSize();
jboolean isNull(jint index);
jboolean getBoolean(jint index);
jint getInt(jint index);
jdouble getDouble(jint index);
// The lifetime of the const char* is the same as the underlying dynamic
// array. This is fine for converting back to Java, but other uses should be
// careful.
const char* getString(jint index);
jni::local_ref<jhybridobject> getArray(jint index);
// This actually returns a ReadableNativeMap::JavaPart, but due to
// limitations of fbjni, we can't specify that here.
jni::local_ref<NativeMap::jhybridobject> getMap(jint index);
jni::local_ref<ReadableType> getType(jint index);

static void registerNatives();
};

Expand Down

0 comments on commit a062b34

Please sign in to comment.