mirror of
https://github.com/revanced/smali.git
synced 2025-05-28 11:50:12 +02:00
Move structure offset constants into raw classes
This commit is contained in:
parent
c5abfe4cea
commit
e8158c86ef
@ -33,6 +33,7 @@ package org.jf.dexlib2.dexbacked;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import org.jf.dexlib2.base.reference.BaseTypeReference;
|
||||
import org.jf.dexlib2.dexbacked.raw.ClassDefItem;
|
||||
import org.jf.dexlib2.dexbacked.util.AnnotationsDirectory;
|
||||
import org.jf.dexlib2.dexbacked.util.FixedSizeSet;
|
||||
import org.jf.dexlib2.dexbacked.util.StaticInitialValueIterator;
|
||||
@ -53,16 +54,6 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef {
|
||||
|
||||
@Nullable private AnnotationsDirectory annotationsDirectory;
|
||||
|
||||
//class_def_item offsets
|
||||
private static final int CLASS_NAME_OFFSET = 0;
|
||||
private static final int ACCESS_FLAGS_OFFSET = 4;
|
||||
private static final int SUPERCLASS_OFFSET = 8;
|
||||
private static final int INTERFACES_OFFSET = 12;
|
||||
private static final int SOURCE_FILE_OFFSET = 16;
|
||||
private static final int ANNOTATIONS_OFFSET = 20;
|
||||
private static final int CLASS_DATA_OFFSET = 24;
|
||||
private static final int STATIC_INITIAL_VALUES_OFFSET = 28;
|
||||
|
||||
public DexBackedClassDef(@Nonnull DexBackedDexFile dexFile,
|
||||
int classDefOffset) {
|
||||
this.dexFile = dexFile;
|
||||
@ -72,30 +63,30 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef {
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getType() {
|
||||
return dexFile.getType(dexFile.readSmallUint(classDefOffset + CLASS_NAME_OFFSET));
|
||||
return dexFile.getType(dexFile.readSmallUint(classDefOffset + ClassDefItem.CLASS_OFFSET));
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getSuperclass() {
|
||||
return dexFile.getOptionalType(dexFile.readOptionalUint(classDefOffset + SUPERCLASS_OFFSET));
|
||||
return dexFile.getOptionalType(dexFile.readOptionalUint(classDefOffset + ClassDefItem.SUPERCLASS_OFFSET));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAccessFlags() {
|
||||
return dexFile.readSmallUint(classDefOffset + ACCESS_FLAGS_OFFSET);
|
||||
return dexFile.readSmallUint(classDefOffset + ClassDefItem.ACCESS_FLAGS_OFFSET);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public String getSourceFile() {
|
||||
return dexFile.getOptionalString(dexFile.readOptionalUint(classDefOffset + SOURCE_FILE_OFFSET));
|
||||
return dexFile.getOptionalString(dexFile.readOptionalUint(classDefOffset + ClassDefItem.SOURCE_FILE_OFFSET));
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public Set<String> getInterfaces() {
|
||||
final int interfacesOffset = dexFile.readSmallUint(classDefOffset + INTERFACES_OFFSET);
|
||||
final int interfacesOffset = dexFile.readSmallUint(classDefOffset + ClassDefItem.INTERFACES_OFFSET);
|
||||
if (interfacesOffset > 0) {
|
||||
final int size = dexFile.readSmallUint(interfacesOffset);
|
||||
return new FixedSizeSet<String>() {
|
||||
@ -132,7 +123,7 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef {
|
||||
|
||||
final AnnotationsDirectory annotationsDirectory = getAnnotationsDirectory();
|
||||
final int staticInitialValuesOffset =
|
||||
dexFile.readSmallUint(classDefOffset + STATIC_INITIAL_VALUES_OFFSET);
|
||||
dexFile.readSmallUint(classDefOffset + ClassDefItem.STATIC_VALUES_OFFSET);
|
||||
final int fieldsStartOffset = reader.getOffset();
|
||||
|
||||
return new AbstractSet<DexBackedField>() {
|
||||
@ -225,14 +216,14 @@ public class DexBackedClassDef extends BaseTypeReference implements ClassDef {
|
||||
|
||||
private int getClassDataOffset() {
|
||||
if (classDataOffset == -1) {
|
||||
classDataOffset = dexFile.readSmallUint(classDefOffset + CLASS_DATA_OFFSET);
|
||||
classDataOffset = dexFile.readSmallUint(classDefOffset + ClassDefItem.CLASS_DATA_OFFSET);
|
||||
}
|
||||
return classDataOffset;
|
||||
}
|
||||
|
||||
private AnnotationsDirectory getAnnotationsDirectory() {
|
||||
if (annotationsDirectory == null) {
|
||||
int annotationsDirectoryOffset = dexFile.readSmallUint(classDefOffset + ANNOTATIONS_OFFSET);
|
||||
int annotationsDirectoryOffset = dexFile.readSmallUint(classDefOffset + ClassDefItem.ANNOTATIONS_OFFSET);
|
||||
annotationsDirectory = AnnotationsDirectory.newOrEmpty(dexFile, annotationsDirectoryOffset);
|
||||
}
|
||||
return annotationsDirectory;
|
||||
|
@ -32,6 +32,7 @@
|
||||
package org.jf.dexlib2.dexbacked;
|
||||
|
||||
import org.jf.dexlib2.base.reference.BaseFieldReference;
|
||||
import org.jf.dexlib2.dexbacked.raw.FieldIdItem;
|
||||
import org.jf.dexlib2.dexbacked.util.AnnotationsDirectory;
|
||||
import org.jf.dexlib2.dexbacked.util.StaticInitialValueIterator;
|
||||
import org.jf.dexlib2.iface.ClassDef;
|
||||
@ -54,10 +55,6 @@ public class DexBackedField extends BaseFieldReference implements Field {
|
||||
|
||||
private int fieldIdItemOffset;
|
||||
|
||||
// offsets for field_id_item
|
||||
private static final int TYPE_OFFSET = 2;
|
||||
private static final int NAME_OFFSET = 4;
|
||||
|
||||
public DexBackedField(@Nonnull DexReader reader,
|
||||
@Nonnull DexBackedClassDef classDef,
|
||||
int previousFieldIndex,
|
||||
@ -77,13 +74,13 @@ public class DexBackedField extends BaseFieldReference implements Field {
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getName() {
|
||||
return dexFile.getString(dexFile.readSmallUint(getFieldIdItemOffset() + NAME_OFFSET));
|
||||
return dexFile.getString(dexFile.readSmallUint(getFieldIdItemOffset() + FieldIdItem.NAME_OFFSET));
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getType() {
|
||||
return dexFile.getType(dexFile.readUshort(getFieldIdItemOffset() + TYPE_OFFSET));
|
||||
return dexFile.getType(dexFile.readUshort(getFieldIdItemOffset() + FieldIdItem.TYPE_OFFSET));
|
||||
}
|
||||
|
||||
@Nonnull @Override public String getDefiningClass() { return classDef.getType(); }
|
||||
|
@ -34,6 +34,8 @@ package org.jf.dexlib2.dexbacked;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Iterators;
|
||||
import org.jf.dexlib2.base.reference.BaseMethodReference;
|
||||
import org.jf.dexlib2.dexbacked.raw.MethodIdItem;
|
||||
import org.jf.dexlib2.dexbacked.raw.ProtoIdItem;
|
||||
import org.jf.dexlib2.dexbacked.raw.TypeListItem;
|
||||
import org.jf.dexlib2.dexbacked.util.AnnotationsDirectory;
|
||||
import org.jf.dexlib2.dexbacked.util.FixedSizeList;
|
||||
@ -65,14 +67,6 @@ public class DexBackedMethod extends BaseMethodReference implements Method {
|
||||
private int protoIdItemOffset;
|
||||
private int parametersOffset = -1;
|
||||
|
||||
// method_id_item offsets
|
||||
private static final int PROTO_OFFSET = 2;
|
||||
private static final int NAME_OFFSET = 4;
|
||||
|
||||
// proto_id_item offsets
|
||||
private static final int RETURN_TYPE_OFFSET = 4;
|
||||
private static final int PARAMETERS_OFFSET = 8;
|
||||
|
||||
public DexBackedMethod(@Nonnull DexReader reader,
|
||||
@Nonnull DexBackedClassDef classDef,
|
||||
int previousMethodIndex) {
|
||||
@ -112,13 +106,13 @@ public class DexBackedMethod extends BaseMethodReference implements Method {
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getName() {
|
||||
return dexFile.getString(dexFile.readSmallUint(getMethodIdItemOffset() + NAME_OFFSET));
|
||||
return dexFile.getString(dexFile.readSmallUint(getMethodIdItemOffset() + MethodIdItem.NAME_OFFSET));
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public String getReturnType() {
|
||||
return dexFile.getType(dexFile.readSmallUint(getProtoIdItemOffset() + RETURN_TYPE_OFFSET));
|
||||
return dexFile.getType(dexFile.readSmallUint(getProtoIdItemOffset() + ProtoIdItem.RETURN_TYPE_OFFSET));
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@ -200,7 +194,7 @@ public class DexBackedMethod extends BaseMethodReference implements Method {
|
||||
|
||||
private int getProtoIdItemOffset() {
|
||||
if (protoIdItemOffset == 0) {
|
||||
int protoIndex = dexFile.readUshort(getMethodIdItemOffset() + PROTO_OFFSET);
|
||||
int protoIndex = dexFile.readUshort(getMethodIdItemOffset() + MethodIdItem.PROTO_OFFSET);
|
||||
protoIdItemOffset = dexFile.getProtoIdItemOffset(protoIndex);
|
||||
}
|
||||
return protoIdItemOffset;
|
||||
@ -208,7 +202,7 @@ public class DexBackedMethod extends BaseMethodReference implements Method {
|
||||
|
||||
private int getParametersOffset() {
|
||||
if (parametersOffset == -1) {
|
||||
parametersOffset = dexFile.readSmallUint(getProtoIdItemOffset() + PARAMETERS_OFFSET);
|
||||
parametersOffset = dexFile.readSmallUint(getProtoIdItemOffset() + ProtoIdItem.PARAMETERS_OFFSET);
|
||||
}
|
||||
return parametersOffset;
|
||||
}
|
||||
|
@ -33,6 +33,7 @@ package org.jf.dexlib2.dexbacked;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.jf.dexlib2.dexbacked.instruction.DexBackedInstruction;
|
||||
import org.jf.dexlib2.dexbacked.raw.CodeItem;
|
||||
import org.jf.dexlib2.dexbacked.util.DebugInfo;
|
||||
import org.jf.dexlib2.dexbacked.util.FixedSizeList;
|
||||
import org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator;
|
||||
@ -52,14 +53,6 @@ public class DexBackedMethodImplementation implements MethodImplementation {
|
||||
@Nonnull public final DexBackedMethod method;
|
||||
private final int codeOffset;
|
||||
|
||||
// code_item offsets
|
||||
private static final int TRIES_SIZE_OFFSET = 6;
|
||||
private static final int DEBUG_OFFSET_OFFSET = 8;
|
||||
private static final int INSTRUCTIONS_SIZE_OFFSET = 12;
|
||||
private static final int INSTRUCTIONS_START_OFFSET = 16;
|
||||
|
||||
private static final int TRY_ITEM_SIZE = 8;
|
||||
|
||||
public DexBackedMethodImplementation(@Nonnull DexBackedDexFile dexFile,
|
||||
@Nonnull DexBackedMethod method,
|
||||
int codeOffset) {
|
||||
@ -72,9 +65,9 @@ public class DexBackedMethodImplementation implements MethodImplementation {
|
||||
|
||||
@Nonnull @Override public Iterable<? extends Instruction> getInstructions() {
|
||||
// instructionsSize is the number of 16-bit code units in the instruction list, not the number of instructions
|
||||
int instructionsSize = dexFile.readSmallUint(codeOffset + INSTRUCTIONS_SIZE_OFFSET);
|
||||
int instructionsSize = dexFile.readSmallUint(codeOffset + CodeItem.INSTRUCTION_COUNT_OFFSET);
|
||||
|
||||
final int instructionsStartOffset = codeOffset + INSTRUCTIONS_START_OFFSET;
|
||||
final int instructionsStartOffset = codeOffset + CodeItem.INSTRUCTION_START_OFFSET;
|
||||
final int endOffset = instructionsStartOffset + (instructionsSize*2);
|
||||
return new Iterable<Instruction>() {
|
||||
@Override
|
||||
@ -96,19 +89,19 @@ public class DexBackedMethodImplementation implements MethodImplementation {
|
||||
@Override
|
||||
public List<? extends TryBlock> getTryBlocks() {
|
||||
// TODO: provide utility to put try blocks into a "canonical", easy to use format, which more closely matches java's try blocks
|
||||
final int triesSize = dexFile.readUshort(codeOffset + TRIES_SIZE_OFFSET);
|
||||
final int triesSize = dexFile.readUshort(codeOffset + CodeItem.TRIES_SIZE_OFFSET);
|
||||
if (triesSize > 0) {
|
||||
int instructionsSize = dexFile.readSmallUint(codeOffset + INSTRUCTIONS_SIZE_OFFSET);
|
||||
int instructionsSize = dexFile.readSmallUint(codeOffset + CodeItem.INSTRUCTION_COUNT_OFFSET);
|
||||
final int triesStartOffset = AlignmentUtils.alignOffset(
|
||||
codeOffset + INSTRUCTIONS_START_OFFSET + (instructionsSize*2), 4);
|
||||
final int handlersStartOffset = triesStartOffset + triesSize*TRY_ITEM_SIZE;
|
||||
codeOffset + CodeItem.INSTRUCTION_START_OFFSET + (instructionsSize*2), 4);
|
||||
final int handlersStartOffset = triesStartOffset + triesSize*CodeItem.TryItem.ITEM_SIZE;
|
||||
|
||||
return new FixedSizeList<TryBlock>() {
|
||||
@Nonnull
|
||||
@Override
|
||||
public TryBlock readItem(int index) {
|
||||
return new DexBackedTryBlock(dexFile,
|
||||
triesStartOffset + index*TRY_ITEM_SIZE,
|
||||
triesStartOffset + index*CodeItem.TryItem.ITEM_SIZE,
|
||||
handlersStartOffset);
|
||||
}
|
||||
|
||||
@ -123,7 +116,7 @@ public class DexBackedMethodImplementation implements MethodImplementation {
|
||||
|
||||
@Nonnull
|
||||
private DebugInfo getDebugInfo() {
|
||||
return DebugInfo.newOrEmpty(dexFile, dexFile.readSmallUint(codeOffset + DEBUG_OFFSET_OFFSET), this);
|
||||
return DebugInfo.newOrEmpty(dexFile, dexFile.readSmallUint(codeOffset + CodeItem.DEBUG_INFO_OFFSET), this);
|
||||
}
|
||||
|
||||
@Nonnull @Override
|
||||
|
@ -31,6 +31,7 @@
|
||||
|
||||
package org.jf.dexlib2.dexbacked;
|
||||
|
||||
import org.jf.dexlib2.dexbacked.raw.CodeItem;
|
||||
import org.jf.dexlib2.dexbacked.util.VariableSizeList;
|
||||
import org.jf.dexlib2.iface.ExceptionHandler;
|
||||
import org.jf.dexlib2.iface.TryBlock;
|
||||
@ -43,9 +44,7 @@ public class DexBackedTryBlock implements TryBlock {
|
||||
private final int tryItemOffset;
|
||||
private final int handlersStartOffset;
|
||||
|
||||
private static final int START_ADDRESS_OFFSET = 0;
|
||||
private static final int CODE_UNIT_COUNT_OFFSET = 4;
|
||||
private static final int HANDLER_OFFSET_OFFSET = 6;
|
||||
|
||||
|
||||
public DexBackedTryBlock(@Nonnull DexBackedDexFile dexFile,
|
||||
int tryItemOffset,
|
||||
@ -55,14 +54,19 @@ public class DexBackedTryBlock implements TryBlock {
|
||||
this.handlersStartOffset = handlersStartOffset;
|
||||
}
|
||||
|
||||
@Override public int getStartCodeAddress() { return dexFile.readSmallUint(tryItemOffset + START_ADDRESS_OFFSET); }
|
||||
@Override public int getCodeUnitCount() { return dexFile.readUshort(tryItemOffset + CODE_UNIT_COUNT_OFFSET); }
|
||||
@Override public int getStartCodeAddress() {
|
||||
return dexFile.readSmallUint(tryItemOffset + CodeItem.TryItem.START_ADDRESS_OFFSET);
|
||||
}
|
||||
|
||||
@Override public int getCodeUnitCount() {
|
||||
return dexFile.readUshort(tryItemOffset + CodeItem.TryItem.CODE_UNIT_COUNT_OFFSET);
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public List<? extends ExceptionHandler> getExceptionHandlers() {
|
||||
DexReader reader =
|
||||
dexFile.readerAt(handlersStartOffset + dexFile.readUshort(tryItemOffset + HANDLER_OFFSET_OFFSET));
|
||||
DexReader reader = dexFile.readerAt(
|
||||
handlersStartOffset + dexFile.readUshort(tryItemOffset + CodeItem.TryItem.HANDLER_OFFSET));
|
||||
final int encodedSize = reader.readSleb128();
|
||||
|
||||
if (encodedSize > 0) {
|
||||
|
@ -50,9 +50,18 @@ public class CodeItem {
|
||||
public static final int REGISTERS_OFFSET = 0;
|
||||
public static final int INS_OFFSET = 2;
|
||||
public static final int OUTS_OFFSET = 4;
|
||||
public static final int TRIES_OFFSET = 6;
|
||||
public static final int TRIES_SIZE_OFFSET = 6;
|
||||
public static final int DEBUG_INFO_OFFSET = 8;
|
||||
public static final int INSTRUCTION_COUNT_OFFSET = 12;
|
||||
public static final int INSTRUCTION_START_OFFSET = 16;
|
||||
|
||||
public static class TryItem {
|
||||
public static final int ITEM_SIZE = 8;
|
||||
|
||||
public static final int START_ADDRESS_OFFSET = 0;
|
||||
public static final int CODE_UNIT_COUNT_OFFSET = 4;
|
||||
public static final int HANDLER_OFFSET = 6;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user