@Override public int getStartRegister() { return dexFile.readUshort(instructionStart + 4); }
public int getType() { return dexFile.readUshort(offset + TYPE_OFFSET); }
@Override public int getRegisterCount() { return dexFile.readUshort(codeOffset); }
@Nonnull @Override public String getDefiningClass() { return dexFile.getType(dexFile.readUshort(methodIdItemOffset + MethodIdItem.CLASS_OFFSET)); }
@Nonnull @Override public String readItem(final int index) { return dexFile.getType(dexFile.readUshort(paramListStart + 2*index)); } @Override public int size() { return parameterCount; }
@Nonnull @Override public Reference getReference() { return DexBackedReference.makeReference(dexFile, opcode.referenceType, dexFile.readUshort(instructionStart + 2)); }
@Nonnull @Override public String readItem(final int index) { return dexFile.getType(dexFile.readUshort(paramListStart + 2*index)); } @Override public int size() { return parameterCount; }
private int getProtoIdItemOffset() { if (protoIdItemOffset == 0) { protoIdItemOffset = dexFile.getProtoIdItemOffset( dexFile.readUshort(methodIdItemOffset + MethodIdItem.PROTO_OFFSET)); } return protoIdItemOffset; }
@Nonnull @Override public String readItem(final int index) { return dexFile.getType(dexFile.readUshort(paramListStart + 2*index)); } @Override public int size() { return parameterCount; }
@Nonnull @Override public Reference getReference() { return DexBackedReference.makeReference(dexFile, opcode.referenceType, dexFile.readUshort(instructionStart + 2)); }
@Override public Reference getReference2() { return DexBackedReference.makeReference(dexFile, opcode.referenceType2, dexFile.readUshort(instructionStart + 6)); }
@Override @Nonnull public String get(int index) { return dexFile.getType(dexFile.readUshort(interfacesOffset + 4 + (2*index))); }
@Override public Reference getReference2() { return DexBackedReference.makeReference(dexFile, opcode.referenceType2, dexFile.readUshort(instructionStart + 6)); }
private int getProtoIdItemOffset() { if (protoIdItemOffset == 0) { int protoIndex = dexFile.readUshort(getMethodIdItemOffset() + MethodIdItem.PROTO_OFFSET); protoIdItemOffset = dexFile.getProtoIdItemOffset(protoIndex); } return protoIdItemOffset; }
@Nonnull @Override public List<? extends DexBackedTryBlock> getTryBlocks() { final int triesSize = dexFile.readUshort(codeOffset + CodeItem.TRIES_SIZE_OFFSET); if (triesSize > 0) { int instructionsSize = dexFile.readSmallUint(codeOffset + CodeItem.INSTRUCTION_COUNT_OFFSET); final int triesStartOffset = AlignmentUtils.alignOffset( codeOffset + CodeItem.INSTRUCTION_START_OFFSET + (instructionsSize*2), 4); final int handlersStartOffset = triesStartOffset + triesSize*CodeItem.TryItem.ITEM_SIZE; return new FixedSizeList<DexBackedTryBlock>() { @Nonnull @Override public DexBackedTryBlock readItem(int index) { return new DexBackedTryBlock(dexFile, triesStartOffset + index*CodeItem.TryItem.ITEM_SIZE, handlersStartOffset); } @Override public int size() { return triesSize; } }; } return ImmutableList.of(); }
@Override public int getInlineIndex() { return dexFile.readUshort(instructionStart + 2); } }
@Override public int getFieldOffset() { return dexFile.readUshort(instructionStart + 2); } }
@Nonnull @Override public Reference getReference() { return DexBackedReference.makeReference(dexFile, opcode.referenceType, dexFile.readUshort(instructionStart + 2)); }
public DexBackedArrayPayload(@Nonnull DexBackedDexFile dexFile, int instructionStart) { super(dexFile, OPCODE, instructionStart); elementWidth = dexFile.readUshort(instructionStart + ELEMENT_WIDTH_OFFSET); elementCount = dexFile.readSmallUint(instructionStart + ELEMENT_COUNT_OFFSET); if (((long)elementWidth) * elementCount > Integer.MAX_VALUE) { throw new ExceptionWithContext("Invalid array-payload instruction: element width*count overflows"); } }
public static String asString(DexBackedDexFile dexFile, int fieldIndex) { int fieldOffset = dexFile.getFieldIdItemOffset(fieldIndex); int classIndex = dexFile.readUshort(fieldOffset + CLASS_OFFSET); String classType = dexFile.getType(classIndex); int typeIndex = dexFile.readUshort(fieldOffset + TYPE_OFFSET); String fieldType = dexFile.getType(typeIndex); int nameIndex = dexFile.readSmallUint(fieldOffset + NAME_OFFSET); String fieldName = dexFile.getString(nameIndex); return String.format("%s->%s:%s", classType, fieldName, fieldType); }