Home / Type/ AliasingEffect Type — react Architecture

AliasingEffect Type — react Architecture

Architecture documentation for the AliasingEffect type/interface in AliasingEffects.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  9f54f993_76c3_b507_621f_ba4f24e13eda["AliasingEffect"]
  2f00e901_2271_5b46_4d72_3fa77ff15e31["AliasingEffects.ts"]
  9f54f993_76c3_b507_621f_ba4f24e13eda -->|defined in| 2f00e901_2271_5b46_4d72_3fa77ff15e31
  style 9f54f993_76c3_b507_621f_ba4f24e13eda fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

compiler/packages/babel-plugin-react-compiler/src/Inference/AliasingEffects.ts lines 29–175

export type AliasingEffect =
  /**
   * Marks the given value and its direct aliases as frozen.
   *
   * Captured values are *not* considered frozen, because we cannot be sure that a previously
   * captured value will still be captured at the point of the freeze.
   *
   * For example:
   * const x = {};
   * const y = [x];
   * y.pop(); // y dosn't contain x anymore!
   * freeze(y);
   * mutate(x); // safe to mutate!
   *
   * The exception to this is FunctionExpressions - since it is impossible to change which
   * value a function closes over[1] we can transitively freeze functions and their captures.
   *
   * [1] Except for `let` values that are reassigned and closed over by a function, but we
   * handle this explicitly with StoreContext/LoadContext.
   */
  | {kind: 'Freeze'; value: Place; reason: ValueReason}
  /**
   * Mutate the value and any direct aliases (not captures). Errors if the value is not mutable.
   */
  | {kind: 'Mutate'; value: Place; reason?: MutationReason | null}
  /**
   * Mutate the value and any direct aliases (not captures), but only if the value is known mutable.
   * This should be rare.
   *
   * TODO: this is only used for IteratorNext, but even then MutateTransitiveConditionally is more
   * correct for iterators of unknown types.
   */
  | {kind: 'MutateConditionally'; value: Place}
  /**
   * Mutate the value, any direct aliases, and any transitive captures. Errors if the value is not mutable.
   */
  | {kind: 'MutateTransitive'; value: Place}
  /**
   * Mutates any of the value, its direct aliases, and its transitive captures that are mutable.
   */
  | {kind: 'MutateTransitiveConditionally'; value: Place}
  /**
   * Records information flow from `from` to `into` in cases where local mutation of the destination
   * will *not* mutate the source:
   *
   * - Capture a -> b and Mutate(b) X=> (does not imply) Mutate(a)
   * - Capture a -> b and MutateTransitive(b) => (does imply) Mutate(a)
   *
   * Example: `array.push(item)`. Information from item is captured into array, but there is not a
   * direct aliasing, and local mutations of array will not modify item.
   */
  | {kind: 'Capture'; from: Place; into: Place}
  /**
   * Records information flow from `from` to `into` in cases where local mutation of the destination
   * *will* mutate the source:
   *
   * - Alias a -> b and Mutate(b) => (does imply) Mutate(a)
   * - Alias a -> b and MutateTransitive(b) => (does imply) Mutate(a)
   *
   * Example: `c = identity(a)`. We don't know what `identity()` returns so we can't use Assign.
   * But we have to assume that it _could_ be returning its input, such that a local mutation of
   * c could be mutating a.
   */
  | {kind: 'Alias'; from: Place; into: Place}

  /**
   * Indicates the potential for information flow from `from` to `into`. This is used for a specific
   * case: functions with unknown signatures. If the compiler sees a call such as `foo(x)`, it has to
   * consider several possibilities (which may depend on the arguments):
   * - foo(x) returns a new mutable value that does not capture any information from x.
   * - foo(x) returns a new mutable value that *does* capture information from x.
   * - foo(x) returns x itself, ie foo is the identity function
   *
   * The same is true of functions that take multiple arguments: `cond(a, b, c)` could conditionally
   * return b or c depending on the value of a.
   *
   * To represent this case, MaybeAlias represents the fact that an aliasing relationship could exist.
   * Any mutations that flow through this relationship automatically become conditional.
   */
  | {kind: 'MaybeAlias'; from: Place; into: Place}

Frequently Asked Questions

What is the AliasingEffect type?
AliasingEffect is a type/interface in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/Inference/AliasingEffects.ts.
Where is AliasingEffect defined?
AliasingEffect is defined in compiler/packages/babel-plugin-react-compiler/src/Inference/AliasingEffects.ts at line 29.

Analyze Your Own Codebase

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

Try Supermodel Free