mirror of
https://github.com/revanced/smali.git
synced 2025-05-29 12:20:11 +02:00
Rename VariableSizeIterator to VariableSizeLookaheadIterator
This improves the implementation, and is now used for debug info
This commit is contained in:
parent
b26b492fcc
commit
65d969c23b
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user