getParameter(). Non-static methods and constructors also have a this
parameter; it's available as getThis(). Allocate a new local
variable using newLocal(), and assign a default value to it
with loadConstant(). Copy a value from one local to
another with move().
Every local variable has a fixed type. This is either a primitive type (of any size) or a reference type. This class emits instructions appropriate to the types they operate on. Not all operations are local on all types; attempting to emit such an operation will fail with an unchecked exception.
op(UnaryOp, Local, Local). Transform two values
into a third value using op(BinaryOp,
Local, Local, Local). In either overload the first Local parameter
is where the result will be sent; the other Local parameters are the
inputs.
compareLongs() compares two locals each
containing a long primitive. This is the only operation that
can compare longs. The result of the comparison is written to another
int local.compareFloatingPoint() compares two
locals; both float primitives or both double
primitives. This is the only operation that can compare floating
point values. This comparison takes an extra parameter that sets
the desired result if either parameter is NaN. The result of
the comparison is wrtten to another int local.
compare() compares two locals. The Comparison#EQ and Comparison#NE options compare either
int primitives or references. The other options compare only
int primitives. This comparison takes a Label that
will be jumped to if the comparison is true. If the comparison is
false the next instruction in sequence will be executed.
new Label(), and mark it using mark(Label). All jumps to a label will execute instructions starting from
that label. You can jump to a label that hasn't yet been marked (jumping
forward) or to a label that has already been marked (jumping backward). Jump
unconditionally with jump(Label) or conditionally based on a
comparison using compare().
Most methods should contain a return instruction. Void methods
should use returnVoid(); non-void methods should use returnValue() with a local whose return type matches the
method's return type. Constructors are considered void methods and should
call returnVoid(). Methods may make multiple returns. Methods
containing no return statements must either loop infinitely or throw
unconditionally; it is not legal to end a sequence of instructions without a
jump, return or throw.
addCatchClause() to register the target label and
throwable class. All statements that follow will jump to that catch clause if
they throw a Throwable assignable to that type. Use removeCatchClause() to unregister the throwable class.
Throw an throwable by first assigning it to a local and then calling
throwValue(). Control flow will jump to the nearest label
assigned to a type assignable to the thrown type. In this context, "nearest"
means the label requiring the fewest stack frames to be popped.
TypeId.getMethod() . This is more onerous than Java language invokes, which
can infer the target method using the target object and parameters. There are
four invoke kinds:
invokeStatic() is used for static methods.invokeDirect() is used for private instance
methods and for constructors to call their superclass's
constructor.invokeInterface() is used to invoke a method
whose declaring type is an interface.invokeVirtual() is used to invoke any other
method. The target must not be static, private, a constructor, or an
interface method.invokeSuper() is used to invoke the closest
superclass's virtual method. The target must not be static, private,
a constructor method, or an interface method.newInstance() is used to invoke a
constructor.sget(); write them using sput(). For instance values you'll need to specify the declaring
instance; use getThis() in an instance method to use this. Read instance values using iget() and write them with
iput().
newArray(). Read an array's length
with arrayLength() and its elements with aget(). Write an array's elements with aput().
cast() to perform either a numeric cast or
a type cast. Interrogate the type of a value in a local
using instanceOfType().
monitorEnter(); release it with
monitorExit(). It is the caller's responsibility to
guarantee that enter and exit calls are balanced, even in the presence of
exceptions thrownWarning
Even if a method has the synchronized flag,
dex requires instructions to acquire and release monitors manually. A method
declared with SYNCHRONIZED
but without manual calls to monitorEnter() and monitorExit()
will not be synchronized when executed.
| Modifier and Type | Field and Description |
|---|---|
| private StdTypeList | |
| private final List | |
| private final List | |
| private Label | currentLabel
The label currently receiving instructions. |
| private final List | labels
All allocated labels. |
| private final List | |
| private boolean | localsInitialized
true once we've fixed the positions of the parameter registers |
| private final MethodId | |
| private final List | parameters
The parameters on this method. |
| private SourcePosition | |
| private final Local |
| Access | Constructor and Description |
|---|---|
| pack-priv |
| Modifier and Type | Method and Description |
|---|---|
| public void | addCatchClause(TypeId<? extends Throwable> toCatch, Label catchClause)
Registers |
| private void | |
| private void | addInstruction(Insn insn, Label
the branches to follow; interpretation depends on the
instruction's branchingness. branch)
|
| private void | |
| public void | |
| public void | |
| public <T> void | |
| public void | |
| private void | |
| private <T> Local | |
| public <T> void | |
| public <T extends Number> void | compareFloatingPoint(Local<Integer> target, Local<T> a, Local<T> b, int nanValue)
Compare floats or doubles. |
| public void | |
| private static RegisterSpecList | |
| private Rop | |
| public <T> Local | getParameter(int index, TypeId<T> type)
Returns the local for the parameter at index |
| public <T> Local | |
| public <D, V> void | |
| pack-priv void | |
| public void | instanceOfType(Local<?> target, Local<?> source, TypeId<?> type)
Tests if the value in |
| private <D, R> void | |
| public <D, R> void | invokeDirect(MethodId<D, R>
either a private method or the superclass's constructor in
a constructor's call to method, Local<? super R> super().the local to receive the method's return value, or target, Local<? extends D> instance, Local<?>... args)null if the return type is void or if its value not needed.Calls |
| public <D, R> void | invokeInterface(MethodId<D, R>
a method declared on an interface. method, Local<? super R> the local to receive the method's return value, or target, Local<? extends D> instance, Local<?>... args)null if the return type is void or if its value not needed.Calls the interface method |
| public <R> void | invokeStatic(MethodId<?, R> method, Local<? super R>
the local to receive the method's return value, or target, Local<?>... args)null if the return type is void or if its value not needed.Calls the static method |
| public <D, R> void | invokeSuper(MethodId<D, R> method, Local<? super R>
the local to receive the method's return value, or target, Local<? extends D> instance, Local<?>... args)null if the return type is void or if its value not needed.Calls the closest superclass's virtual method |
| public <D, R> void | invokeVirtual(MethodId<D, R>
a non-private, non-static, method declared on a class. May
not be an interface method or a constructor. method, Local<? super R> the local to receive the method's return value, or target, Local<? extends D> instance, Local<?>... args)null if the return type is void or if its value not needed.Calls the non-private instance method |
| public <D, V> void | |
| public void | |
| public <T> void | |
| public void | |
| public void | |
| public void | |
| public <T> void | |
| private void | |
| public <T> void | |
| public <T> void | newInstance(Local<T> target, MethodId<T, Void> constructor, Local<?>... args)
Calls the constructor |
| public <T> Local | |
| public <T> void | |
| public <T1, T2> void | |
| pack-priv int | |
| public Label | removeCatchClause(TypeId<? extends Throwable> toCatch)
Deregisters the catch clause label for |
| public void | |
| public void | |
| public <V> void | |
| private void | splitCurrentLabel(Label alternateSuccessor, List<Label>
an immutable list of catch labels catchLabels)Closes the current label and starts a new one. |
| public <V> void | |
| public void | |
| pack-priv BasicBlockList | |
| private StdTypeList |
| catches | back to summary |
|---|---|
| private StdTypeList catches | |
| catchLabels | back to summary |
|---|---|
| private final List<Label> catchLabels | |
| catchTypes | back to summary |
|---|---|
| private final List<TypeId<?>> catchTypes | |
| currentLabel | back to summary |
|---|---|
| private Label currentLabel The label currently receiving instructions. This is null if the most recent instruction was a return or goto. | |
| labels | back to summary |
|---|---|
| private final List<Label> labels All allocated labels. Although the order of the labels in this list shouldn't impact behavior, it is used to determine basic block indices. | |
| locals | back to summary |
|---|---|
| private final List<Local<?>> locals | |
| localsInitialized | back to summary |
|---|---|
| private boolean localsInitialized true once we've fixed the positions of the parameter registers | |
| method | back to summary |
|---|---|
| private final MethodId<?, ?> method | |
| parameters | back to summary |
|---|---|
| private final List<Local<?>> parameters The parameters on this method. If this is non-static, the first parameter is 'thisLocal' and we have to offset the user's indices by one. | |
| sourcePosition | back to summary |
|---|---|
| private SourcePosition sourcePosition | |
| thisLocal | back to summary |
|---|---|
| private final Local<?> thisLocal | |
| Code | back to summary |
|---|---|
| pack-priv Code(DexMaker. | |
| addCatchClause | back to summary |
|---|---|
| public void addCatchClause(TypeId<? extends Throwable> toCatch, Label catchClause) Registers | |
| addInstruction | back to summary |
|---|---|
| private void addInstruction(Insn insn) | |
| addInstruction | back to summary |
|---|---|
private void addInstruction(Insn insn, Label branch)
| |
| adopt | back to summary |
|---|---|
| private void adopt(Label target) Assigns | |
| aget | back to summary |
|---|---|
| public void aget(Local<?> target, Local<?> array, Local<Integer> index) Assigns the element at | |
| aput | back to summary |
|---|---|
| public void aput(Local<?> array, Local<Integer> index, Local<?> source) Assigns | |
| arrayLength | back to summary |
|---|---|
| public <T> void arrayLength(Local<Integer> target, Local<T> array) Sets | |
| cast | back to summary | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| public void cast(Local<?> target, Local<?> source) Performs either a numeric cast or a type cast. Numeric CastsConverts a primitive to a different representation. Numeric casts may be lossy. For example, converting the double1.8d to an integer
yields 1, losing the fractional part. Converting the integer
0x12345678 to a short yields 0x5678, losing the high
bytes. The following numeric casts are supported:
For some primitive conversions it will be necessary to chain multiple cast operations. For example, to go from float to short one would first cast float to int and then int to short. Numeric casts never throw Type CastsChecks that a reference value is assignable to the target type. If it is assignable it is copied to the target local. If it is not assignable aClassCastException is thrown.
| |||||||||||
| cleanUpLabels | back to summary |
|---|---|
| private void cleanUpLabels() Removes empty labels and assigns IDs to non-empty labels. | |
| coerce | back to summary |
|---|---|
private <T> Local
| |
| compare | back to summary |
|---|---|
| public <T> void compare(Comparison comparison, Label trueLabel, Local<T> a, Local<T> b) Compare ints or references. If the comparison is true, execution jumps to
| |
| compareFloatingPoint | back to summary |
|---|---|
| public <T extends Number> void compareFloatingPoint(Local<Integer> target, Local<T> a, Local<T> b, int nanValue) Compare floats or doubles. This stores -1 in | |
| compareLongs | back to summary |
|---|---|
| public void compareLongs(Local<Integer> target, Local<Long> a, Local<Long> b) Compare longs. This stores -1 in | |
| concatenate | back to summary |
|---|---|
| private static RegisterSpecList concatenate(Local<?> first, Local<?>[] rest) | |
| getCastRop | back to summary |
|---|---|
| private Rop getCastRop(Type sourceType, Type targetType) | |
| getParameter | back to summary |
|---|---|
| public <T> Local Returns the local for the parameter at index | |
| getThis | back to summary |
|---|---|
| public <T> Local Returns the local for | |
| iget | back to summary |
|---|---|
| public <D, V> void iget(FieldId<D, V> fieldId, Local<V> target, Local<D> instance) Copies the value in instance field | |
| initializeLocals | back to summary |
|---|---|
| pack-priv void initializeLocals() Assigns registers to locals. From the spec: "the N arguments to a method land in the last N registers of the method's invocation frame, in order. Wide arguments consume two registers. Instance methods are passed a this reference as their first argument." In addition to assigning registers to each of the locals, this creates instructions to move parameters into their initial registers. These instructions are inserted before the code's first real instruction. | |
| instanceOfType | back to summary |
|---|---|
| public void instanceOfType(Local<?> target, Local<?> source, TypeId<?> type) Tests if the value in | |
| invoke | back to summary |
|---|---|
| private <D, R> void invoke(Rop rop, MethodId<D, R> method, Local<? super R> target, Local<? extends D> object, Local<?>... args) | |
| invokeDirect | back to summary |
|---|---|
| public <D, R> void invokeDirect(MethodId<D, R> method, Local<? super R> target, Local<? extends D> instance, Local<?>... args) Calls | |
| invokeInterface | back to summary |
|---|---|
| public <D, R> void invokeInterface(MethodId<D, R> method, Local<? super R> target, Local<? extends D> instance, Local<?>... args) Calls the interface method | |
| invokeStatic | back to summary |
|---|---|
| public <R> void invokeStatic(MethodId<?, R> method, Local<? super R> target, Local<?>... args) Calls the static method
| |
| invokeSuper | back to summary |
|---|---|
| public <D, R> void invokeSuper(MethodId<D, R> method, Local<? super R> target, Local<? extends D> instance, Local<?>... args) Calls the closest superclass's virtual method
| |
| invokeVirtual | back to summary |
|---|---|
| public <D, R> void invokeVirtual(MethodId<D, R> method, Local<? super R> target, Local<? extends D> instance, Local<?>... args) Calls the non-private instance method | |
| iput | back to summary |
|---|---|
| public <D, V> void iput(FieldId<D, V> fieldId, Local<D> instance, Local<V> source) Copies the value in | |
| jump | back to summary |
|---|---|
| public void jump(Label target) Transfers flow control to the instructions at | |
| loadConstant | back to summary |
|---|---|
| public <T> void loadConstant(Local<T> target, T value) Copies the constant value | |
| mark | back to summary |
|---|---|
| public void mark(Label label) Start defining instructions for the named label. | |
| monitorEnter | back to summary |
|---|---|
| public void monitorEnter(Local<?> monitor) Awaits the lock on | |
| monitorExit | back to summary |
|---|---|
| public void monitorExit(Local<?> monitor) Releases the held lock on | |
| move | back to summary |
|---|---|
| public <T> void move(Local<T> target, Local<T> source) Copies the value in | |
| moveResult | back to summary |
|---|---|
| private void moveResult(Local<?> target, boolean afterNonInvokeThrowingInsn) | |
| newArray | back to summary |
|---|---|
| public <T> void newArray(Local<T> target, Local<Integer> length) Assigns | |
| newInstance | back to summary |
|---|---|
| public <T> void newInstance(Local<T> target, MethodId<T, Void> constructor, Local<?>... args) Calls the constructor | |
| newLocal | back to summary |
|---|---|
| public <T> Local Allocates a new local variable of type | |
| op | back to summary |
|---|---|
| public <T> void op(UnaryOp op, Local<T> target, Local<T> source) Executes | |
| op | back to summary |
|---|---|
| public <T1, T2> void op(BinaryOp op, Local<T1> target, Local<T1> a, Local<T2> b) Executes | |
| paramSize | back to summary |
|---|---|
| pack-priv int paramSize() Returns the number of registers to hold the parameters. This includes the 'this' parameter if it exists. | |
| removeCatchClause | back to summary |
|---|---|
| public Label removeCatchClause(TypeId<? extends Throwable> toCatch) Deregisters the catch clause label for | |
| returnValue | back to summary |
|---|---|
| public void returnValue(Local<?> result) Returns the value in | |
| returnVoid | back to summary |
|---|---|
| public void returnVoid() Returns from a | |
| sget | back to summary |
|---|---|
| public <V> void sget(FieldId<?, V> fieldId, Local<V> target) Copies the value in the static field | |
| splitCurrentLabel | back to summary |
|---|---|
| private void splitCurrentLabel(Label alternateSuccessor, List<Label> catchLabels) Closes the current label and starts a new one. | |
| sput | back to summary |
|---|---|
| public <V> void sput(FieldId<?, V> fieldId, Local<V> source) Copies the value in | |
| throwValue | back to summary |
|---|---|
| public void throwValue(Local<? extends Throwable> toThrow) Throws the throwable in | |
| toBasicBlocks | back to summary |
|---|---|
| pack-priv BasicBlockList toBasicBlocks() | |
| toTypeList | back to summary |
|---|---|
| private StdTypeList toTypeList(List<TypeId<?>> types) | |