Package: org.apache.groovy.runtime.indy

## [Java] Class SwitchPointInvalidator

- 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 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 and description
    `SwitchPointInvalidator()` Creates an invalidator with no live SwitchPoint until the first getSwitchPoint() call.

  - ### Methods Summary

    Methods
    Type Params | Return Type | Name and description
    --- | --- | ---
    `` | `public SwitchPoint` | `detachLive()` Atomically detaches the live switch point for bulk SwitchPoint.invalidateAll without invalidating it yet.
    `` | `public int` | `getRetirementCount()` Returns how many live switch points have been retired.
    `` | `public SwitchPoint` | `getSwitchPoint()` Returns a live switch point to install in a call-site guard chain.
    `` | `public void` | `invalidate()` Invalidates the current live switch point (if any) so linked sites re-link.
    `` | `public static void` | `invalidateIfLive(SwitchPoint sp)` Invalidates `sp` when non-null and still valid.

  - ### Inherited Methods Summary

    Inherited Methods
    Methods inherited from class | Name
    --- | ---
    `class Object` | `equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### public SwitchPointInvalidator()

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

  - ### Method Detail

    - #### public SwitchPoint detachLive()

      Atomically detaches the live switch point for bulk SwitchPoint.invalidateAll 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

    - #### public int getRetirementCount()

      Returns how many live switch points have been retired.

      Returns:
        the retirement count

    - #### 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`)

    - #### public void invalidate()

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

    - #### public static void invalidateIfLive(SwitchPoint sp)

      Invalidates `sp` when non-null and still valid.

      Parameters:
        `sp` - candidate switch point (may be `null`)