DiscontinuedInstruction.RetInstruction (Java SE 25 & JDK 25)
Description: declaration: module: java.base, package: java.lang.classfile.instruction, interface: DiscontinuedInstruction, interface: RetInstruction
Keywords: java.lang.classfile.instruction.DiscontinuedInstruction.RetInstruction interface

# Interface DiscontinuedInstruction.RetInstruction

All Superinterfaces:
  `ClassFileElement, CodeElement, DiscontinuedInstruction, Instruction`

Enclosing interface:
  `DiscontinuedInstruction`

public static sealed interface DiscontinuedInstruction.RetInstruction extends DiscontinuedInstruction
Models return from subroutine instructions discontinued from the `code` array of a `Code` attribute since class file major version 51 (JVMS 4.9.1). Corresponding opcodes have a kind of `Opcode.Kind.DISCONTINUED_RET`. Delivered as a `CodeElement` when traversing the elements of a `CodeModel`.

A return from subroutine instruction is composite:

    RetInstruction(int slot)

where `slot` must be within `[0, 65535]`.

`astore` series of instructions store a `returnAddress` value to a local variable slot, making the slot usable by a return from subroutine instruction.

API Note:
  Return from subroutine instructions are discontinued to enforce verification by type checking (JVMS 4.10.1) using the `StackMapTable` attribute.
See Java Virtual Machine Specification:
  6.5.ret ret
Since:
  24
See Also:
  - `Opcode.Kind.DISCONTINUED_RET`
  - `StackMapTableAttribute`

- ## Nested Class Summary

  ### Nested classes/interfaces declared in interface DiscontinuedInstruction

  `DiscontinuedInstruction.JsrInstruction, DiscontinuedInstruction.RetInstruction`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static DiscontinuedInstruction.RetInstruction`
  `of(int slot)`
  Returns a return from subroutine instruction.
  `static DiscontinuedInstruction.RetInstruction`
  `of(Opcode op, int slot)`
  Returns a return from subroutine instruction.
  `int`
  `slot()`
  Returns the local variable slot with return address.

  ### Methods declared in interface Instruction

  `opcode, sizeInBytes`

- ## Method Details

  - ### slot

    int slot()
    Returns the local variable slot with return address. The value is within `[0, 65535]`.
    Returns:
      the local variable slot with return address

  - ### of

    static DiscontinuedInstruction.RetInstruction of(Opcode op, int slot)
    Returns a return from subroutine instruction.

    `slot` must be in the closed range of `[0, 255]` for `ret`, or within `[0, 65535]` for `wide ret`.

    API Note:
      The explicit `op` argument allows creating `wide ret` instructions with `slot` in the range of regular `ret` instructions.
    Parameters:
      `op` - the opcode for the specific type of return from subroutine instruction, which must be of kind `Opcode.Kind.DISCONTINUED_RET`
      `slot` - the local variable slot to load return address from
    Returns:
      a return from subroutine instruction
    Throws:
      `IllegalArgumentException` - if the opcode kind is not `Opcode.Kind.DISCONTINUED_RET` or if `slot` is out of range

  - ### of

    static DiscontinuedInstruction.RetInstruction of(int slot)
    Returns a return from subroutine instruction.

    `slot` must be within `[0, 65535]`.

    Parameters:
      `slot` - the local variable slot to load return address from
    Returns:
      a return from subroutine instruction
    Throws:
      `IllegalArgumentException` - if `slot` is out of range