Don't allocate large arrays on stack when copying native pointers, use heap based array
Summary: Don't allocate large arrays on stack when copying native pointers, use heap based array. Today the code copies the native pointers on the stack, since it may be too big, lets make sure to use heap based allocating using std::vector. This array is afterwards converted into a reversed map from index to pointer, so it is heap based anyhow. Changelog: [Internal] Don't allocate large arrays on stack when copying native pointers, use heap based array Reviewed By: Andrey-Mishanin Differential Revision: D28747213 fbshipit-source-id: da69b4b2d0960fdade9f07f44654b30d6dacc43a
This commit is contained in:
committed by
Facebook GitHub Bot
parent
f03129728f
commit
e5acf77eea
@@ -367,11 +367,7 @@ static void jni_YGNodeCalculateLayoutJNI(
|
|||||||
void* layoutContext = nullptr;
|
void* layoutContext = nullptr;
|
||||||
auto map = PtrJNodeMapVanilla{};
|
auto map = PtrJNodeMapVanilla{};
|
||||||
if (nativePointers) {
|
if (nativePointers) {
|
||||||
size_t nativePointersSize = env->GetArrayLength(nativePointers);
|
map = PtrJNodeMapVanilla{nativePointers, javaNodes};
|
||||||
jlong result[nativePointersSize];
|
|
||||||
env->GetLongArrayRegion(nativePointers, 0, nativePointersSize, result);
|
|
||||||
|
|
||||||
map = PtrJNodeMapVanilla{result, nativePointersSize, javaNodes};
|
|
||||||
layoutContext = ↦
|
layoutContext = ↦
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,11 +20,15 @@ class PtrJNodeMapVanilla {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
PtrJNodeMapVanilla() : ptrsToIdxs_{}, javaNodes_{} {}
|
PtrJNodeMapVanilla() : ptrsToIdxs_{}, javaNodes_{} {}
|
||||||
PtrJNodeMapVanilla(
|
PtrJNodeMapVanilla(jlongArray javaNativePointers, jobjectArray javaNodes)
|
||||||
jlong* nativePointers,
|
|
||||||
size_t nativePointersSize,
|
|
||||||
jobjectArray javaNodes)
|
|
||||||
: javaNodes_{javaNodes} {
|
: javaNodes_{javaNodes} {
|
||||||
|
|
||||||
|
JNIEnv* env = getCurrentEnv();
|
||||||
|
size_t nativePointersSize = env->GetArrayLength(javaNativePointers);
|
||||||
|
std::vector<jlong> nativePointers(nativePointersSize);
|
||||||
|
env->GetLongArrayRegion(
|
||||||
|
javaNativePointers, 0, nativePointersSize, nativePointers.data());
|
||||||
|
|
||||||
for (size_t i = 0; i < nativePointersSize; ++i) {
|
for (size_t i = 0; i < nativePointersSize; ++i) {
|
||||||
ptrsToIdxs_[(YGNodeRef) nativePointers[i]] = i;
|
ptrsToIdxs_[(YGNodeRef) nativePointers[i]] = i;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user