From 9f51cabf6922c0dea973d3cdfac22f7774bcc055 Mon Sep 17 00:00:00 2001 From: Skylot Date: Fri, 20 Dec 2013 23:22:27 +0400 Subject: [PATCH] core: fix anonymous class codegen --- .../main/java/jadx/core/codegen/InsnGen.java | 8 ++++---- .../java/jadx/core/dex/nodes/ClassNode.java | 8 +++++--- .../src/main/java/jadx/samples/TestInner.java | 17 ++++++++++++++++- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java index e72f24d9c..263b5fa9b 100644 --- a/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java +++ b/jadx-core/src/main/java/jadx/core/codegen/InsnGen.java @@ -524,10 +524,10 @@ public class InsnGen { if (cls != null && cls.isAnonymous()) { // anonymous class construction ClassInfo parent; - if (cls.getSuperClass() != null && !cls.getSuperClass().isObject()) { - parent = cls.getSuperClass(); - } else { + if (cls.getInterfaces().size() == 1) { parent = cls.getInterfaces().get(0); + } else { + parent = cls.getSuperClass(); } MethodNode defCtr = cls.getDefaultConstructor(); if (RegionUtils.notEmpty(defCtr.getRegion())) { @@ -535,7 +535,7 @@ public class InsnGen { } else { defCtr.getAttributes().add(AttributeFlag.DONT_GENERATE); } - code.add("new ").add(useClass(parent)).add("() "); + code.add("new ").add(parent == null ? "Object" : useClass(parent)).add("() "); code.incIndent(2); new ClassGen(cls, mgen.getClassGen().getParentGen(), fallback).makeClassBody(code); code.decIndent(2); diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java index c6b1e3250..0359f709e 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/ClassNode.java @@ -338,15 +338,17 @@ public class ClassNode extends LineAttrNode implements ILoadable { } public boolean isAnonymous() { - MethodNode defConstrExists = getDefaultConstructor(); - return defConstrExists != null && getShortName().startsWith(Consts.ANONYMOUS_CLASS_PREFIX); + return clsInfo.isInner() + && getShortName().startsWith(Consts.ANONYMOUS_CLASS_PREFIX) + && getDefaultConstructor() != null; } public MethodNode getDefaultConstructor() { for (MethodNode mth : methods) { if (mth.getAccessFlags().isConstructor() && mth.getMethodInfo().isConstructor() - && mth.getArguments(false).isEmpty()) { + && (mth.getMethodInfo().getArgsCount() == 0 + || (mth.getArguments(false) != null && mth.getArguments(false).isEmpty()))) { return mth; } } diff --git a/jadx-samples/src/main/java/jadx/samples/TestInner.java b/jadx-samples/src/main/java/jadx/samples/TestInner.java index fc7ba6131..d1343358e 100644 --- a/jadx-samples/src/main/java/jadx/samples/TestInner.java +++ b/jadx-samples/src/main/java/jadx/samples/TestInner.java @@ -63,6 +63,19 @@ public class TestInner extends AbstractTest { }.run(); } + public String func3() { + return new Object() { + { + count += 7; + } + @Override + public String toString() { + count += 8; + return Integer.toString(count); + } + }.toString(); + } + @SuppressWarnings("serial") public static class MyException extends Exception { public MyException(String str, Exception e) { @@ -94,6 +107,8 @@ public class TestInner extends AbstractTest { thread.join(); thread2.join(); - return TestInner.count == 26; + assertEquals(func3(), "41"); + + return TestInner.count == 41; } }