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:
Amir Shalem
2021-06-03 07:02:49 -07:00
committed by Facebook GitHub Bot
parent f03129728f
commit e5acf77eea
2 changed files with 9 additions and 9 deletions

View File

@@ -367,11 +367,7 @@ static void jni_YGNodeCalculateLayoutJNI(
void* layoutContext = nullptr;
auto map = PtrJNodeMapVanilla{};
if (nativePointers) {
size_t nativePointersSize = env->GetArrayLength(nativePointers);
jlong result[nativePointersSize];
env->GetLongArrayRegion(nativePointers, 0, nativePointersSize, result);
map = PtrJNodeMapVanilla{result, nativePointersSize, javaNodes};
map = PtrJNodeMapVanilla{nativePointers, javaNodes};
layoutContext = ↦
}

View File

@@ -20,11 +20,15 @@ class PtrJNodeMapVanilla {
public:
PtrJNodeMapVanilla() : ptrsToIdxs_{}, javaNodes_{} {}
PtrJNodeMapVanilla(
jlong* nativePointers,
size_t nativePointersSize,
jobjectArray javaNodes)
PtrJNodeMapVanilla(jlongArray javaNativePointers, jobjectArray 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) {
ptrsToIdxs_[(YGNodeRef) nativePointers[i]] = i;
}