Ship optimization of ReadableNativeMaps

Summary:
Ship optimization of ReadableNativeMaps - see D25361169 (https://github.com/facebook/react-native/commit/503a6f4463f5d2f7576b33158c18d8d8e99f3291)

QE showed neutral metrics

changelog: [internal]

Reviewed By: JoshuaGross

Differential Revision: D25776019

fbshipit-source-id: 7fd32087bf2ca81236fe0aebe082be01330de2fa
This commit is contained in:
David Vacca
2021-01-05 11:47:07 -08:00
committed by Facebook GitHub Bot
parent a4526bcc3f
commit 08eacf8acd
2 changed files with 52 additions and 68 deletions
@@ -12,7 +12,6 @@ import androidx.annotation.Nullable;
import com.facebook.infer.annotation.Assertions;
import com.facebook.jni.HybridData;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.config.ReactFeatureFlags;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -89,64 +88,6 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
return mLocalTypeMap;
}
private Iterator<Map.Entry<String, Object>> createExperimentalIterator() {
if (mKeys == null) {
mKeys = Assertions.assertNotNull(importKeys());
}
final String[] iteratorKeys = mKeys;
final Object[] iteratorValues = Assertions.assertNotNull(importValues());
return new Iterator<Map.Entry<String, Object>>() {
int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < iteratorKeys.length;
}
@Override
public Map.Entry<String, Object> next() {
final int index = currentIndex++;
return new Map.Entry<String, Object>() {
@Override
public String getKey() {
return iteratorKeys[index];
}
@Override
public Object getValue() {
return iteratorValues[index];
}
@Override
public Object setValue(Object value) {
throw new UnsupportedOperationException(
"Can't set a value while iterating over a ReadableNativeMap");
}
};
}
};
}
private ReadableMapKeySetIterator createExperimentalKeySetIterator() {
if (mKeys == null) {
mKeys = Assertions.assertNotNull(importKeys());
}
final String[] iteratorKeys = mKeys;
return new ReadableMapKeySetIterator() {
int currentIndex = 0;
@Override
public boolean hasNextKey() {
return currentIndex < iteratorKeys.length;
}
@Override
public String nextKey() {
return iteratorKeys[currentIndex++];
}
};
}
private native Object[] importTypes();
@Override
@@ -246,16 +187,62 @@ public class ReadableNativeMap extends NativeMap implements ReadableMap {
@Override
public @NonNull Iterator<Map.Entry<String, Object>> getEntryIterator() {
return ReactFeatureFlags.enableExperimentalReadableNativeMapIterator
? createExperimentalIterator()
: getLocalMap().entrySet().iterator();
if (mKeys == null) {
mKeys = Assertions.assertNotNull(importKeys());
}
final String[] iteratorKeys = mKeys;
final Object[] iteratorValues = Assertions.assertNotNull(importValues());
return new Iterator<Map.Entry<String, Object>>() {
int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < iteratorKeys.length;
}
@Override
public Map.Entry<String, Object> next() {
final int index = currentIndex++;
return new Map.Entry<String, Object>() {
@Override
public String getKey() {
return iteratorKeys[index];
}
@Override
public Object getValue() {
return iteratorValues[index];
}
@Override
public Object setValue(Object value) {
throw new UnsupportedOperationException(
"Can't set a value while iterating over a ReadableNativeMap");
}
};
}
};
}
@Override
public @NonNull ReadableMapKeySetIterator keySetIterator() {
return ReactFeatureFlags.enableExperimentalReadableNativeMapIterator
? createExperimentalKeySetIterator()
: new ReadableNativeMapKeySetIterator(this);
if (mKeys == null) {
mKeys = Assertions.assertNotNull(importKeys());
}
final String[] iteratorKeys = mKeys;
return new ReadableMapKeySetIterator() {
int currentIndex = 0;
@Override
public boolean hasNextKey() {
return currentIndex < iteratorKeys.length;
}
@Override
public String nextKey() {
return iteratorKeys[currentIndex++];
}
};
}
@Override
@@ -66,9 +66,6 @@ public class ReactFeatureFlags {
*/
public static boolean enableStartSurfaceRaceConditionFix = false;
/** Enables the usage of an experimental optimized iterator for ReadableNativeMaps. */
public static boolean enableExperimentalReadableNativeMapIterator = false;
/** Enables Static ViewConfig in RN Android native code. */
public static boolean enableExperimentalStaticViewConfigs = false;
}