@Target(value=METHOD)
@Retention(value=RUNTIME)
public @interface ModifyVariable
method().
ModifyVariable callbacks should always take one argument of the
type to capture and return the same type. For example a ModifyVariable
for a local of type String should have the signature:
private String methodName(String variable) { ...
The callback receives the current value of the local variable, and should return the new value.
The injector has two operating modes, explicit and implicit , and can operate either on the entire LVT or on the method arguments only
.In explicit mode, the variable to capture can be specified by
specifying values for the discriminator arguments ordinal(),
index() and name(). The injector uses the discriminators in
order to attempt to locate the variable to capture. If no local variable
matches any discriminators, the capture fails.
If no values for the capture discrimiators are specified, the injector
operates in implicit mode. If exactly one variable of the capture
type exists in the target LVT, then capture will succeed. However, if more
than one variable of the required type is encountered in the LVT then an
InvalidInjectionException is thrown.
| Modifier and Type | Required Element and Description |
|---|---|
At |
at
An
At annotation which describes the InjectionPoint in
the target method. |
java.lang.String[] |
method
String representation of one or more
MemberInfo which identify the target methods. |
| Modifier and Type | Optional Element and Description |
|---|---|
int |
allow
Injection points are in general expected to match every candidate
instruction in the target method or slice, except in cases where options
such as
At.ordinal() are specified which naturally limit the number
of results. |
boolean |
argsOnly
Under normal circumstances the injector will consider all local variables
including method arguments and all other local variables.
|
java.lang.String |
constraints
Returns constraints which must be validated for this injector to
succeed.
|
int |
expect
Like
require() but only enabled if the
mixin.debug.countInjections option is set
to true and defaults to 1. |
int |
index
Gets the absolute index of the local variable within the local variable
table to capture.
|
java.lang.String[] |
name
Gets the name of the variable to capture.
|
int |
ordinal
Gets the local variable ordinal by type.
|
boolean |
print
When creating a
ModifyVariable callback, you may wish to first
inspect the local variable table in the target method at the injection
point. |
boolean |
remap
By default, the annotation processor will attempt to locate an
obfuscation mapping for all
ModifyVariable methods since it is
anticipated that in general the target of a ModifyVariable
annotation will be an obfuscated method in the target class. |
int |
require
In general, injectors are intended to "fail soft" in that a failure to
locate the injection point in the target method is not considered an
error condition.
|
Slice |
slice
|
public abstract java.lang.String[] method
MemberInfo which identify the target methods.public abstract At at
At annotation which describes the InjectionPoint in
the target method. The specified InjectionPoint must only
return MethodInsnNode instances
and an exception will be thrown if this is not the case.At which identifies the target method invocationpublic abstract Slice slice
public abstract boolean print
ModifyVariable callback, you may wish to first
inspect the local variable table in the target method at the injection
point. Set this value to true to print the local variable table
and perform no injection.public abstract int ordinal
String arguments in the local variable table, ordinal 0 specifies
the first, 1 specifies the second, etc. Use ordinal when the
index within the LVT is known. Takes precedence over index().public abstract int index
name().public abstract boolean argsOnly
public abstract boolean remap
ModifyVariable methods since it is
anticipated that in general the target of a ModifyVariable
annotation will be an obfuscated method in the target class. However
since it is possible to also apply mixins to non-obfuscated targets (or
non- obfuscated methods in obfuscated targets, such as methods added by
Forge) it may be necessary to suppress the compiler error which would
otherwise be generated. Setting this value to false will cause
the annotation processor to skip this annotation when attempting to build
the obfuscation table for the mixin.public abstract int require
However, this behaviour is not always desirable. For example, if your
application depends on a particular injection succeeding you may wish to
detect the injection failure as an error condition. This argument is thus
provided to allow you to stipulate a minimum number of successful
injections for this callback handler. If the number of injections
specified is not achieved then an InjectionError is thrown at
application time. Use this option with care.
public abstract int expect
require() but only enabled if the
mixin.debug.countInjections option is set
to true and defaults to 1. Use this option during debugging to
perform simple checking of your injectors. Causes the injector to throw
a InvalidInjectionException if the expected number of injections
is not realised.public abstract int allow
At.ordinal() are specified which naturally limit the number
of results.
This option allows for sanity-checking to be performed on the results
of an injection point by specifying a maximum allowed number of matches,
similar to that afforded by Group.max(). For example if your
injection is expected to match 4 invocations of a target method, but
instead matches 5, this can become a detectable tamper condition by
setting this value to 4.
Setting any value 1 or greater is allowed. Values less than 1 or less
than require() are ignored. require() supercedes this
argument such that if allow is less than require the
value of require is always used.
Note that this option is not a limit on the query behaviour of this injection point. It is only a sanity check used to ensure that the number of matches is not too high
public abstract java.lang.String constraints
ConstraintParser.Constraint for details of constraint formats.