Commit 1d81cab4 authored by Skylot's avatar Skylot

core: change anonymous class marking

parent 2815cef1
...@@ -18,7 +18,7 @@ public class Consts { ...@@ -18,7 +18,7 @@ public class Consts {
public static final String DALVIK_ANNOTATION_DEFAULT = "dalvik.annotation.AnnotationDefault"; public static final String DALVIK_ANNOTATION_DEFAULT = "dalvik.annotation.AnnotationDefault";
public static final String DEFAULT_PACKAGE_NAME = "defpackage"; public static final String DEFAULT_PACKAGE_NAME = "defpackage";
public static final String ANONYMOUS_CLASS_PREFIX = "AnonymousClass_"; public static final String ANONYMOUS_CLASS_PREFIX = "AnonymousClass";
public static final String MTH_TOSTRING_SIGNATURE = "toString()Ljava/lang/String;"; public static final String MTH_TOSTRING_SIGNATURE = "toString()Ljava/lang/String;";
} }
...@@ -231,7 +231,7 @@ public class ClassGen { ...@@ -231,7 +231,7 @@ public class ClassGen {
private void addInnerClasses(CodeWriter code, ClassNode cls) throws CodegenException { private void addInnerClasses(CodeWriter code, ClassNode cls) throws CodegenException {
for (ClassNode innerCls : cls.getInnerClasses()) { for (ClassNode innerCls : cls.getInnerClasses()) {
if (innerCls.contains(AFlag.DONT_GENERATE) if (innerCls.contains(AFlag.DONT_GENERATE)
|| innerCls.isAnonymous()) { || innerCls.contains(AFlag.ANONYMOUS_CLASS)) {
continue; continue;
} }
ClassGen inClGen = new ClassGen(innerCls, getParentGen()); ClassGen inClGen = new ClassGen(innerCls, getParentGen());
...@@ -243,7 +243,7 @@ public class ClassGen { ...@@ -243,7 +243,7 @@ public class ClassGen {
private boolean isInnerClassesPresents() { private boolean isInnerClassesPresents() {
for (ClassNode innerCls : cls.getInnerClasses()) { for (ClassNode innerCls : cls.getInnerClasses()) {
if (!innerCls.isAnonymous()) { if (!innerCls.contains(AFlag.ANONYMOUS_CLASS)) {
return true; return true;
} }
} }
......
...@@ -530,7 +530,7 @@ public class InsnGen { ...@@ -530,7 +530,7 @@ public class InsnGen {
private void makeConstructor(ConstructorInsn insn, CodeWriter code) private void makeConstructor(ConstructorInsn insn, CodeWriter code)
throws CodegenException { throws CodegenException {
ClassNode cls = mth.dex().resolveClass(insn.getClassType()); ClassNode cls = mth.dex().resolveClass(insn.getClassType());
if (cls != null && cls.isAnonymous() && !fallback) { if (cls != null && cls.contains(AFlag.ANONYMOUS_CLASS) && !fallback) {
// anonymous class construction // anonymous class construction
ArgType parent; ArgType parent;
if (cls.getInterfaces().size() == 1) { if (cls.getInterfaces().size() == 1) {
......
...@@ -23,6 +23,7 @@ public enum AFlag { ...@@ -23,6 +23,7 @@ public enum AFlag {
SKIP_FIRST_ARG, SKIP_FIRST_ARG,
ANONYMOUS_CONSTRUCTOR, ANONYMOUS_CONSTRUCTOR,
ANONYMOUS_CLASS,
ELSE_IF_CHAIN, ELSE_IF_CHAIN,
......
...@@ -138,6 +138,14 @@ public final class ClassInfo { ...@@ -138,6 +138,14 @@ public final class ClassInfo {
return parentClass; return parentClass;
} }
public ClassInfo getTopParentClass() {
if (parentClass != null) {
ClassInfo topCls = parentClass.getTopParentClass();
return topCls != null ? topCls : parentClass;
}
return null;
}
public boolean isInner() { public boolean isInner() {
return parentClass != null; return parentClass != null;
} }
......
...@@ -240,6 +240,10 @@ public class ClassNode extends LineAttrNode implements ILoadable { ...@@ -240,6 +240,10 @@ public class ClassNode extends LineAttrNode implements ILoadable {
&& fileName.endsWith("$" + name)) { && fileName.endsWith("$" + name)) {
return; return;
} }
ClassInfo parentClass = clsInfo.getTopParentClass();
if (parentClass != null && fileName.equals(parentClass.getShortName())) {
return;
}
} }
this.addAttr(new SourceFileAttr(fileName)); this.addAttr(new SourceFileAttr(fileName));
LOG.debug("Class '{}' compiled from '{}'", this, fileName); LOG.debug("Class '{}' compiled from '{}'", this, fileName);
...@@ -434,7 +438,7 @@ public class ClassNode extends LineAttrNode implements ILoadable { ...@@ -434,7 +438,7 @@ public class ClassNode extends LineAttrNode implements ILoadable {
public boolean isAnonymous() { public boolean isAnonymous() {
return clsInfo.isInner() return clsInfo.isInner()
&& clsInfo.getShortName().startsWith(Consts.ANONYMOUS_CLASS_PREFIX) && clsInfo.getAlias().getShortName().startsWith(Consts.ANONYMOUS_CLASS_PREFIX)
&& getDefaultConstructor() != null; && getDefaultConstructor() != null;
} }
......
...@@ -40,9 +40,17 @@ public class ClassModifier extends AbstractVisitor { ...@@ -40,9 +40,17 @@ public class ClassModifier extends AbstractVisitor {
removeEmptyMethods(cls); removeEmptyMethods(cls);
checkFieldsInit(cls); checkFieldsInit(cls);
markAnonymousClass(cls);
return false; return false;
} }
private void markAnonymousClass(ClassNode cls) {
if (cls.isAnonymous()) {
cls.add(AFlag.ANONYMOUS_CLASS);
}
}
private static void removeSyntheticFields(ClassNode cls) { private static void removeSyntheticFields(ClassNode cls) {
if (!cls.getClassInfo().isInner() || cls.getAccessFlags().isStatic()) { if (!cls.getClassInfo().isInner() || cls.getAccessFlags().isStatic()) {
return; return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment