Move structure offset constants into raw classes

This commit is contained in:
Ben Gruver 2013-03-05 23:50:21 -08:00
parent c5abfe4cea
commit e8158c86ef
6 changed files with 48 additions and 60 deletions

View File

@ -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;

View File

@ -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(); }

View File

@ -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;
}

View File

@ -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

View File

@ -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) {

View File

@ -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) {