feat: add partial region visitor with result return
This commit is contained in:
@@ -31,6 +31,14 @@ public class DepthRegionTraversal {
|
||||
traverseInternal(mth, visitor, container);
|
||||
}
|
||||
|
||||
public static <R> @Nullable R traversePartial(MethodNode mth, IRegionPartialVisitor<R> visitor) {
|
||||
return traversePartialInternal(mth, visitor, mth.getRegion());
|
||||
}
|
||||
|
||||
public static <R> @Nullable R traversePartial(MethodNode mth, IContainer container, IRegionPartialVisitor<R> visitor) {
|
||||
return traversePartialInternal(mth, visitor, container);
|
||||
}
|
||||
|
||||
public static void traverseIterative(MethodNode mth, IRegionIterativeVisitor visitor) {
|
||||
boolean repeat;
|
||||
int k = 0;
|
||||
@@ -95,6 +103,24 @@ public class DepthRegionTraversal {
|
||||
}
|
||||
}
|
||||
|
||||
private static <R> @Nullable R traversePartialInternal(MethodNode mth, IRegionPartialVisitor<R> visitor, IContainer startContainer) {
|
||||
List<IContainer> stack = new ArrayList<>();
|
||||
stack.add(startContainer);
|
||||
while (true) {
|
||||
IContainer current = ListUtils.removeLast(stack);
|
||||
if (current == null) {
|
||||
return null;
|
||||
}
|
||||
R result = visitor.visit(mth, current);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
if (current instanceof IRegion) {
|
||||
addSubBlocksToStack(stack, (IRegion) current);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void addSubBlocksToStack(List<IContainer> stack, IRegion region) {
|
||||
List<IContainer> subBlocks = region.getSubBlocks();
|
||||
// add in reverse order to keep original order during visit
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package jadx.core.dex.visitors.regions;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import jadx.core.dex.nodes.IContainer;
|
||||
import jadx.core.dex.nodes.MethodNode;
|
||||
|
||||
public interface IRegionPartialVisitor<R> {
|
||||
/**
|
||||
* Visit all containers in region until stopped
|
||||
*
|
||||
* @return non-null value to stop visiting
|
||||
*/
|
||||
@Nullable
|
||||
R visit(MethodNode mth, IContainer container);
|
||||
}
|
||||
Reference in New Issue
Block a user