Package ghidra.pcode.struct

# Annotation Interface StructuredSleigh.StructuredUserop

Enclosing class:
  `StructuredSleigh`

@Retention(RUNTIME) @Target(METHOD) protected static @interface StructuredSleigh.StructuredUserop
"Export" a method as a p-code userop implemented using p-code compiled from structured Sleigh

This is applied to methods used to generate Sleigh source code. Take note that the method is only invoked once (for a given library instance) to generate code. Thus, beware of non-determinism during code generation. For example, implementing something like `rdrnd` in structured Sleigh is rife with peril. Take the following implementation:

     @StructuredUserop
     public void rdrnd() {
            r0.set(Random.nextLong()); // BAD: Die rolled once at compile time
     }

The random number will be generated once at structured Sleigh compilation time, and then that same number used on every invocation of the p-code userop. Instead, this userop should be implemented using a Java callback, i.e., `AnnotatedPcodeUseropLibrary.PcodeUserop`.

The userop may accept parameters and return a result. To accept parameters, declare them in the Java method signature and annotate them with `StructuredSleigh.Param`. To return a result, name the appropriate type in the `type()` attribute and use `StructuredSleigh._result(RVal)`. The Java return type of the method must still be `void`. Note that parameters are passed by reference, so results can also be communicated by setting a parameter's value.

- ## Optional Element Summary

  Optional Elements
  Modifier and Type
  Optional Element
  Description
  `String`
  `type`
  The data type path for the "return type" of the userop.

- ## Element Details

  - ### type

    String type
    The data type path for the "return type" of the userop. See `StructuredSleigh.type(String)`.
    Default:
      `"void"`