/** * 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. * * @flow */ import type {Fiber} from './ReactInternalTypes'; export type StackCursor = {current: T}; const valueStack: Array = []; let fiberStack: Array; if (__DEV__) { fiberStack = []; } let index = -1; function createCursor(defaultValue: T): StackCursor { return { current: defaultValue, }; } function isEmpty(): boolean { return index === -1; } function pop(cursor: StackCursor, fiber: Fiber): void { if (index < 0) { if (__DEV__) { console.error('Unexpected pop.'); } return; } if (__DEV__) { if (fiber !== fiberStack[index]) { console.error('Unexpected Fiber popped.'); } } cursor.current = valueStack[index]; valueStack[index] = null; if (__DEV__) { fiberStack[index] = null; } index--; } function push(cursor: StackCursor, value: T, fiber: Fiber): void { index++; valueStack[index] = cursor.current; if (__DEV__) { fiberStack[index] = fiber; } cursor.current = value; } function checkThatStackIsEmpty() { if (__DEV__) { if (index !== -1) { console.error( 'Expected an empty stack. Something was not reset properly.', ); } } } function resetStackAfterFatalErrorInDev() { if (__DEV__) { index = -1; valueStack.length = 0; fiberStack.length = 0; } } export { createCursor, isEmpty, pop, push, // DEV only: checkThatStackIsEmpty, resetStackAfterFatalErrorInDev, };