Commit 9f51cabf authored by Skylot's avatar Skylot

core: fix anonymous class codegen

parent 1c60e5e3
...@@ -524,10 +524,10 @@ public class InsnGen { ...@@ -524,10 +524,10 @@ public class InsnGen {
if (cls != null && cls.isAnonymous()) { if (cls != null && cls.isAnonymous()) {
// anonymous class construction // anonymous class construction
ClassInfo parent; ClassInfo parent;
if (cls.getSuperClass() != null && !cls.getSuperClass().isObject()) { if (cls.getInterfaces().size() == 1) {
parent = cls.getSuperClass();
} else {
parent = cls.getInterfaces().get(0); parent = cls.getInterfaces().get(0);
} else {
parent = cls.getSuperClass();
} }
MethodNode defCtr = cls.getDefaultConstructor(); MethodNode defCtr = cls.getDefaultConstructor();
if (RegionUtils.notEmpty(defCtr.getRegion())) { if (RegionUtils.notEmpty(defCtr.getRegion())) {
...@@ -535,7 +535,7 @@ public class InsnGen { ...@@ -535,7 +535,7 @@ public class InsnGen {
} else { } else {
defCtr.getAttributes().add(AttributeFlag.DONT_GENERATE); 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); code.incIndent(2);
new ClassGen(cls, mgen.getClassGen().getParentGen(), fallback).makeClassBody(code); new ClassGen(cls, mgen.getClassGen().getParentGen(), fallback).makeClassBody(code);
code.decIndent(2); code.decIndent(2);
......
...@@ -338,15 +338,17 @@ public class ClassNode extends LineAttrNode implements ILoadable { ...@@ -338,15 +338,17 @@ public class ClassNode extends LineAttrNode implements ILoadable {
} }
public boolean isAnonymous() { public boolean isAnonymous() {
MethodNode defConstrExists = getDefaultConstructor(); return clsInfo.isInner()
return defConstrExists != null && getShortName().startsWith(Consts.ANONYMOUS_CLASS_PREFIX); && getShortName().startsWith(Consts.ANONYMOUS_CLASS_PREFIX)
&& getDefaultConstructor() != null;
} }
public MethodNode getDefaultConstructor() { public MethodNode getDefaultConstructor() {
for (MethodNode mth : methods) { for (MethodNode mth : methods) {
if (mth.getAccessFlags().isConstructor() if (mth.getAccessFlags().isConstructor()
&& mth.getMethodInfo().isConstructor() && mth.getMethodInfo().isConstructor()
&& mth.getArguments(false).isEmpty()) { && (mth.getMethodInfo().getArgsCount() == 0
|| (mth.getArguments(false) != null && mth.getArguments(false).isEmpty()))) {
return mth; return mth;
} }
} }
......
...@@ -63,6 +63,19 @@ public class TestInner extends AbstractTest { ...@@ -63,6 +63,19 @@ public class TestInner extends AbstractTest {
}.run(); }.run();
} }
public String func3() {
return new Object() {
{
count += 7;
}
@Override
public String toString() {
count += 8;
return Integer.toString(count);
}
}.toString();
}
@SuppressWarnings("serial") @SuppressWarnings("serial")
public static class MyException extends Exception { public static class MyException extends Exception {
public MyException(String str, Exception e) { public MyException(String str, Exception e) {
...@@ -94,6 +107,8 @@ public class TestInner extends AbstractTest { ...@@ -94,6 +107,8 @@ public class TestInner extends AbstractTest {
thread.join(); thread.join();
thread2.join(); thread2.join();
return TestInner.count == 26; assertEquals(func3(), "41");
return TestInner.count == 41;
} }
} }
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