From 5ffb4c6bd0ff3554b622fd958468541557944708 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Mon, 24 Aug 2026 04:43:53 -0700 Subject: [PATCH 1/2] Cover `react/renderer/leakchecker` with Stable API guards Summary: Classifies `react/renderer/leakchecker:leakchecker` as a private target under the three-tier C++ stable API visibility model. Consumers that opt into `RN_STRICT_API` now get an error if they include its headers; without that flag the guards are inert, so no existing build changes behaviour. The pod that ships the module, `React-Fabric`, already depends on `React-cxxstableapi` and is already marked as a React Native build, so no podspec change is needed. Changelog: [Internal] Differential Revision: D117188751 --- .../ReactCommon/react/renderer/leakchecker/CMakeLists.txt | 1 + .../ReactCommon/react/renderer/leakchecker/LeakChecker.h | 2 ++ .../ReactCommon/react/renderer/leakchecker/WeakFamilyRegistry.h | 2 ++ 3 files changed, 5 insertions(+) diff --git a/packages/react-native/ReactCommon/react/renderer/leakchecker/CMakeLists.txt b/packages/react-native/ReactCommon/react/renderer/leakchecker/CMakeLists.txt index bf2345dfeda6..76ed3956c34a 100644 --- a/packages/react-native/ReactCommon/react/renderer/leakchecker/CMakeLists.txt +++ b/packages/react-native/ReactCommon/react/renderer/leakchecker/CMakeLists.txt @@ -14,6 +14,7 @@ add_library(react_renderer_leakchecker STATIC ${react_renderer_leakchecker_SRC}) target_include_directories(react_renderer_leakchecker PUBLIC ${REACT_COMMON_DIR}) target_link_libraries(react_renderer_leakchecker glog + react_cxxstableapi react_renderer_core runtimeexecutor) target_compile_reactnative_options(react_renderer_leakchecker PRIVATE) diff --git a/packages/react-native/ReactCommon/react/renderer/leakchecker/LeakChecker.h b/packages/react-native/ReactCommon/react/renderer/leakchecker/LeakChecker.h index 091aa8369173..818afcb0148d 100644 --- a/packages/react-native/ReactCommon/react/renderer/leakchecker/LeakChecker.h +++ b/packages/react-native/ReactCommon/react/renderer/leakchecker/LeakChecker.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/leakchecker/WeakFamilyRegistry.h b/packages/react-native/ReactCommon/react/renderer/leakchecker/WeakFamilyRegistry.h index 18f18811a5e5..feea36a7ed11 100644 --- a/packages/react-native/ReactCommon/react/renderer/leakchecker/WeakFamilyRegistry.h +++ b/packages/react-native/ReactCommon/react/renderer/leakchecker/WeakFamilyRegistry.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include #include From 07de741880ff42e28f22d3915dc3e8779b13bfa0 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Mon, 24 Aug 2026 04:43:53 -0700 Subject: [PATCH 2/2] Forward declare LeakChecker in UIManager.h Summary: Under the C++ Stable API RFC, `react/renderer/uimanager:uimanager` is a public target while `react/renderer/leakchecker:leakchecker` is private. `UIManager.h` is an exported header of the uimanager target and is re-exported from the module umbrella `React/UIManager.h`, so it transitively exposed the private module through the blessed public entry point. The private guard is suppressed only by `RN_BUILDING`, not by `RN_UMBRELLA_CONTEXT`, so a consumer including `` under `RN_STRICT_API` would get a hard error from a header they never named and cannot acknowledge. `UIManager.h` only needs the type for the `std::unique_ptr leakChecker_` data member. `~UIManager()` is already out of line, so a forward declaration is sufficient and the include moves to `UIManager.cpp`, which already constructs the object. No build config change is needed: `leakchecker` is already a non-exported dep of the uimanager target in both BUCK and CMake. `UIManager.h` is the only public or for-frameworks header in ReactCommon that still reached `leakchecker`, so the module is now cleanly private. Changelog: [Internal] Differential Revision: D117188750 --- .../ReactCommon/react/renderer/uimanager/UIManager.cpp | 1 + .../ReactCommon/react/renderer/uimanager/UIManager.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp index 6b7c66679419..df92c08d5591 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h index 223dcae26a83..00f6d305604b 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManager.h @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -37,6 +36,7 @@ namespace facebook::react { +class LeakChecker; class UIManagerBinding; class UIManagerCommitHook; class UIManagerMountHook;