Rename VariableSizeIterator to VariableSizeLookaheadIterator

This improves the implementation, and is now used for debug info
This commit is contained in:
Ben Gruver 2012-11-11 12:37:34 -08:00
parent b26b492fcc
commit 65d969c23b
3 changed files with 16 additions and 55 deletions

View File

@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableList;
import org.jf.dexlib2.dexbacked.instruction.DexBackedInstruction; import org.jf.dexlib2.dexbacked.instruction.DexBackedInstruction;
import org.jf.dexlib2.dexbacked.util.DebugInfo; import org.jf.dexlib2.dexbacked.util.DebugInfo;
import org.jf.dexlib2.dexbacked.util.FixedSizeList; 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.MethodImplementation;
import org.jf.dexlib2.iface.MethodParameter; import org.jf.dexlib2.iface.MethodParameter;
import org.jf.dexlib2.iface.TryBlock; import org.jf.dexlib2.iface.TryBlock;
@ -79,9 +79,9 @@ public class DexBackedMethodImplementation implements MethodImplementation {
return new Iterable<Instruction>() { return new Iterable<Instruction>() {
@Override @Override
public Iterator<Instruction> iterator() { public Iterator<Instruction> iterator() {
return new VariableSizeIterator<Instruction>(dexBuf, instructionsStartOffset) { return new VariableSizeLookaheadIterator<Instruction>(dexBuf, instructionsStartOffset) {
@Override @Override
protected Instruction readItem(@Nonnull DexReader reader, int index) { protected Instruction readNextItem(@Nonnull DexReader reader) {
if (reader.getOffset() >= endOffset) { if (reader.getOffset() >= endOffset) {
return null; return null;
} }

View File

@ -50,7 +50,6 @@ import javax.annotation.Nullable;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException;
public abstract class DebugInfo implements Iterable<DebugItem> { public abstract class DebugInfo implements Iterable<DebugItem> {
@Nonnull public abstract List<? extends MethodParameter> getParametersWithNames(); @Nonnull public abstract List<? extends MethodParameter> getParametersWithNames();
@ -140,24 +139,16 @@ public abstract class DebugInfo implements Iterable<DebugItem> {
} }
} }
return new Iterator<DebugItem>() { return new VariableSizeLookaheadIterator<DebugItem>(dexBuf, parameterIterator.getReaderOffset()) {
@Nonnull private DexReader reader = dexBuf.readerAt(parameterIterator.getReaderOffset());
private boolean finished = false;
private int codeAddress = 0; private int codeAddress = 0;
private int lineNumber = lineNumberStart; private int lineNumber = lineNumberStart;
@Nullable private DebugItem nextItem;
@Nullable @Nullable
protected DebugItem readItem() { protected DebugItem readNextItem(@Nonnull DexReader reader) {
if (finished) {
return null;
}
while (true) { while (true) {
int next = reader.readUbyte(); int next = reader.readUbyte();
switch (next) { switch (next) {
case DebugItemType.END_SEQUENCE: { case DebugItemType.END_SEQUENCE: {
finished = true;
return null; return null;
} }
case DebugItemType.ADVANCE_PC: { case DebugItemType.ADVANCE_PC: {
@ -236,38 +227,6 @@ public abstract class DebugInfo implements Iterable<DebugItem> {
} }
} }
} }
@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();
}
}; };
} }

View File

@ -37,26 +37,24 @@ import org.jf.dexlib2.dexbacked.DexReader;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Iterator; import java.util.Iterator;
import java.util.NoSuchElementException;
public abstract class VariableSizeIterator<T> implements Iterator<T> { public abstract class VariableSizeLookaheadIterator<T> implements Iterator<T> {
private final DexReader reader; @Nonnull private final DexReader reader;
private int index = 0;
private T cachedItem = null; private T cachedItem = null;
protected VariableSizeIterator(DexBuffer dexBuf, int offset) { protected VariableSizeLookaheadIterator(@Nonnull DexBuffer dexBuf, int offset) {
this.reader = dexBuf.readerAt(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. * 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. * @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 @Override
public boolean hasNext() { public boolean hasNext() {
@ -64,9 +62,13 @@ public abstract class VariableSizeIterator<T> implements Iterator<T> {
} }
@Override @Override
@Nonnull
public T next() { public T next() {
if (cachedItem == null) {
throw new NoSuchElementException();
}
T ret = cachedItem; T ret = cachedItem;
cachedItem = readItem(reader, index++); cachedItem = readNextItem(reader);
return ret; return ret;
} }