From 380ca70a2ccb583d391e4b965dcb29eb2c6f386b Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Sat, 20 Oct 2012 23:36:23 -0700 Subject: [PATCH] Implement skipping for all variable sized lists --- .../dexlib2/dexbacked/DexBackedAnnotation.java | 5 +++++ .../dexbacked/DexBackedAnnotationElement.java | 5 +++++ .../DexBackedCatchAllExceptionHandler.java | 4 ++++ .../dexbacked/DexBackedExceptionHandler.java | 5 +++++ .../jf/dexlib2/dexbacked/DexBackedTryBlock.java | 17 +++++++++++++++++ .../value/DexBackedAnnotationEncodedValue.java | 5 +++++ .../value/DexBackedArrayEncodedValue.java | 5 +++++ 7 files changed, 46 insertions(+) diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java index 4c7b5d3a..7b9f5758 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotation.java @@ -71,6 +71,11 @@ public class DexBackedAnnotation implements Annotation { return new DexBackedAnnotationElement(reader); } + @Override + protected void skipItem(DexReader reader, int index) { + DexBackedAnnotationElement.skipFrom(reader); + } + @Override public int size() { return size;} }; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java index 3b41aeab..48ea8a59 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedAnnotationElement.java @@ -46,6 +46,11 @@ public class DexBackedAnnotationElement implements AnnotationElement { this.value = DexBackedEncodedValue.readFrom(reader); } + public static void skipFrom(DexReader reader) { + reader.skipUleb128(); + DexBackedEncodedValue.skipFrom(reader); + } + @Nonnull @Override public String getName() { return name; } @Nonnull @Override public EncodedValue getValue() { return value; } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java index 42b5945b..37ae20a1 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedCatchAllExceptionHandler.java @@ -42,4 +42,8 @@ public class DexBackedCatchAllExceptionHandler extends ImmutableExceptionHandler super(null, instructionOffsetMap.getInstructionIndexAtOffsetExact(reader.readSmallUleb128())); } + + public static void skipFrom(DexReader reader) { + reader.skipUleb128(); + } } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java index b819c23e..3b6601f9 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedExceptionHandler.java @@ -43,4 +43,9 @@ public class DexBackedExceptionHandler extends ImmutableExceptionHandler { super(reader.getType(reader.readSmallUleb128()), instructionOffsetMap.getInstructionIndexAtOffsetExact(reader.readSmallUleb128())); } + + public static void skipFrom(DexReader reader) { + reader.skipUleb128(); + reader.skipUleb128(); + } } 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 3e135d6b..85528bb3 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedTryBlock.java @@ -92,6 +92,12 @@ public class DexBackedTryBlock implements TryBlock { protected ExceptionHandler readItem(DexReader reader, int index) { return new DexBackedExceptionHandler(reader, instructionOffsetMap); } + + @Override + protected void skipItem(DexReader dexReader, int index) { + DexBackedExceptionHandler.skipFrom(dexReader); + } + @Override public int size() { return encodedSize; } }; } else { @@ -107,6 +113,17 @@ public class DexBackedTryBlock implements TryBlock { return new DexBackedExceptionHandler(dexReader, instructionOffsetMap); } } + + @Override + protected void skipItem(DexReader dexReader, int index) { + if (index == sizeWithCatchAll-1) { + DexBackedCatchAllExceptionHandler.skipFrom(dexReader); + } else { + DexBackedExceptionHandler.skipFrom(dexReader); + } + + } + @Override public int size() { return sizeWithCatchAll; } }; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java index 503ff13e..48dcc460 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedAnnotationEncodedValue.java @@ -83,6 +83,11 @@ public class DexBackedAnnotationEncodedValue implements AnnotationEncodedValue { return new DexBackedAnnotationElement(dexReader); } + @Override + protected void skipItem(DexReader reader, int index) { + DexBackedAnnotationElement.skipFrom(reader); + } + @Override public int size() { return size;} }; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java index 218374ed..a7094223 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/value/DexBackedArrayEncodedValue.java @@ -73,6 +73,11 @@ public class DexBackedArrayEncodedValue implements ArrayEncodedValue { return DexBackedEncodedValue.readFrom(dexReader); } + @Override + protected void skipItem(DexReader reader, int index) { + DexBackedEncodedValue.skipFrom(reader); + } + @Override public int size() { return size;} }; }