Fixed visibility generated by backend for internal members. Now they are public in JVM, but have special flag in annotation.

This commit is contained in:
Evgeny Gerashchenko
2012-06-14 20:00:10 +04:00
parent 221e412ba7
commit 9f45e7cc08
6 changed files with 37 additions and 9 deletions
@@ -132,7 +132,8 @@ public class FunctionCodegen {
if (functionDescriptor instanceof PropertyAccessorDescriptor) { if (functionDescriptor instanceof PropertyAccessorDescriptor) {
PropertyCodegen.generateJetPropertyAnnotation(mv, propertyTypeSignature, jvmSignature.getKotlinTypeParameter(), PropertyCodegen.generateJetPropertyAnnotation(mv, propertyTypeSignature, jvmSignature.getKotlinTypeParameter(),
((PropertyAccessorDescriptor) functionDescriptor) ((PropertyAccessorDescriptor) functionDescriptor)
.getCorrespondingProperty()); .getCorrespondingProperty(),
functionDescriptor.getVisibility());
} }
else if (functionDescriptor instanceof SimpleFunctionDescriptor) { else if (functionDescriptor instanceof SimpleFunctionDescriptor) {
if (propertyTypeSignature != null) { if (propertyTypeSignature != null) {
@@ -145,6 +146,12 @@ public class FunctionCodegen {
? JvmStdlibNames.JET_METHOD_FLAG_FORCE_FINAL_BIT ? JvmStdlibNames.JET_METHOD_FLAG_FORCE_FINAL_BIT
: JvmStdlibNames.JET_METHOD_FLAG_FORCE_OPEN_BIT); : JvmStdlibNames.JET_METHOD_FLAG_FORCE_OPEN_BIT);
} }
if (functionDescriptor.getVisibility() == Visibilities.INTERNAL) {
kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_INTERNAL_BIT);
}
else if (functionDescriptor.getVisibility() == Visibilities.PRIVATE) {
kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_PRIVATE_BIT);
}
aw.writeFlags(kotlinFlags); aw.writeFlags(kotlinFlags);
aw.writeNullableReturnType(functionDescriptor.getReturnType().isNullable()); aw.writeNullableReturnType(functionDescriptor.getReturnType().isNullable());
aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter());
@@ -338,7 +338,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null); MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null);
PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature.getPropertyTypeKotlinSignature(), PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature.getPropertyTypeKotlinSignature(),
originalSignature.getJvmMethodSignature().getKotlinTypeParameter(), originalSignature.getJvmMethodSignature().getKotlinTypeParameter(),
original); original, ((PropertyDescriptor) entry.getValue()).getGetter().getVisibility());
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
} }
@@ -366,7 +366,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null); MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null);
PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature2.getPropertyTypeKotlinSignature(), PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature2.getPropertyTypeKotlinSignature(),
originalSignature2.getJvmMethodSignature().getKotlinTypeParameter(), originalSignature2.getJvmMethodSignature().getKotlinTypeParameter(),
original); original, ((PropertyDescriptor) entry.getValue()).getSetter().getVisibility());
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv); StubCodegen.generateStubCode(mv);
} }
@@ -777,6 +777,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
JvmMethodSignature jvmSignature = typeMapper.mapToCallableMethod(inheritedFun, false, OwnerKind.IMPLEMENTATION).getSignature(); JvmMethodSignature jvmSignature = typeMapper.mapToCallableMethod(inheritedFun, false, OwnerKind.IMPLEMENTATION).getSignature();
JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv);
BitSet kotlinFlags = new BitSet(); BitSet kotlinFlags = new BitSet();
if (fun.getVisibility() == Visibilities.INTERNAL) {
kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_INTERNAL_BIT);
}
else if (fun.getVisibility() == Visibilities.PRIVATE) {
kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_PRIVATE_BIT);
}
if (fun instanceof PropertyAccessorDescriptor) { if (fun instanceof PropertyAccessorDescriptor) {
kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT); kotlinFlags.set(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT);
aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter());
@@ -958,6 +958,9 @@ public class JetTypeMapper {
} }
return ACC_PRIVATE; return ACC_PRIVATE;
} }
else if (p.getVisibility() == Visibilities.INTERNAL) {
return ACC_PUBLIC;
}
else { else {
return defaultFlags; return defaultFlags;
} }
@@ -179,7 +179,10 @@ public class PropertyCodegen {
String getterName = getterName(propertyDescriptor.getName()); String getterName = getterName(propertyDescriptor.getName());
MethodVisitor mv = v.newMethod(origin, flags, getterName, descriptor, null, null); MethodVisitor mv = v.newMethod(origin, flags, getterName, descriptor, null, null);
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(),
signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor); signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor,
propertyDescriptor.getGetter() == null
? propertyDescriptor.getVisibility()
: propertyDescriptor.getGetter().getVisibility());
if (propertyDescriptor.getGetter() != null) { if (propertyDescriptor.getGetter() != null) {
assert !propertyDescriptor.getGetter().hasBody(); assert !propertyDescriptor.getGetter().hasBody();
@@ -223,7 +226,7 @@ public class PropertyCodegen {
} }
public static void generateJetPropertyAnnotation(MethodVisitor mv, @NotNull String kotlinType, @NotNull String typeParameters, public static void generateJetPropertyAnnotation(MethodVisitor mv, @NotNull String kotlinType, @NotNull String typeParameters,
@NotNull PropertyDescriptor propertyDescriptor) { @NotNull PropertyDescriptor propertyDescriptor, @NotNull Visibility visibility) {
JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv);
Modality modality = propertyDescriptor.getModality(); Modality modality = propertyDescriptor.getModality();
BitSet flags = new BitSet(); BitSet flags = new BitSet();
@@ -233,6 +236,12 @@ public class PropertyCodegen {
? JvmStdlibNames.JET_METHOD_FLAG_FORCE_FINAL_BIT ? JvmStdlibNames.JET_METHOD_FLAG_FORCE_FINAL_BIT
: JvmStdlibNames.JET_METHOD_FLAG_FORCE_OPEN_BIT); : JvmStdlibNames.JET_METHOD_FLAG_FORCE_OPEN_BIT);
} }
if (visibility == Visibilities.INTERNAL) {
flags.set(JvmStdlibNames.JET_METHOD_FLAG_INTERNAL_BIT);
}
else if (visibility == Visibilities.PRIVATE) {
flags.set(JvmStdlibNames.JET_METHOD_FLAG_PRIVATE_BIT);
}
aw.writeFlags(flags); aw.writeFlags(flags);
aw.writeTypeParameters(typeParameters); aw.writeTypeParameters(typeParameters);
aw.writePropertyType(kotlinType); aw.writePropertyType(kotlinType);
@@ -275,7 +284,8 @@ public class PropertyCodegen {
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor(); final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null); MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null);
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(), generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(),
signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor); signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor,
propertyDescriptor.getSetter().getVisibility());
if (propertyDescriptor.getSetter() != null) { if (propertyDescriptor.getSetter() != null) {
assert !propertyDescriptor.getSetter().hasBody(); assert !propertyDescriptor.getSetter().hasBody();
@@ -49,10 +49,12 @@ public class JvmStdlibNames {
public static final String JET_METHOD_PROPERTY_TYPE_FIELD = "propertyType"; public static final String JET_METHOD_PROPERTY_TYPE_FIELD = "propertyType";
public static final int JET_METHOD_FLAGS_DEFAULT_VALUE = 0; public static final int JET_METHOD_FLAGS_DEFAULT_VALUE = 0;
public static final int JET_METHOD_FLAGS_BITS = 3; public static final int JET_METHOD_FLAGS_BITS = 5;
public static final int JET_METHOD_FLAG_PROPERTY_BIT = 0; public static final int JET_METHOD_FLAG_PROPERTY_BIT = 0;
public static final int JET_METHOD_FLAG_FORCE_OPEN_BIT = 1; public static final int JET_METHOD_FLAG_FORCE_OPEN_BIT = 1;
public static final int JET_METHOD_FLAG_FORCE_FINAL_BIT = 2; public static final int JET_METHOD_FLAG_FORCE_FINAL_BIT = 2;
public static final int JET_METHOD_FLAG_PRIVATE_BIT = 3;
public static final int JET_METHOD_FLAG_INTERNAL_BIT = 4;
public static final JvmClassName JET_CONSTRUCTOR = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetConstructor"); public static final JvmClassName JET_CONSTRUCTOR = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetConstructor");
@@ -9,11 +9,11 @@ abstract class ClassValAbstract {
fun box() : String { fun box() : String {
for(m in ClassValAbstract.methods) { for(m in ClassValAbstract.methods) {
if(m.sure().getName() == "getA") { if(m.sure().getName() == "getA") {
if(m.sure().getModifiers() != 1024) if(m.sure().getModifiers() != 1025)
return "get failed" return "get failed"
} }
if(m.sure().getName() == "setA") { if(m.sure().getName() == "setA") {
if(m.sure().getModifiers() != 1024) if(m.sure().getModifiers() != 1025)
return "set failed" return "set failed"
} }
} }