# Interface DiscontinuedInstruction.JsrInstruction

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

Enclosing interface:
  `DiscontinuedInstruction`

public static sealed interface DiscontinuedInstruction.JsrInstruction extends DiscontinuedInstruction
Models jump 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_JSR`. Delivered as a `CodeElement` when traversing the elements of a `CodeModel`.

A jump subroutine instruction is composite:

    JsrInstruction(Label target)

Due to physical restrictions, `jsr` instructions cannot encode labels too far away in the list of code elements. In such cases, the `ClassFile.ShortJumpsOption` controls how an invalid `jsr` instruction model is written by a `CodeBuilder`.

Jump subroutine instructions push a `returnAddress` value to the operand stack, and `astore` series of instructions can then store this value to a local variable slot.

API Note:
  Jump subroutine instructions are discontinued to enforce verification by type checking (JVMS 4.10.1) using the `StackMapTable` attribute.
Since:
  24
See Also:
  - `Opcode.Kind.DISCONTINUED_JSR`
  - `StackMapTableAttribute`

- ## Nested Class Summary

  ### Nested classes/interfaces declared in interface DiscontinuedInstruction

  `DiscontinuedInstruction.JsrInstruction, DiscontinuedInstruction.RetInstruction`
  Modifier and Type
  Interface
  Description
  `static interface`
  `DiscontinuedInstruction.JsrInstruction`
  Models jump subroutine instructions discontinued from the `code` array of a `Code` attribute since class file major version 51 (JVMS 4.9.1).
  `static interface`
  `DiscontinuedInstruction.RetInstruction`
  Models return from subroutine instructions discontinued from the `code` array of a `Code` attribute since class file major version 51 (JVMS 4.9.1).

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static DiscontinuedInstruction.JsrInstruction`
  `of(Label target)`
  Returns a jump subroutine instruction.
  `static DiscontinuedInstruction.JsrInstruction`
  `of(Opcode op, Label target)`
  Returns a jump subroutine instruction.
  `Label`
  `target()`
  Returns the target of the jump subroutine instruction.

  ### Methods declared in interface Instruction

  `opcode, sizeInBytes`
  Modifier and Type
  Method
  Description
  `Opcode`
  `opcode()`
  Returns the operation of this instruction.
  `int`
  `sizeInBytes()`
  Returns the size in bytes of this instruction.

- ## Method Details

  - ### target

    Label target()
    Returns the target of the jump subroutine instruction.
    Returns:
      the target of the jump subroutine instruction

  - ### of

    static DiscontinuedInstruction.JsrInstruction of(Opcode op, Label target)
    Returns a jump subroutine instruction.
    API Note:
      The explicit `op` argument allows creating `jsr_w` instructions to avoid short jumps.
    Parameters:
      `op` - the opcode for the specific type of jump subroutine instruction, which must be of kind `Opcode.Kind.DISCONTINUED_JSR`
      `target` - target label of the subroutine
    Returns:
      a jump subroutine instruction
    Throws:
      `IllegalArgumentException` - if the opcode kind is not `Opcode.Kind.DISCONTINUED_JSR`.

  - ### of

    static DiscontinuedInstruction.JsrInstruction of(Label target)
    Returns a jump subroutine instruction.
    Parameters:
      `target` - target label of the subroutine
    Returns:
      a jump subroutine instruction