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.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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user