fix: resolve duplicated error attr in fallback codegen, allow to set whole attr list at once (#2842)
This commit is contained in:
@@ -397,13 +397,12 @@ public class MethodGen {
|
||||
for (IDexTreeVisitor visitor : Jadx.getFallbackPassesList()) {
|
||||
DepthTraversal.visit(visitor, mth);
|
||||
}
|
||||
errors.forEach(err -> mth.addAttr(AType.JADX_ERROR, err));
|
||||
} catch (Exception e) {
|
||||
LOG.error("Error reload instructions in fallback mode:", e);
|
||||
code.startLine("// Can't load method instructions: " + e.getMessage());
|
||||
return;
|
||||
} finally {
|
||||
errors.forEach(err -> mth.addAttr(AType.JADX_ERROR, err));
|
||||
mth.addAttr(AType.JADX_ERROR, errors);
|
||||
}
|
||||
}
|
||||
InsnNode[] insnArr = mth.getInstructions();
|
||||
|
||||
@@ -12,10 +12,16 @@ public class AttrList<T> implements IJadxAttribute {
|
||||
private static final int MAX_ATTRLIST_LENGTH = 300;
|
||||
|
||||
private final IJadxAttrType<AttrList<T>> type;
|
||||
private final List<T> list = new ArrayList<>();
|
||||
private final List<T> list;
|
||||
|
||||
public AttrList(IJadxAttrType<AttrList<T>> type, List<T> attrList) {
|
||||
this.type = type;
|
||||
this.list = attrList;
|
||||
}
|
||||
|
||||
public AttrList(IJadxAttrType<AttrList<T>> type) {
|
||||
this.type = type;
|
||||
this.list = new ArrayList<>();
|
||||
}
|
||||
|
||||
public List<T> getList() {
|
||||
|
||||
@@ -50,8 +50,7 @@ public abstract class AttrNode implements IAttributeNode {
|
||||
}
|
||||
|
||||
public <T> void addAttr(IJadxAttrType<AttrList<T>> type, List<T> list) {
|
||||
AttributeStorage strg = initStorage();
|
||||
list.forEach(attr -> strg.add(type, attr));
|
||||
initStorage().addAttrList(type, list);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -14,6 +14,7 @@ import jadx.api.plugins.input.data.attributes.IJadxAttrType;
|
||||
import jadx.api.plugins.input.data.attributes.IJadxAttribute;
|
||||
import jadx.api.plugins.input.data.attributes.JadxAttrType;
|
||||
import jadx.api.plugins.input.data.attributes.types.AnnotationsAttr;
|
||||
import jadx.core.utils.ListUtils;
|
||||
import jadx.core.utils.Utils;
|
||||
import jadx.core.utils.exceptions.JadxRuntimeException;
|
||||
|
||||
@@ -62,11 +63,20 @@ public class AttributeStorage {
|
||||
|
||||
public <T> void add(IJadxAttrType<AttrList<T>> type, T obj) {
|
||||
AttrList<T> list = get(type);
|
||||
if (list == null) {
|
||||
list = new AttrList<>(type);
|
||||
add(list);
|
||||
if (list != null) {
|
||||
list.getList().add(obj);
|
||||
} else {
|
||||
add(new AttrList<>(type, ListUtils.mutableListOf(obj)));
|
||||
}
|
||||
}
|
||||
|
||||
public <T> void addAttrList(IJadxAttrType<AttrList<T>> type, List<T> attrList) {
|
||||
AttrList<T> list = get(type);
|
||||
if (list != null) {
|
||||
list.getList().addAll(attrList);
|
||||
} else {
|
||||
add(new AttrList<>(type, attrList));
|
||||
}
|
||||
list.getList().add(obj);
|
||||
}
|
||||
|
||||
public void addAll(AttributeStorage otherList) {
|
||||
|
||||
@@ -19,6 +19,25 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class ListUtils {
|
||||
|
||||
public static <T> List<T> mutableListOf(T obj) {
|
||||
List<T> list = new ArrayList<>();
|
||||
list.add(obj);
|
||||
return list;
|
||||
}
|
||||
|
||||
public static <T> List<T> mutableListOf(T obj1, T obj2) {
|
||||
List<T> list = new ArrayList<>();
|
||||
list.add(obj1);
|
||||
list.add(obj2);
|
||||
return list;
|
||||
}
|
||||
|
||||
public static <T> List<T> mutableListOf(T... objs) {
|
||||
List<T> list = new ArrayList<>();
|
||||
Collections.addAll(list, objs);
|
||||
return list;
|
||||
}
|
||||
|
||||
public static <T> boolean isSingleElement(@Nullable List<T> list, T obj) {
|
||||
if (list == null || list.size() != 1) {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user