fix: don't visit inner classes twice in pre-processing

This commit is contained in:
Skylot
2021-09-08 19:07:25 +01:00
parent 8e89a2ef1b
commit 9c8642593c
2 changed files with 20 additions and 11 deletions
@@ -450,15 +450,18 @@ public class ClassNode extends NotificationAttrNode implements ILoadable, ICodeN
}
public ClassNode getParentClass() {
if (parentClass == null) {
if (clsInfo.isInner()) {
ClassNode parent = root.resolveClass(clsInfo.getParentClass());
parentClass = parent == null ? this : parent;
} else {
parentClass = this;
return parentClass;
}
public void updateParentClass() {
if (clsInfo.isInner()) {
ClassNode parent = root.resolveClass(clsInfo.getParentClass());
if (parent != null) {
parentClass = parent;
return;
}
}
return parentClass;
parentClass = this;
}
public ClassNode getTopParentClass() {
@@ -548,7 +551,7 @@ public class ClassNode extends NotificationAttrNode implements ILoadable, ICodeN
}
public boolean isInner() {
return parentClass != null;
return parentClass != this;
}
@Nullable
@@ -100,14 +100,16 @@ public class RootNode {
markDuplicatedClasses(classes);
}
classes = new ArrayList<>(clsMap.values());
// sort classes by name, expect top classes before inner
classes.sort(Comparator.comparing(ClassNode::getFullName));
initInnerClasses();
// print stats for loaded classes
int mthCount = classes.stream().mapToInt(c -> c.getMethods().size()).sum();
int insnsCount = classes.stream().flatMap(c -> c.getMethods().stream()).mapToInt(MethodNode::getInsnsCount).sum();
LOG.info("Loaded classes: {}, methods: {}, instructions: {}", classes.size(), mthCount, insnsCount);
// sort classes by name, expect top classes before inner
classes.sort(Comparator.comparing(ClassNode::getFullName));
// move inner classes
initInnerClasses();
}
private void addDummyClass(IClassData classData, Exception exc) {
@@ -254,6 +256,7 @@ public class RootNode {
innerCls.getClassInfo().updateNames(this);
}
}
classes.forEach(ClassNode::updateParentClass);
}
public void runPreDecompileStage() {
@@ -266,6 +269,9 @@ public class RootNode {
LOG.error("Visitor init failed: {}", pass.getClass().getSimpleName(), e);
}
for (ClassNode cls : classes) {
if (cls.isInner()) {
continue;
}
DepthTraversal.visit(pass, cls);
}
if (debugEnabled) {