From e8158c86efe5494fb5b369e096c7a857623a1b11 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Tue, 5 Mar 2013 23:50:21 -0800 Subject: [PATCH] Move structure offset constants into raw classes --- .../dexlib2/dexbacked/DexBackedClassDef.java | 27 +++++++------------ .../jf/dexlib2/dexbacked/DexBackedField.java | 9 +++---- .../jf/dexlib2/dexbacked/DexBackedMethod.java | 18 +++++-------- .../DexBackedMethodImplementation.java | 25 +++++++---------- .../dexlib2/dexbacked/DexBackedTryBlock.java | 18 ++++++++----- .../jf/dexlib2/dexbacked/raw/CodeItem.java | 11 +++++++- 6 files changed, 48 insertions(+), 60 deletions(-) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java index c6dc2326..10576295 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java @@ -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 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() { @@ -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() { @@ -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; diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java index a3539c3f..91a16608 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedField.java @@ -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(); } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java index 610e6bd7..c8899ad7 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethod.java @@ -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; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java index 90d99a46..3cfaaa7c 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java @@ -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 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() { @Override @@ -96,19 +89,19 @@ public class DexBackedMethodImplementation implements MethodImplementation { @Override public List 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() { @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 diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java index e39f4c5b..a5667fe1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java @@ -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 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) { diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java index 044da0e3..3b7b6b7d 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/CodeItem.java @@ -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) {