feat: rewrite try-catch processing

This commit is contained in:
Skylot
2021-08-10 13:07:05 +03:00
parent 12a66bd83e
commit 7c0671c81b
114 changed files with 2901 additions and 1810 deletions
@@ -3,7 +3,7 @@ package jadx.api.plugins.input.data;
public interface ICatch {
String[] getTypes();
int[] getAddresses();
int[] getHandlers();
int getCatchAllAddress();
int getCatchAllHandler();
}
@@ -3,7 +3,7 @@ package jadx.api.plugins.input.data;
public interface ITry {
ICatch getCatch();
int getStartAddress();
int getStartOffset();
int getEndAddress();
int getEndOffset();
}
@@ -1,21 +1,22 @@
package jadx.api.plugins.input.data.impl;
import jadx.api.plugins.input.data.ICatch;
import jadx.api.plugins.utils.Utils;
public class CatchData implements ICatch {
private final int[] addr;
private final int[] handlers;
private final String[] types;
private final int allAddr;
private final int allHandler;
public CatchData(int[] addr, String[] types, int allAddr) {
this.addr = addr;
public CatchData(int[] handlers, String[] types, int allHandler) {
this.handlers = handlers;
this.types = types;
this.allAddr = allAddr;
this.allHandler = allHandler;
}
@Override
public int[] getAddresses() {
return addr;
public int[] getHandlers() {
return handlers;
}
@Override
@@ -24,8 +25,8 @@ public class CatchData implements ICatch {
}
@Override
public int getCatchAllAddress() {
return allAddr;
public int getCatchAllHandler() {
return allHandler;
}
@Override
@@ -33,10 +34,10 @@ public class CatchData implements ICatch {
StringBuilder sb = new StringBuilder("Catch:");
int size = types.length;
for (int i = 0; i < size; i++) {
sb.append(' ').append(types[i]).append("->").append(addr[i]);
sb.append(' ').append(types[i]).append("->").append(Utils.formatOffset(handlers[i]));
}
if (allAddr != -1) {
sb.append(" all->").append(allAddr);
if (allHandler != -1) {
sb.append(" all->").append(Utils.formatOffset(allHandler));
}
return sb.toString();
}
@@ -2,16 +2,17 @@ package jadx.api.plugins.input.data.impl;
import jadx.api.plugins.input.data.ICatch;
import jadx.api.plugins.input.data.ITry;
import jadx.api.plugins.utils.Utils;
public class TryData implements ITry {
private final int startAddr;
private final int endAddr;
private final int startOffset;
private final int endOffset;
private final ICatch catchHandler;
public TryData(int startAddr, int endAddr, ICatch catchHandler) {
this.startAddr = startAddr;
this.endAddr = endAddr;
public TryData(int startOffset, int endOffset, ICatch catchHandler) {
this.startOffset = startOffset;
this.endOffset = endOffset;
this.catchHandler = catchHandler;
}
@@ -21,17 +22,17 @@ public class TryData implements ITry {
}
@Override
public int getStartAddress() {
return startAddr;
public int getStartOffset() {
return startOffset;
}
@Override
public int getEndAddress() {
return endAddr;
public int getEndOffset() {
return endOffset;
}
@Override
public String toString() {
return "Try{" + startAddr + " - " + endAddr + ": " + catchHandler + '}';
return "Try{" + Utils.formatOffset(startOffset) + " - " + Utils.formatOffset(endOffset) + ": " + catchHandler + '}';
}
}
@@ -1,23 +1,26 @@
package jadx.api.plugins.utils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import org.jetbrains.annotations.Nullable;
public class Utils {
public static <T> void addToList(List<T> list, @Nullable T item) {
public static <T> void addToList(Collection<T> list, @Nullable T item) {
if (item != null) {
list.add(item);
}
}
public static <T, I> void addToList(List<T> list, @Nullable I item, Function<I, T> map) {
public static <T, I> void addToList(Collection<T> list, @Nullable I item, Function<I, T> map) {
if (item != null) {
T value = map.apply(item);
if (value != null) {
@@ -44,6 +47,24 @@ public class Utils {
return list;
}
public static <T> List<T> concatDistinct(List<T> a, List<T> b) {
int aSize = a.size();
int bSize = b.size();
if (aSize == 0 && bSize == 0) {
return Collections.emptyList();
}
if (aSize == 0) {
return b;
}
if (bSize == 0) {
return a;
}
Set<T> set = new LinkedHashSet<>(aSize + bSize);
set.addAll(a);
set.addAll(b);
return new ArrayList<>(set);
}
public static <T> String listToStr(List<T> list) {
if (list == null) {
return "null";