From fb4d6610a8b3d7c8f080af8a08f873da7a261ccc Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Wed, 12 Sep 2012 09:20:10 +0300 Subject: [PATCH] unification of accessable descriptor lookup between functions and properties --- .../jet/codegen/ExpressionCodegen.java | 49 +++++++++---------- .../jetbrains/jet/codegen/ClassGenTest.java | 1 + 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 317b70089fc..7acda0055ad 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1656,44 +1656,43 @@ public class ExpressionCodegen extends JetVisitor implem private PropertyDescriptor accessablePropertyDescriptor(PropertyDescriptor propertyDescriptor) { PropertySetterDescriptor setter = propertyDescriptor.getSetter(); - if ((propertyDescriptor.getVisibility() == Visibilities.PRIVATE || - (setter != null && setter.getVisibility() == Visibilities.PRIVATE)) - && !DescriptorUtils.isClassObject(propertyDescriptor.getContainingDeclaration()) - && propertyDescriptor.getContainingDeclaration() instanceof ClassDescriptor) { - if (context.getClassOrNamespaceDescriptor() != propertyDescriptor.getContainingDeclaration()) { - DeclarationDescriptor enclosed = propertyDescriptor.getContainingDeclaration(); - if (!context.hasThisDescriptor() || enclosed != context.getThisDescriptor()) { - CodegenContext c = context; - while (c != null && c.getContextDescriptor() != enclosed) { - c = c.getParentContext(); - } - if (c != null) { - propertyDescriptor = (PropertyDescriptor) c.getAccessor(propertyDescriptor); - } - } - } + PropertyGetterDescriptor getter = propertyDescriptor.getGetter(); + + final int flag = CodegenUtil.getVisibilityAccessFlag(propertyDescriptor) | + (getter == null ? 0 : CodegenUtil.getVisibilityAccessFlag(getter)) | + (setter == null ? 0 : CodegenUtil.getVisibilityAccessFlag(setter)); + + if ((flag & ACC_PRIVATE) == 0) { + return propertyDescriptor; } - return propertyDescriptor; + + return (PropertyDescriptor) accessibleDescriptor(context, propertyDescriptor); } private FunctionDescriptor accessableFunctionDescriptor(FunctionDescriptor fd) { - if (fd.getVisibility() != Visibilities.PRIVATE || fd.getContainingDeclaration() instanceof NamespaceDescriptor) { + final int flag = CodegenUtil.getVisibilityAccessFlag(fd); + if ((flag & ACC_PRIVATE) == 0) { return fd; } - if (context.getClassOrNamespaceDescriptor() != fd.getContainingDeclaration()) { - DeclarationDescriptor enclosed = fd.getContainingDeclaration(); - if (enclosed != context.getThisDescriptor()) { + return (FunctionDescriptor) accessibleDescriptor(context, fd); + } + + private static MemberDescriptor accessibleDescriptor(CodegenContext context, DeclarationDescriptor descriptor) { + if (context.getClassOrNamespaceDescriptor() != descriptor.getContainingDeclaration()) { + DeclarationDescriptor enclosed = descriptor.getContainingDeclaration(); + if (context.hasThisDescriptor() && enclosed != context.getThisDescriptor()) { CodegenContext c = context; while (c.getContextDescriptor() != enclosed) { c = c.getParentContext(); - assert c != null; + if (c == null) { + return (MemberDescriptor) descriptor; + } } - fd = (FunctionDescriptor) c.getAccessor(fd); + return (MemberDescriptor) c.getAccessor(descriptor); } } - - return fd; + return (MemberDescriptor) descriptor; } private StackValue invokeFunction( diff --git a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java index e830455e209..65c177a1757 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java @@ -381,6 +381,7 @@ public class ClassGenTest extends CodegenTestCase { public void testKt1018() throws Exception { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("regressions/kt1018.kt"); + System.out.println(generateToText()); } public void testKt1120() throws Exception {