From 87179940cbe7b0570f2fbdd9bc0b218e3535bcf7 Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sun, 28 Oct 2012 12:34:25 -0700 Subject: [PATCH] Restart the numbering for encoded methods/fields --- .../dexlib2/dexbacked/DexBackedClassDef.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 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 12337a33..6cc765e6 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedClassDef.java @@ -114,7 +114,7 @@ public class DexBackedClassDef implements ClassDef { public List getFields() { if (classDataOffset != 0) { DexReader reader = dexBuf.readerAt(classDataOffset); - int staticFieldCount = reader.readSmallUleb128(); + final int staticFieldCount = reader.readSmallUleb128(); int instanceFieldCount = reader.readSmallUleb128(); final int fieldCount = staticFieldCount + instanceFieldCount; if (fieldCount > 0) { @@ -137,6 +137,11 @@ public class DexBackedClassDef implements ClassDef { @Nonnull @Override protected DexBackedField readItem(@Nonnull DexReader reader, int index) { + if (index == staticFieldCount) { + // We reached the end of the static field, restart the numbering for + // instance fields + previousFieldIndex = 0; + } DexBackedField item = new DexBackedField(reader, previousFieldIndex, staticInitialValueIterator, annotationIterator); previousFieldIndex = item.fieldIndex; @@ -145,6 +150,11 @@ public class DexBackedClassDef implements ClassDef { @Override protected void skipItem(@Nonnull DexReader reader, int index) { + if (index == staticFieldCount) { + // We reached the end of the static field, restart the numbering for + // instance fields + previousFieldIndex = 0; + } previousFieldIndex = DexBackedField.skipEncodedField(reader, previousFieldIndex); staticInitialValueIterator.skipNext(); } @@ -165,7 +175,7 @@ public class DexBackedClassDef implements ClassDef { DexReader reader = dexBuf.readerAt(classDataOffset); int staticFieldCount = reader.readSmallUleb128(); int instanceFieldCount = reader.readSmallUleb128(); - int directMethodCount = reader.readSmallUleb128(); + final int directMethodCount = reader.readSmallUleb128(); int virtualMethodCount = reader.readSmallUleb128(); final int methodCount = directMethodCount + virtualMethodCount; if (methodCount > 0) { @@ -183,12 +193,15 @@ public class DexBackedClassDef implements ClassDef { annotationsDirectory.getMethodAnnotationIterator(); @Nonnull private final AnnotationsDirectory.AnnotationIterator parameterAnnotationIterator = annotationsDirectory.getParameterAnnotationIterator(); - @Nonnull private final StaticInitialValueIterator staticInitialValueIterator = - StaticInitialValueIterator.newOrEmpty(dexBuf, staticInitialValuesOffset); @Nonnull @Override protected DexBackedMethod readItem(@Nonnull DexReader reader, int index) { + if (index == directMethodCount) { + // We reached the end of the direct methods, restart the numbering for + // virtual methods + previousMethodIndex = 0; + } DexBackedMethod item = new DexBackedMethod(reader, previousMethodIndex, methodAnnotationIterator, parameterAnnotationIterator); previousMethodIndex = item.methodIndex; @@ -197,8 +210,12 @@ public class DexBackedClassDef implements ClassDef { @Override protected void skipItem(@Nonnull DexReader reader, int index) { + if (index == directMethodCount) { + // We reached the end of the direct methods, restart the numbering for + // virtual methods + previousMethodIndex = 0; + } previousMethodIndex = DexBackedMethod.skipEncodedMethod(reader, previousMethodIndex); - staticInitialValueIterator.skipNext(); } }; }