diff --git a/enums.py b/enums.py index 3d69acb0..949d82f2 100755 --- a/enums.py +++ b/enums.py @@ -54,6 +54,8 @@ ENUMS = { "AbsolutePercentageAgainstPaddingEdge", # Conformance fix: https://github.com/facebook/yoga/pull/1028 "FixAbsoluteTrailingColumnMargin", + # fix JNI local ref overflows + "FixJNILocalRefOverflows", ], "PrintOptions": [ ("Layout", 1 << 0), diff --git a/java/com/facebook/yoga/YogaExperimentalFeature.java b/java/com/facebook/yoga/YogaExperimentalFeature.java index 3532e45e..ba881370 100644 --- a/java/com/facebook/yoga/YogaExperimentalFeature.java +++ b/java/com/facebook/yoga/YogaExperimentalFeature.java @@ -12,7 +12,8 @@ package com.facebook.yoga; public enum YogaExperimentalFeature { WEB_FLEX_BASIS(0), ABSOLUTE_PERCENTAGE_AGAINST_PADDING_EDGE(1), - FIX_ABSOLUTE_TRAILING_COLUMN_MARGIN(2); + FIX_ABSOLUTE_TRAILING_COLUMN_MARGIN(2), + FIX_JNILOCAL_REF_OVERFLOWS(3); private final int mIntValue; @@ -29,6 +30,7 @@ public enum YogaExperimentalFeature { case 0: return WEB_FLEX_BASIS; case 1: return ABSOLUTE_PERCENTAGE_AGAINST_PADDING_EDGE; case 2: return FIX_ABSOLUTE_TRAILING_COLUMN_MARGIN; + case 3: return FIX_JNILOCAL_REF_OVERFLOWS; default: throw new IllegalArgumentException("Unknown enum value: " + value); } } diff --git a/java/jni/YGJNIVanilla.cpp b/java/jni/YGJNIVanilla.cpp index 0a95d991..1f0dd1c4 100644 --- a/java/jni/YGJNIVanilla.cpp +++ b/java/jni/YGJNIVanilla.cpp @@ -280,7 +280,8 @@ static void YGTransferLayoutOutputsRecursive( JNIEnv* env, jobject thiz, YGNodeRef root, - void* layoutContext) { + void* layoutContext, + bool shouldCleanLocalRef) { if (!YGNodeGetHasNewLayout(root)) { return; } @@ -346,11 +347,16 @@ static void YGTransferLayoutOutputsRecursive( env->SetFloatArrayRegion(arrFinal.get(), 0, arrSize, arr); env->SetObjectField(obj.get(), arrField, arrFinal.get()); + if (shouldCleanLocalRef) { + objectClass.reset(); + arrFinal.reset(); + } + YGNodeSetHasNewLayout(root, false); for (uint32_t i = 0; i < YGNodeGetChildCount(root); i++) { YGTransferLayoutOutputsRecursive( - env, thiz, YGNodeGetChild(root, i), layoutContext); + env, thiz, YGNodeGetChild(root, i), layoutContext, shouldCleanLocalRef); } } @@ -372,13 +378,17 @@ static void jni_YGNodeCalculateLayoutJNI( } const YGNodeRef root = _jlong2YGNodeRef(nativePointer); + const bool shouldCleanLocalRef = + root->getConfig()->isExperimentalFeatureEnabled( + YGExperimentalFeatureFixJNILocalRefOverflows); YGNodeCalculateLayoutWithContext( root, static_cast(width), static_cast(height), YGNodeStyleGetDirection(_jlong2YGNodeRef(nativePointer)), layoutContext); - YGTransferLayoutOutputsRecursive(env, obj, root, layoutContext); + YGTransferLayoutOutputsRecursive( + env, obj, root, layoutContext, shouldCleanLocalRef); } catch (const YogaJniException& jniException) { ScopedLocalRef throwable = jniException.getThrowable(); if (throwable.get()) { diff --git a/javascript/src/generated/YGEnums.ts b/javascript/src/generated/YGEnums.ts index 3ddaac9b..50b76ff2 100644 --- a/javascript/src/generated/YGEnums.ts +++ b/javascript/src/generated/YGEnums.ts @@ -57,6 +57,7 @@ export enum ExperimentalFeature { WebFlexBasis = 0, AbsolutePercentageAgainstPaddingEdge = 1, FixAbsoluteTrailingColumnMargin = 2, + FixJNILocalRefOverflows = 3, } export enum FlexDirection { @@ -164,6 +165,7 @@ const constants = { EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS: ExperimentalFeature.WebFlexBasis, EXPERIMENTAL_FEATURE_ABSOLUTE_PERCENTAGE_AGAINST_PADDING_EDGE: ExperimentalFeature.AbsolutePercentageAgainstPaddingEdge, EXPERIMENTAL_FEATURE_FIX_ABSOLUTE_TRAILING_COLUMN_MARGIN: ExperimentalFeature.FixAbsoluteTrailingColumnMargin, + EXPERIMENTAL_FEATURE_FIX_JNILOCAL_REF_OVERFLOWS: ExperimentalFeature.FixJNILocalRefOverflows, FLEX_DIRECTION_COLUMN: FlexDirection.Column, FLEX_DIRECTION_COLUMN_REVERSE: FlexDirection.ColumnReverse, FLEX_DIRECTION_ROW: FlexDirection.Row, diff --git a/yoga/YGEnums.cpp b/yoga/YGEnums.cpp index 96b424a3..5753403e 100644 --- a/yoga/YGEnums.cpp +++ b/yoga/YGEnums.cpp @@ -109,6 +109,8 @@ const char* YGExperimentalFeatureToString(const YGExperimentalFeature value) { return "absolute-percentage-against-padding-edge"; case YGExperimentalFeatureFixAbsoluteTrailingColumnMargin: return "fix-absolute-trailing-column-margin"; + case YGExperimentalFeatureFixJNILocalRefOverflows: + return "fix-jnilocal-ref-overflows"; } return "unknown"; } diff --git a/yoga/YGEnums.h b/yoga/YGEnums.h index 72146fe2..990e3149 100644 --- a/yoga/YGEnums.h +++ b/yoga/YGEnums.h @@ -66,7 +66,8 @@ YG_ENUM_SEQ_DECL( YGExperimentalFeature, YGExperimentalFeatureWebFlexBasis, YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge, - YGExperimentalFeatureFixAbsoluteTrailingColumnMargin) + YGExperimentalFeatureFixAbsoluteTrailingColumnMargin, + YGExperimentalFeatureFixJNILocalRefOverflows) YG_ENUM_SEQ_DECL( YGFlexDirection,