public class AfterInvoke extends BeforeInvoke

This injection point searches for INVOKEVIRTUAL, INVOKESTATIC and INVOKESPECIAL opcodes matching its arguments and returns a list of insns after the matching instructions, with special handling for methods invocations which return a value and immediately assign it to a local variable. It accepts the following parameters from At:

target
A Target Selector which identifies the target method
ordinal
The ordinal position of the method invocation to match. For example if the method is invoked 3 times and you want to match the 3rd then you can specify an ordinal of 2 (ordinals are zero-indexed). The default value is -1 which supresses ordinal matching
named argument: fuzz
By default, the injection point inspects only the instruction immediately following the matched invocation and will match store instructions. Specifying a higher fuzz increases the search range, skipping instructions as necessary to find a matching store opcode.
named argument: skip
When fuzz is specified, a default list of skippable opcodes is used. The list of skippable opcodes can be overridden by specifying a list of opcodes (numeric values or constant names from Opcodes can be used). This can be used to restrict the fuzz behaviour to consume only expected opcodes (eg. CHECKCAST). Note that store opcodes cannot be skipped and specifying them has no effect.

Example:

   @At(value = "INVOKE_ASSIGN", target="func_1234_a(III)J")

Note that unlike other standard injection points, this class matches the insn after the invocation, and after any local variable assignment. Use the shift specifier to adjust the matched opcode as necessary.

  • Field Details

    • DEFAULT_SKIP

      public static final int[] DEFAULT_SKIP
      Default opcodes which are eligible to be skipped (see named argument skip above) if named argument fuzz is increased beyond the default value of 1.

      Skipped opcodes: DUP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, IINC, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, CHECKCAST, INSTANCEOF

  • Constructor Details

  • Method Details

    • addInsn

      protected boolean addInsn(org.objectweb.asm.tree.InsnList insns, Collection<org.objectweb.asm.tree.AbstractInsnNode> nodes, org.objectweb.asm.tree.AbstractInsnNode insn)
      Overrides:
      addInsn in class BeforeInvoke