diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 3d9cefc96b3..226109dda1a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -90,7 +90,7 @@ public class ClosureCodegen extends GenerationStateAware { cv.defineClass(fun, V1_6, - ACC_PUBLIC/*|ACC_SUPER*/, + ACC_PUBLIC|ACC_FINAL/*|ACC_SUPER*/, name.getInternalName(), null, funClass.getInternalName(), diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 07c2a47d736..848e193cfda 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1864,14 +1864,13 @@ public class ExpressionCodegen extends JetVisitor implem ClassReceiver classReceiver = (ClassReceiver) descriptor; ClassDescriptor classReceiverDeclarationDescriptor = classReceiver.getDeclarationDescriptor(); if (DescriptorUtils.isClassObject(classReceiverDeclarationDescriptor)) { - ClassDescriptor containingDeclaration = (ClassDescriptor) classReceiverDeclarationDescriptor.getContainingDeclaration(); - Type classObjType = typeMapper.mapType(containingDeclaration.getDefaultType(), JetTypeMapperMode.IMPL); - if (context.getContextDescriptor() instanceof ConstructorDescriptor && - classReceiverDeclarationDescriptor.getDefaultType() - .equals(((ConstructorDescriptor) context.getContextDescriptor()).getReturnType())) { - v.load(0, classObjType); + if (context.getContextDescriptor() instanceof FunctionDescriptor && + classReceiverDeclarationDescriptor == context.getContextDescriptor().getContainingDeclaration()) { + v.load(0, OBJECT_TYPE); } else { + ClassDescriptor containingDeclaration = (ClassDescriptor) classReceiverDeclarationDescriptor.getContainingDeclaration(); + Type classObjType = typeMapper.mapType(containingDeclaration.getDefaultType(), JetTypeMapperMode.IMPL); v.getstatic(classObjType.getInternalName(), "$classobj", exprType.getDescriptor()); } StackValue.onStack(exprType).put(type, v); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 711d96a0cf0..ce53c70e069 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -107,6 +107,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { isEnum = true; } + if(descriptor.getKind() == ClassKind.OBJECT || descriptor.getKind() == ClassKind.CLASS_OBJECT) { + isFinal = true; + } + if (!jetClass.hasModifier(JetTokens.OPEN_KEYWORD) && !isAbstract) { isFinal = true; }