Package org.apache.groovy.runtime.indy

# Class SwitchPointInvalidator

java.lang.Object
org.apache.groovy.runtime.indy.SwitchPointInvalidator

public final class SwitchPointInvalidator extends Object
Lazily allocates a `SwitchPoint` and retires it on demand.

Call sites install the switch point returned by `getSwitchPoint()` in `guardWithTest` chains. `invalidate()` retires the live switch point so linked sites fall back and re-link; the next `getSwitchPoint()` allocates a fresh one.

Bulk paths (category enter/leave, custom MetaClass events) should prefer `detachLive()` and a single `SwitchPoint.invalidateAll(SwitchPoint[])` over many individual `invalidate()` calls (GROOVY-12191).

There is no permanent failover: after scoping stock invalidation to a single class, deopt storms from a process-wide SwitchPoint no longer apply, so a simpler replace-on-invalidate model is sufficient.

Since:
  6.0.0

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `SwitchPointInvalidator()`
  Creates an invalidator with no live SwitchPoint until the first `getSwitchPoint()` call.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `SwitchPoint`
  `detachLive()`
  Atomically detaches the live switch point for bulk `SwitchPoint.invalidateAll(java.lang.invoke.SwitchPoint[])` without invalidating it yet.
  `int`
  `getRetirementCount()`
  Returns how many live switch points have been retired.
  `SwitchPoint`
  `getSwitchPoint()`
  Returns a live switch point to install in a call-site guard chain.
  `void`
  `invalidate()`
  Invalidates the current live switch point (if any) so linked sites re-link.
  `static void`
  `invalidateIfLive(SwitchPoint sp)`
  Invalidates `sp` when non-null and still valid.

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Constructor Details

  - ### SwitchPointInvalidator

    public SwitchPointInvalidator()
    Creates an invalidator with no live SwitchPoint until the first `getSwitchPoint()` call. Field initializers own all state.

- ## Method Details

  - ### getSwitchPoint

    public SwitchPoint getSwitchPoint()
    Returns a live switch point to install in a call-site guard chain. Lazily allocates on first use after construction or after retirement.
    Returns:
      a live switch point (never `null`)

  - ### invalidate

    public void invalidate()
    Invalidates the current live switch point (if any) so linked sites re-link. A subsequent `getSwitchPoint()` allocates a fresh switch point.

  - ### detachLive

    public SwitchPoint detachLive()
    Atomically detaches the live switch point for bulk `SwitchPoint.invalidateAll(java.lang.invoke.SwitchPoint[])` without invalidating it yet. The caller must invalidate any non-null return value.
    Returns:
      the detached live switch point, or `null` if none was live

  - ### getRetirementCount

    public int getRetirementCount()
    Returns how many live switch points have been retired.
    Returns:
      the retirement count

  - ### invalidateIfLive

    public static void invalidateIfLive(SwitchPoint sp)
    Invalidates `sp` when non-null and still valid.
    Parameters:
      `sp` - candidate switch point (may be `null`)