Home / Function/ computeMemoizationInputs() — react Function Reference

computeMemoizationInputs() — react Function Reference

Architecture documentation for the computeMemoizationInputs() function in PruneNonEscapingScopes.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  5f0939bb_76eb_1279_d295_dacefad72c8a["computeMemoizationInputs()"]
  714af45f_cbe2_027b_49c5_27e47069c22c["CollectDependenciesVisitor"]
  5f0939bb_76eb_1279_d295_dacefad72c8a -->|defined in| 714af45f_cbe2_027b_49c5_27e47069c22c
  97a5722d_5f85_030f_127a_0ee70f10e274["visitValueForMemoization()"]
  97a5722d_5f85_030f_127a_0ee70f10e274 -->|calls| 5f0939bb_76eb_1279_d295_dacefad72c8a
  97a5722d_5f85_030f_127a_0ee70f10e274["visitValueForMemoization()"]
  5f0939bb_76eb_1279_d295_dacefad72c8a -->|calls| 97a5722d_5f85_030f_127a_0ee70f10e274
  073c81a5_c389_d108_5b8f_4d6dc6eece83["push()"]
  5f0939bb_76eb_1279_d295_dacefad72c8a -->|calls| 073c81a5_c389_d108_5b8f_4d6dc6eece83
  eadd4103_8b1c_576b_7add_97a5c5edb9c7["eachReactiveValueOperand()"]
  5f0939bb_76eb_1279_d295_dacefad72c8a -->|calls| eadd4103_8b1c_576b_7add_97a5c5edb9c7
  f0c93b07_94b1_2207_1b17_c2cb9b4253b7["computePatternLValues()"]
  5f0939bb_76eb_1279_d295_dacefad72c8a -->|calls| f0c93b07_94b1_2207_1b17_c2cb9b4253b7
  d2c89465_144e_76da_505e_4a2de182f6f4["getFunctionCallSignature()"]
  5f0939bb_76eb_1279_d295_dacefad72c8a -->|calls| d2c89465_144e_76da_505e_4a2de182f6f4
  5d049649_b557_97d4_1320_627cfe79576d["isMutableEffect()"]
  5f0939bb_76eb_1279_d295_dacefad72c8a -->|calls| 5d049649_b557_97d4_1320_627cfe79576d
  d7fde76c_4fd9_feb3_299b_798689f05bc6["assertExhaustive()"]
  5f0939bb_76eb_1279_d295_dacefad72c8a -->|calls| d7fde76c_4fd9_feb3_299b_798689f05bc6
  style 5f0939bb_76eb_1279_d295_dacefad72c8a fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts lines 423–858

  computeMemoizationInputs(
    value: ReactiveValue,
    lvalue: Place | null,
  ): {
    // can optionally return a custom set of lvalues per instruction
    lvalues: Array<LValueMemoization>;
    rvalues: Array<Place>;
  } {
    const env = this.env;
    const options = this.options;

    switch (value.kind) {
      case 'ConditionalExpression': {
        return {
          // Only need to memoize if the rvalues are memoized
          lvalues:
            lvalue !== null
              ? [{place: lvalue, level: MemoizationLevel.Conditional}]
              : [],
          rvalues: [
            // Conditionals do not alias their test value.
            ...this.computeMemoizationInputs(value.consequent, null).rvalues,
            ...this.computeMemoizationInputs(value.alternate, null).rvalues,
          ],
        };
      }
      case 'LogicalExpression': {
        return {
          // Only need to memoize if the rvalues are memoized
          lvalues:
            lvalue !== null
              ? [{place: lvalue, level: MemoizationLevel.Conditional}]
              : [],
          rvalues: [
            ...this.computeMemoizationInputs(value.left, null).rvalues,
            ...this.computeMemoizationInputs(value.right, null).rvalues,
          ],
        };
      }
      case 'SequenceExpression': {
        for (const instr of value.instructions) {
          this.visitValueForMemoization(instr.id, instr.value, instr.lvalue);
        }
        return {
          // Only need to memoize if the rvalues are memoized
          lvalues:
            lvalue !== null
              ? [{place: lvalue, level: MemoizationLevel.Conditional}]
              : [],
          /*
           * Only the final value of the sequence is a true rvalue:
           * values from the sequence's instructions are evaluated
           * as separate nodes
           */
          rvalues: this.computeMemoizationInputs(value.value, null).rvalues,
        };
      }
      case 'JsxExpression': {
        const operands: Array<Place> = [];
        if (value.tag.kind === 'Identifier') {
          operands.push(value.tag);
        }
        for (const prop of value.props) {
          if (prop.kind === 'JsxAttribute') {
            operands.push(prop.place);
          } else {
            operands.push(prop.argument);
          }
        }
        if (value.children !== null) {
          for (const child of value.children) {
            operands.push(child);
          }
        }
        const level = options.memoizeJsxElements
          ? MemoizationLevel.Memoized
          : MemoizationLevel.Unmemoized;
        return {
          /*
           * JSX elements themselves are not memoized unless forced to
           * avoid breaking downstream memoization

Domain

Subdomains

Frequently Asked Questions

What does computeMemoizationInputs() do?
computeMemoizationInputs() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts.
Where is computeMemoizationInputs() defined?
computeMemoizationInputs() is defined in compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/PruneNonEscapingScopes.ts at line 423.
What does computeMemoizationInputs() call?
computeMemoizationInputs() calls 7 function(s): assertExhaustive, computePatternLValues, eachReactiveValueOperand, getFunctionCallSignature, isMutableEffect, push, visitValueForMemoization.
What calls computeMemoizationInputs()?
computeMemoizationInputs() is called by 1 function(s): visitValueForMemoization.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free