From c9215ed8a5b1d68f496306e9178a24569ec52667 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Mon, 12 Aug 2013 14:33:56 +0400 Subject: [PATCH] KT-2784 VerifyError when passing a value to a class object's super type constructor #KT-2784 Fixed --- .../src/org/jetbrains/jet/codegen/CodegenUtil.java | 4 +--- .../jet/codegen/ImplementationBodyCodegen.java | 3 ++- .../jetbrains/jet/codegen/binding/CodegenBinding.java | 9 ++------- .../jetbrains/jet/lang/psi/JetObjectDeclaration.java | 2 +- compiler/testData/codegen/box/classes/kt2784.kt | 10 ++++++++++ .../generated/BlackBoxCodegenTestGenerated.java | 5 +++++ 6 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 compiler/testData/codegen/box/classes/kt2784.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 04f547a7cda..ab2b68f8637 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -90,11 +90,9 @@ public class CodegenUtil { } public static boolean isNonLiteralObject(JetClassOrObject myClass) { - return myClass instanceof JetObjectDeclaration && !((JetObjectDeclaration) myClass).isObjectLiteral() && - !(myClass.getParent() instanceof JetClassObject); + return myClass instanceof JetObjectDeclaration && !((JetObjectDeclaration) myClass).isObjectLiteral(); } - public static String createTmpVariableName(Collection existingNames) { String prefix = "tmp"; int i = RANDOM.nextInt(Integer.MAX_VALUE); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 7093c1dc3fb..637425c0180 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -936,8 +936,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { private void generateFieldForSingleton() { boolean hasClassObject = descriptor.getClassObjectDescriptor() != null; boolean isEnumClass = DescriptorUtils.isEnumClass(descriptor); + boolean isObjectDeclaration = descriptor.getKind() == ClassKind.OBJECT && isNonLiteralObject(myClass) ; - if (!(isNonLiteralObject(myClass) || hasClassObject) || isEnumClass) return; + if (!isObjectDeclaration && !hasClassObject || isEnumClass) return; ClassDescriptor fieldTypeDescriptor = hasClassObject ? descriptor.getClassObjectDescriptor() : descriptor; assert fieldTypeDescriptor != null; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java index c80c84b8346..742d595b430 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java @@ -187,16 +187,11 @@ public class CodegenBinding { } public static boolean isSingleton(BindingContext bindingContext, @NotNull ClassDescriptor classDescriptor) { - ClassKind kind = classDescriptor.getKind(); - if (kind == ClassKind.CLASS_OBJECT) { + if (isObjectDeclaration(bindingContext, classDescriptor)) { return true; } - if (kind == ClassKind.OBJECT && isObjectDeclaration(bindingContext, classDescriptor)) { - return true; - } - - if (kind == ClassKind.ENUM_ENTRY) { + if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) { return true; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java index c2add7f1c4f..fe56b0b2699 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java @@ -173,7 +173,7 @@ public class JetObjectDeclaration extends JetNamedDeclarationStub