From d2367f17d9cac8f0325660455beff60a82b618d4 Mon Sep 17 00:00:00 2001 From: lauren Date: Mon, 7 Oct 2024 16:31:20 -0400 Subject: [PATCH] [rcr] Reexport React.__COMPILER_RUNTIME.c or fallback to polyfill (#31140) This PR updates the standalone `react-compiler-runtime` package to either re-export `React.__COMPILER_RUNTIME.c` or to use a userspace polyfill. --- .../react-compiler-runtime/src/index.ts | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/compiler/packages/react-compiler-runtime/src/index.ts b/compiler/packages/react-compiler-runtime/src/index.ts index 823a49ab8199f..7b8cbe36f52db 100644 --- a/compiler/packages/react-compiler-runtime/src/index.ts +++ b/compiler/packages/react-compiler-runtime/src/index.ts @@ -19,22 +19,27 @@ const ReactSecretInternals = type MemoCache = Array; const $empty = Symbol.for('react.memo_cache_sentinel'); -/** - * DANGER: this hook is NEVER meant to be called directly! - **/ -export function c(size: number) { - return React.useState(() => { - const $ = new Array(size); - for (let ii = 0; ii < size; ii++) { - $[ii] = $empty; - } - // This symbol is added to tell the react devtools that this array is from - // useMemoCache. - // @ts-ignore - $[$empty] = true; - return $; - })[0]; -} + +// Re-export React.c if present, otherwise fallback to the userspace polyfill for versions of React +// < 19. +export const c = + // @ts-expect-error + typeof React.__COMPILER_RUNTIME?.c === 'function' + ? // @ts-expect-error + React.__COMPILER_RUNTIME.c + : function c(size: number) { + return React.useMemo>(() => { + const $ = new Array(size); + for (let ii = 0; ii < size; ii++) { + $[ii] = $empty; + } + // This symbol is added to tell the react devtools that this array is from + // useMemoCache. + // @ts-ignore + $[$empty] = true; + return $; + }, []); + }; const LazyGuardDispatcher: {[key: string]: (...args: Array) => any} = {}; [