未验证 提交 9c864259 编写于 作者: S Skylot

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

上级 8e89a2ef
......@@ -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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册