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.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<Instruction>() {
@Override
public Iterator<Instruction> iterator() {
return new VariableSizeIterator<Instruction>(dexBuf, instructionsStartOffset) {
return new VariableSizeLookaheadIterator<Instruction>(dexBuf, instructionsStartOffset) {
@Override
protected Instruction readItem(@Nonnull DexReader reader, int index) {
protected Instruction readNextItem(@Nonnull DexReader reader) {
if (reader.getOffset() >= endOffset) {
return null;
}

View File

@ -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<DebugItem> {
@Nonnull public abstract List<? extends MethodParameter> getParametersWithNames();
@ -140,24 +139,16 @@ public abstract class DebugInfo implements Iterable<DebugItem> {
}
}
return new Iterator<DebugItem>() {
@Nonnull private DexReader reader = dexBuf.readerAt(parameterIterator.getReaderOffset());
private boolean finished = false;
return new VariableSizeLookaheadIterator<DebugItem>(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<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.Nullable;
import java.util.Iterator;
import java.util.NoSuchElementException;
public abstract class VariableSizeIterator<T> implements Iterator<T> {
private final DexReader reader;
public abstract class VariableSizeLookaheadIterator<T> implements Iterator<T> {
@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<T> implements Iterator<T> {
}
@Override
@Nonnull
public T next() {
if (cachedItem == null) {
throw new NoSuchElementException();
}
T ret = cachedItem;
cachedItem = readItem(reader, index++);
cachedItem = readNextItem(reader);
return ret;
}