Skip to content

Commit

Permalink
Don't allocate large arrays on stack when copying native pointers, us…
Browse files Browse the repository at this point in the history
…e 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
  • Loading branch information
amir-shalem authored and facebook-github-bot committed Jun 3, 2021
1 parent f3ac981 commit a3a7fc2
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 = ↦
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit a3a7fc2

Please sign in to comment.