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 c52aebc4..274f626b 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java @@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableList; import org.jf.dexlib2.dexbacked.instruction.DexBackedInstruction; import org.jf.dexlib2.dexbacked.util.DebugInfo; import org.jf.dexlib2.dexbacked.util.FixedSizeList; -import org.jf.dexlib2.dexbacked.util.VariableSizeIterator; +import org.jf.dexlib2.dexbacked.util.VariableSizeLookaheadIterator; import org.jf.dexlib2.iface.MethodImplementation; import org.jf.dexlib2.iface.MethodParameter; import org.jf.dexlib2.iface.TryBlock; @@ -79,9 +79,9 @@ public class DexBackedMethodImplementation implements MethodImplementation { return new Iterable() { @Override public Iterator iterator() { - return new VariableSizeIterator(dexBuf, instructionsStartOffset) { + return new VariableSizeLookaheadIterator(dexBuf, instructionsStartOffset) { @Override - protected Instruction readItem(@Nonnull DexReader reader, int index) { + protected Instruction readNextItem(@Nonnull DexReader reader) { if (reader.getOffset() >= endOffset) { return null; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java index 73fd9fb4..c5c8628d 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/DebugInfo.java @@ -50,7 +50,6 @@ import javax.annotation.Nullable; import java.util.Arrays; import java.util.Iterator; import java.util.List; -import java.util.NoSuchElementException; public abstract class DebugInfo implements Iterable { @Nonnull public abstract List getParametersWithNames(); @@ -140,24 +139,16 @@ public abstract class DebugInfo implements Iterable { } } - return new Iterator() { - @Nonnull private DexReader reader = dexBuf.readerAt(parameterIterator.getReaderOffset()); - private boolean finished = false; + return new VariableSizeLookaheadIterator(dexBuf, parameterIterator.getReaderOffset()) { private int codeAddress = 0; private int lineNumber = lineNumberStart; - @Nullable private DebugItem nextItem; - @Nullable - protected DebugItem readItem() { - if (finished) { - return null; - } + protected DebugItem readNextItem(@Nonnull DexReader reader) { while (true) { int next = reader.readUbyte(); switch (next) { case DebugItemType.END_SEQUENCE: { - finished = true; return null; } case DebugItemType.ADVANCE_PC: { @@ -236,38 +227,6 @@ public abstract class DebugInfo implements Iterable { } } } - - @Override - public boolean hasNext() { - if (finished || nextItem != null) { - return false; - } - nextItem = readItem(); - return nextItem != null; - } - - @Nonnull - @Override - public DebugItem next() { - if (finished) { - throw new NoSuchElementException(); - } - if (nextItem == null) { - DebugItem ret = readItem(); - if (ret == null) { - throw new NoSuchElementException(); - } - return ret; - } - DebugItem ret = nextItem; - nextItem = null; - return ret; - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } }; } diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeLookaheadIterator.java similarity index 81% rename from dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java rename to dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeLookaheadIterator.java index 55887ecd..07f48522 100644 --- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeIterator.java +++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/util/VariableSizeLookaheadIterator.java @@ -37,26 +37,24 @@ import org.jf.dexlib2.dexbacked.DexReader; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Iterator; +import java.util.NoSuchElementException; -public abstract class VariableSizeIterator implements Iterator { - private final DexReader reader; +public abstract class VariableSizeLookaheadIterator implements Iterator { + @Nonnull private final DexReader reader; - private int index = 0; private T cachedItem = null; - protected VariableSizeIterator(DexBuffer dexBuf, int offset) { + protected VariableSizeLookaheadIterator(@Nonnull DexBuffer dexBuf, int offset) { this.reader = dexBuf.readerAt(offset); - cachedItem = readItem(reader, index++); + cachedItem = readNextItem(reader); } /** * Reads the next item from reader. If the end of the list has been reached, it should return null. * - * @param reader The {@code DexReader} to read from - * @param index The index of the item that is being read * @return The item that was read, or null if the end of the list has been reached. */ - @Nullable protected abstract T readItem(@Nonnull DexReader reader, int index); + @Nullable protected abstract T readNextItem(@Nonnull DexReader reader); @Override public boolean hasNext() { @@ -64,9 +62,13 @@ public abstract class VariableSizeIterator implements Iterator { } @Override + @Nonnull public T next() { + if (cachedItem == null) { + throw new NoSuchElementException(); + } T ret = cachedItem; - cachedItem = readItem(reader, index++); + cachedItem = readNextItem(reader); return ret; }