diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.java index 6ae00f0f2ef612..a0b7c165f16f95 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.java @@ -31,7 +31,7 @@ public class YogaNative { // YGNode related static native long jni_YGNodeNewJNI(); static native long jni_YGNodeNewWithConfigJNI(long configPointer); - static native void jni_YGNodeDeallocateJNI(long nativePointer); + static native void jni_YGNodeFinalizeJNI(long nativePointer); static native void jni_YGNodeResetJNI(long nativePointer); static native void jni_YGNodeInsertChildJNI(long nativePointer, long childPointer, int index); static native void jni_YGNodeSwapChildJNI(long nativePointer, long childPointer, int index); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.java index ab617c7f16ff6c..23cf2a31e53091 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.java @@ -29,7 +29,7 @@ public void freeNatives() { if (mNativePointer != 0) { long nativePointer = mNativePointer; mNativePointer = 0; - YogaNative.jni_YGNodeDeallocateJNI(nativePointer); + YogaNative.jni_YGNodeFinalizeJNI(nativePointer); } } } diff --git a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp index e01aa248755849..b3b564866e1fee 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp @@ -6,6 +6,7 @@ */ #include "YGJNIVanilla.h" +#include #include #include #include @@ -16,9 +17,6 @@ #include "common.h" #include "jni.h" -#include -#include - using namespace facebook; using namespace facebook::yoga; using namespace facebook::yoga::vanillajni; @@ -190,12 +188,12 @@ static void jni_YGConfigSetLoggerJNI( } static void -jni_YGNodeDeallocateJNI(JNIEnv* /*env*/, jobject /*obj*/, jlong nativePointer) { +jni_YGNodeFinalizeJNI(JNIEnv* /*env*/, jobject /*obj*/, jlong nativePointer) { if (nativePointer == 0) { return; } const YGNodeRef node = _jlong2YGNodeRef(nativePointer); - YGNodeDeallocate(node); + YGNodeFinalize(node); } static void @@ -637,9 +635,8 @@ static YGSize YGJNIMeasureFunc( uint32_t wBits = 0xFFFFFFFF & (measureResult >> 32); uint32_t hBits = 0xFFFFFFFF & measureResult; - - const float measuredWidth = yoga::bit_cast(wBits); - const float measuredHeight = yoga::bit_cast(hBits); + float measuredWidth = std::bit_cast(wBits); + float measuredHeight = std::bit_cast(hBits); return YGSize{measuredWidth, measuredHeight}; } else { @@ -751,7 +748,7 @@ static JNINativeMethod methods[] = { (void*)jni_YGConfigSetLoggerJNI}, {"jni_YGNodeNewJNI", "()J", (void*)jni_YGNodeNewJNI}, {"jni_YGNodeNewWithConfigJNI", "(J)J", (void*)jni_YGNodeNewWithConfigJNI}, - {"jni_YGNodeDeallocateJNI", "(J)V", (void*)jni_YGNodeDeallocateJNI}, + {"jni_YGNodeFinalizeJNI", "(J)V", (void*)jni_YGNodeFinalizeJNI}, {"jni_YGNodeResetJNI", "(J)V", (void*)jni_YGNodeResetJNI}, {"jni_YGNodeInsertChildJNI", "(JJI)V", (void*)jni_YGNodeInsertChildJNI}, {"jni_YGNodeSwapChildJNI", "(JJI)V", (void*)jni_YGNodeSwapChildJNI}, diff --git a/packages/react-native/ReactCommon/yoga/Yoga.podspec b/packages/react-native/ReactCommon/yoga/Yoga.podspec index 2288fbcae6ef32..0b22f31cad545c 100644 --- a/packages/react-native/ReactCommon/yoga/Yoga.podspec +++ b/packages/react-native/ReactCommon/yoga/Yoga.podspec @@ -52,7 +52,7 @@ Pod::Spec.new do |spec| spec.source_files = source_files spec.header_mappings_dir = 'yoga' - public_header_files = 'yoga/{Yoga,YGEnums,YGMacros,YGValue}.h' + public_header_files = 'yoga/*.h' public_header_files = File.join('ReactCommon/yoga', public_header_files) if ENV['INSTALL_YOGA_WITHOUT_PATH_OPTION'] spec.public_header_files = public_header_files diff --git a/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h b/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h deleted file mode 100644 index 7c1caaa3785e2b..00000000000000 --- a/packages/react-native/ReactCommon/yoga/yoga/Yoga-internal.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -#pragma once - -#include -#include -#include - -#include - -YG_EXTERN_C_BEGIN - -// Deallocates a Yoga Node. Unlike YGNodeFree, does not remove the node from -// its parent or children. -YG_EXPORT void YGNodeDeallocate(YGNodeRef node); - -YG_EXTERN_C_END diff --git a/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp b/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp index 5109223fe34709..1909183c68e40f 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp @@ -5,7 +5,6 @@ * LICENSE file in the root directory of this source tree. */ -#include #include #include @@ -136,10 +135,12 @@ void YGNodeFree(const YGNodeRef nodeRef) { } node->clearChildren(); - YGNodeDeallocate(node); + + Event::publish(node, {YGNodeGetConfig(node)}); + delete resolveRef(node); } -void YGNodeDeallocate(const YGNodeRef node) { +void YGNodeFinalize(const YGNodeRef node) { Event::publish(node, {YGNodeGetConfig(node)}); delete resolveRef(node); } diff --git a/packages/react-native/ReactCommon/yoga/yoga/Yoga.h b/packages/react-native/ReactCommon/yoga/yoga/Yoga.h index 86f09fa0c44960..ce2d4ec2d6d34c 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/Yoga.h +++ b/packages/react-native/ReactCommon/yoga/yoga/Yoga.h @@ -59,6 +59,12 @@ YG_EXPORT void YGNodeFreeRecursiveWithCleanupFunc( YGNodeRef node, YGNodeCleanupFunc cleanup); YG_EXPORT void YGNodeFreeRecursive(YGNodeRef node); + +// Frees the Yoga node without disconnecting it from its owner or children. +// Allows garbage collecting Yoga nodes in parallel when the entire tree is +// unrechable. +YG_EXPORT void YGNodeFinalize(YGNodeRef node); + YG_EXPORT void YGNodeReset(YGNodeRef node); YG_EXPORT void YGNodeInsertChild(YGNodeRef node, YGNodeRef child, size_t index); diff --git a/packages/react-native/ReactCommon/yoga/yoga/module.modulemap b/packages/react-native/ReactCommon/yoga/yoga/module.modulemap new file mode 100644 index 00000000000000..91c6db293471ab --- /dev/null +++ b/packages/react-native/ReactCommon/yoga/yoga/module.modulemap @@ -0,0 +1,16 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +module yoga [system] { + module core { + header "YGEnums.h" + header "YGMacros.h" + header "YGValue.h" + header "Yoga.h" + export * + } +}