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:04:18 -07:00
committed by Facebook GitHub Bot
parent f3ac981c46
commit a3a7fc2c94
2 changed files with 9 additions and 9 deletions
@@ -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 = ↦
}
@@ -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;
}