diff --git a/packages/react-reconciler/src/ReactFiber.js b/packages/react-reconciler/src/ReactFiber.js index 2911b1bf5c549..c8b332b1542ea 100644 --- a/packages/react-reconciler/src/ReactFiber.js +++ b/packages/react-reconciler/src/ReactFiber.js @@ -38,6 +38,7 @@ import { enableDO_NOT_USE_disableStrictPassiveEffect, enableRenderableContext, disableLegacyMode, + enableObjectFiber, enableOwnerStacks, } from 'shared/ReactFeatureFlags'; import {NoFlags, Placement, StaticMask} from './ReactFiberFlags'; @@ -232,7 +233,7 @@ function FiberNode( // is faster. // 5) It should be easy to port this to a C struct and keep a C implementation // compatible. -function createFiber( +function createFiberImplClass( tag: WorkTag, pendingProps: mixed, key: null | string, @@ -242,6 +243,72 @@ function createFiber( return new FiberNode(tag, pendingProps, key, mode); } +function createFiberImplObject( + tag: WorkTag, + pendingProps: mixed, + key: null | string, + mode: TypeOfMode, +): Fiber { + const fiber: Fiber = { + // Instance + tag, + key, + elementType: null, + type: null, + stateNode: null, + + // Fiber + return: null, + child: null, + sibling: null, + index: 0, + + ref: null, + refCleanup: null, + + pendingProps, + memoizedProps: null, + updateQueue: null, + memoizedState: null, + dependencies: null, + + mode, + + // Effects + flags: NoFlags, + subtreeFlags: NoFlags, + deletions: null, + + lanes: NoLanes, + childLanes: NoLanes, + + alternate: null, + }; + + if (enableProfilerTimer) { + fiber.actualDuration = 0; + fiber.actualStartTime = -1; + fiber.selfBaseDuration = 0; + fiber.treeBaseDuration = 0; + } + + if (__DEV__) { + fiber._debugInfo = null; + fiber._debugOwner = null; + fiber._debugNeedsRemount = false; + fiber._debugHookTypes = null; + + if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') { + Object.preventExtensions(fiber); + } + } + return fiber; +} + +const createFiber = enableObjectFiber + ? createFiberImplObject + : createFiberImplClass; + function shouldConstruct(Component: Function) { const prototype = Component.prototype; return !!(prototype && prototype.isReactComponent); diff --git a/packages/shared/ReactFeatureFlags.js b/packages/shared/ReactFeatureFlags.js index b161ac7cb1141..a3280444766c7 100644 --- a/packages/shared/ReactFeatureFlags.js +++ b/packages/shared/ReactFeatureFlags.js @@ -87,6 +87,11 @@ export const enableTaint = __EXPERIMENTAL__; export const enablePostpone = __EXPERIMENTAL__; +/** + * Switches Fiber creation to a simple object instead of a constructor. + */ +export const enableObjectFiber = false; + export const enableTransitionTracing = false; // No known bugs, but needs performance testing diff --git a/packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js b/packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js index a0513f81e7bf7..ae7d9bd844a21 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js @@ -22,5 +22,6 @@ export const consoleManagedByDevToolsDuringStrictMode = __VARIANT__; export const disableDefaultPropsExceptForClasses = __VARIANT__; export const enableAddPropertiesFastPath = __VARIANT__; export const enableFastJSX = __VARIANT__; +export const enableObjectFiber = __VARIANT__; export const enableShallowPropDiffing = __VARIANT__; export const passChildrenWhenCloningPersistedNodes = __VARIANT__; diff --git a/packages/shared/forks/ReactFeatureFlags.native-fb.js b/packages/shared/forks/ReactFeatureFlags.native-fb.js index 353937a7eaed8..0939b459a9b40 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-fb.js +++ b/packages/shared/forks/ReactFeatureFlags.native-fb.js @@ -24,6 +24,7 @@ export const { disableDefaultPropsExceptForClasses, enableAddPropertiesFastPath, enableFastJSX, + enableObjectFiber, enableShallowPropDiffing, passChildrenWhenCloningPersistedNodes, } = dynamicFlags; diff --git a/packages/shared/forks/ReactFeatureFlags.native-oss.js b/packages/shared/forks/ReactFeatureFlags.native-oss.js index e47a79ef7abb8..031f20247eda2 100644 --- a/packages/shared/forks/ReactFeatureFlags.native-oss.js +++ b/packages/shared/forks/ReactFeatureFlags.native-oss.js @@ -55,6 +55,7 @@ export const enableLegacyCache = false; export const enableLegacyFBSupport = false; export const enableLegacyHidden = false; export const enableNoCloningMemoCache = false; +export const enableObjectFiber = false; export const enableOwnerStacks = __EXPERIMENTAL__; export const enablePostpone = false; export const enableReactTestRendererWarning = false; diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.js index 717e16b88060c..172335d7cc735 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.js @@ -96,6 +96,7 @@ export const enableRenderableContext = true; export const enableReactTestRendererWarning = true; export const disableDefaultPropsExceptForClasses = true; +export const enableObjectFiber = false; export const enableOwnerStacks = false; // Flow magic to verify the exports of this file match the original version. diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js index 5d256ca9e06c1..cea3b6ada831d 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js @@ -47,6 +47,7 @@ export const enableLegacyCache = false; export const enableLegacyFBSupport = false; export const enableLegacyHidden = false; export const enableNoCloningMemoCache = false; +export const enableObjectFiber = false; export const enableOwnerStacks = false; export const enablePostpone = false; export const enableProfilerCommitHooks = __PROFILE__; diff --git a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js index 71f533f8d6d2a..bdc43fd844294 100644 --- a/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js +++ b/packages/shared/forks/ReactFeatureFlags.test-renderer.www.js @@ -90,6 +90,7 @@ export const enableAddPropertiesFastPath = false; export const renameElementSymbol = false; +export const enableObjectFiber = false; export const enableOwnerStacks = false; export const enableShallowPropDiffing = false; diff --git a/packages/shared/forks/ReactFeatureFlags.www.js b/packages/shared/forks/ReactFeatureFlags.www.js index 66a3723071986..8c4773c3ed44a 100644 --- a/packages/shared/forks/ReactFeatureFlags.www.js +++ b/packages/shared/forks/ReactFeatureFlags.www.js @@ -120,6 +120,7 @@ export const disableStringRefs = false; export const disableLegacyMode: boolean = __EXPERIMENTAL__ || dynamicFeatureFlags.disableLegacyMode; +export const enableObjectFiber = false; export const enableOwnerStacks = false; export const enableShallowPropDiffing = false;