# Interface StoreInstruction

All Superinterfaces:
  `ClassFileElement, CodeElement, Instruction`

public sealed interface StoreInstruction extends Instruction
Models a local variable store instruction in the `code` array of a `Code` attribute. Corresponding opcodes have a kind of `Opcode.Kind.STORE`. Delivered as a `CodeElement` when traversing the elements of a `CodeModel`.

A local variable store instruction is composite:

    StoreInstruction(
        TypeKind typeKind,
        int slot
    )

where `TypeKind` is computational, and `slot` is within `[0, 65535]`.

`astore` series of instructions, or `reference` type store instructions, can also operate on the `returnAddress` type from discontinued jump subroutine instructions.

Since:
  24
See Also:
  - `Opcode.Kind.STORE`
  - `CodeBuilder::storeLocal`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `static StoreInstruction`
  `of(Opcode op, int slot)`
  Returns a local variable store instruction.
  `static StoreInstruction`
  `of(TypeKind kind, int slot)`
  Returns a local variable store instruction.
  `int`
  `slot()`
  Returns the local variable slot to store to.
  `TypeKind`
  `typeKind()`
  Returns the computational type of the value to be stored.

  ### Methods declared in interface Instruction

  `opcode, sizeInBytes`

- ## Method Details

  - ### slot

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

  - ### typeKind

    TypeKind typeKind()
    Returns the computational type of the value to be stored. The `reference` type store instructions also operate on the `returnAddress` type, which does not apply to `reference` type load instructions.
    Returns:
      the computational type of the value to be stored

  - ### of

    static StoreInstruction of(TypeKind kind, int slot)
    Returns a local variable store instruction. `kind` is converted to its computational type. `slot` must be within `[0, 65535]`.
    Parameters:
      `kind` - the type of the value to be stored
      `slot` - the local variable slot to store to
    Returns:
      a local variable store instruction
    Throws:
      `IllegalArgumentException` - if `kind` is `void` or `slot` is out of range

  - ### of

    static StoreInstruction of(Opcode op, int slot)
    Returns a local variable store instruction.

    The range of `slot` is restricted by the `op` and its size:

    - If `op` has size 1, `slot` must be exactly the slot value implied by the opcode.
    - If `op` has size 2, `slot` must be within `[0, 255]`.
    - If `op` has size 4, `slot` must be within `[0, 65535]`.
    API Note:
      The explicit `op` argument allows creating `wide` or regular store instructions when the `slot` can be encoded with more optimized store instructions.
    Parameters:
      `op` - the opcode for the specific type of store instruction, which must be of kind `Opcode.Kind.STORE`
      `slot` - the local variable slot to store to
    Returns:
      a local variable store instruction
    Throws:
      `IllegalArgumentException` - if the opcode kind is not `Opcode.Kind.STORE` or `slot` is out of range