- small optimizations of JavaDescriptorResolver
- kind of method encoded in flags - nullable return type encoded in flags
This commit is contained in:
@@ -37,7 +37,10 @@ import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
|
||||
|
||||
@@ -102,16 +105,14 @@ public class CodegenUtil {
|
||||
}
|
||||
|
||||
|
||||
@NotNull
|
||||
public static BitSet getFlagsForVisibility(@NotNull Visibility visibility) {
|
||||
BitSet flags = new BitSet();
|
||||
public static int getFlagsForVisibility(@NotNull Visibility visibility) {
|
||||
if (visibility == Visibilities.INTERNAL) {
|
||||
flags.set(JvmStdlibNames.FLAG_INTERNAL_BIT);
|
||||
return JvmStdlibNames.FLAG_INTERNAL_BIT;
|
||||
}
|
||||
else if (visibility == Visibilities.PRIVATE) {
|
||||
flags.set(JvmStdlibNames.FLAG_PRIVATE_BIT);
|
||||
return JvmStdlibNames.FLAG_PRIVATE_BIT;
|
||||
}
|
||||
return flags;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -348,16 +348,17 @@ public class FunctionCodegen extends GenerationStateAware {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv);
|
||||
BitSet kotlinFlags = getFlagsForVisibility(functionDescriptor.getVisibility());
|
||||
int kotlinFlags = getFlagsForVisibility(functionDescriptor.getVisibility());
|
||||
if (isInterface(functionDescriptor.getContainingDeclaration()) && modality != Modality.ABSTRACT) {
|
||||
kotlinFlags.set(modality == Modality.FINAL
|
||||
kotlinFlags |= modality == Modality.FINAL
|
||||
? JvmStdlibNames.FLAG_FORCE_FINAL_BIT
|
||||
: JvmStdlibNames.FLAG_FORCE_OPEN_BIT);
|
||||
: JvmStdlibNames.FLAG_FORCE_OPEN_BIT;
|
||||
}
|
||||
aw.writeFlags(kotlinFlags);
|
||||
aw.writeKind(DescriptorKindUtils.kindToInt(functionDescriptor.getKind()));
|
||||
kotlinFlags |= DescriptorKindUtils.kindToFlags(functionDescriptor.getKind());
|
||||
//noinspection ConstantConditions
|
||||
aw.writeNullableReturnType(functionDescriptor.getReturnType().isNullable());
|
||||
if (functionDescriptor.getReturnType().isNullable())
|
||||
kotlinFlags |= JvmStdlibNames.FLAG_NULLABLE_RETURN_TYPE_BIT;
|
||||
aw.writeFlags(kotlinFlags);
|
||||
aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter());
|
||||
aw.writeReturnType(jvmSignature.getKotlinReturnType());
|
||||
aw.visitEnd();
|
||||
|
||||
@@ -53,7 +53,6 @@ import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||
import org.jetbrains.jet.lexer.JetTokens;
|
||||
import org.jetbrains.jet.utils.BitSetUtils;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@@ -248,10 +247,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
if (signature.getKotlinGenericSignature() != null || descriptor.getVisibility() != Visibilities.PUBLIC) {
|
||||
AnnotationVisitor annotationVisitor = v.newAnnotation(JvmStdlibNames.JET_CLASS.getDescriptor(), true);
|
||||
annotationVisitor.visit(JvmStdlibNames.JET_CLASS_SIGNATURE, signature.getKotlinGenericSignature());
|
||||
BitSet flags = getFlagsForVisibility(descriptor.getVisibility());
|
||||
int flagsValue = BitSetUtils.toInt(flags);
|
||||
if (JvmStdlibNames.FLAGS_DEFAULT_VALUE != flagsValue) {
|
||||
annotationVisitor.visit(JvmStdlibNames.JET_CLASS_FLAGS_FIELD, flagsValue);
|
||||
int flags = getFlagsForVisibility(descriptor.getVisibility());
|
||||
if (JvmStdlibNames.FLAGS_DEFAULT_VALUE != flags) {
|
||||
annotationVisitor.visit(JvmStdlibNames.JET_FLAGS_FIELD, flags);
|
||||
}
|
||||
annotationVisitor.visitEnd();
|
||||
}
|
||||
@@ -827,9 +825,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
|
||||
AnnotationVisitor jetConstructorVisitor = mv.visitAnnotation(JvmStdlibNames.JET_CONSTRUCTOR.getDescriptor(), true);
|
||||
|
||||
int flagsValue = BitSetUtils.toInt(getFlagsForVisibility(constructorDescriptor.getVisibility()));
|
||||
int flagsValue = getFlagsForVisibility(constructorDescriptor.getVisibility());
|
||||
if (JvmStdlibNames.FLAGS_DEFAULT_VALUE != flagsValue) {
|
||||
jetConstructorVisitor.visit(JvmStdlibNames.JET_CLASS_FLAGS_FIELD, flagsValue);
|
||||
jetConstructorVisitor.visit(JvmStdlibNames.JET_FLAGS_FIELD, flagsValue);
|
||||
}
|
||||
|
||||
jetConstructorVisitor.visitEnd();
|
||||
@@ -1218,21 +1216,22 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
||||
JvmMethodSignature jvmSignature =
|
||||
typeMapper.mapToCallableMethod(inheritedFun, false, OwnerKind.IMPLEMENTATION).getSignature();
|
||||
JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv);
|
||||
BitSet kotlinFlags = getFlagsForVisibility(fun.getVisibility());
|
||||
int kotlinFlags = getFlagsForVisibility(fun.getVisibility());
|
||||
if (fun instanceof PropertyAccessorDescriptor) {
|
||||
kotlinFlags.set(JvmStdlibNames.FLAG_PROPERTY_BIT);
|
||||
kotlinFlags |= JvmStdlibNames.FLAG_PROPERTY_BIT;
|
||||
aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter());
|
||||
aw.writePropertyType(jvmSignature.getKotlinReturnType());
|
||||
}
|
||||
else {
|
||||
JetType returnType = fun.getReturnType();
|
||||
assert returnType != null;
|
||||
aw.writeNullableReturnType(returnType.isNullable());
|
||||
if (returnType.isNullable())
|
||||
kotlinFlags |= JvmStdlibNames.FLAG_NULLABLE_RETURN_TYPE_BIT;
|
||||
aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter());
|
||||
aw.writeReturnType(jvmSignature.getKotlinReturnType());
|
||||
}
|
||||
kotlinFlags |= DescriptorKindUtils.kindToFlags(inheritedFun.getKind());
|
||||
aw.writeFlags(kotlinFlags);
|
||||
aw.writeKind(DescriptorKindUtils.kindToInt(inheritedFun.getKind()));
|
||||
aw.visitEnd();
|
||||
|
||||
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
|
||||
|
||||
@@ -39,8 +39,6 @@ import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
|
||||
|
||||
import java.util.BitSet;
|
||||
|
||||
import static org.jetbrains.asm4.Opcodes.*;
|
||||
import static org.jetbrains.jet.codegen.AsmUtil.genStubThrow;
|
||||
import static org.jetbrains.jet.codegen.AsmUtil.getVisibilityAccessFlag;
|
||||
@@ -254,15 +252,13 @@ public class PropertyCodegen extends GenerationStateAware {
|
||||
) {
|
||||
JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv);
|
||||
Modality modality = propertyDescriptor.getModality();
|
||||
BitSet flags = getFlagsForVisibility(visibility);
|
||||
flags.set(JvmStdlibNames.FLAG_PROPERTY_BIT);
|
||||
int flags = getFlagsForVisibility(visibility) | JvmStdlibNames.FLAG_PROPERTY_BIT;
|
||||
if (isInterface(propertyDescriptor.getContainingDeclaration()) && modality != Modality.ABSTRACT) {
|
||||
flags.set(modality == Modality.FINAL
|
||||
flags |= modality == Modality.FINAL
|
||||
? JvmStdlibNames.FLAG_FORCE_FINAL_BIT
|
||||
: JvmStdlibNames.FLAG_FORCE_OPEN_BIT);
|
||||
: JvmStdlibNames.FLAG_FORCE_OPEN_BIT;
|
||||
}
|
||||
aw.writeFlags(flags);
|
||||
aw.writeKind(DescriptorKindUtils.kindToInt(propertyDescriptor.getKind()));
|
||||
aw.writeFlags(flags | DescriptorKindUtils.kindToFlags(propertyDescriptor.getKind()));
|
||||
aw.writeTypeParameters(typeParameters);
|
||||
aw.writePropertyType(kotlinType);
|
||||
aw.visitEnd();
|
||||
|
||||
+3
-20
@@ -20,10 +20,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.asm4.AnnotationVisitor;
|
||||
import org.jetbrains.asm4.MethodVisitor;
|
||||
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
|
||||
import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils;
|
||||
import org.jetbrains.jet.utils.BitSetUtils;
|
||||
|
||||
import java.util.BitSet;
|
||||
|
||||
/**
|
||||
* @author Stepan Koltsov
|
||||
@@ -35,16 +31,9 @@ public class JetMethodAnnotationWriter {
|
||||
this.av = av;
|
||||
}
|
||||
|
||||
public void writeFlags(BitSet flags) {
|
||||
int flagsValue = BitSetUtils.toInt(flags);
|
||||
if (flagsValue != JvmStdlibNames.FLAGS_DEFAULT_VALUE) {
|
||||
av.visit(JvmStdlibNames.JET_METHOD_FLAGS_FIELD, flagsValue);
|
||||
}
|
||||
}
|
||||
|
||||
public void writeKind(int kind) {
|
||||
if (kind != DescriptorKindUtils.getDefaultKindValue()) {
|
||||
av.visit(JvmStdlibNames.JET_METHOD_KIND_FIELD, kind);
|
||||
public void writeFlags(int flags) {
|
||||
if (flags != JvmStdlibNames.FLAGS_DEFAULT_VALUE) {
|
||||
av.visit(JvmStdlibNames.JET_FLAGS_FIELD, flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,12 +55,6 @@ public class JetMethodAnnotationWriter {
|
||||
}
|
||||
}
|
||||
|
||||
public void writeNullableReturnType(boolean nullableReturnType) {
|
||||
if (nullableReturnType) {
|
||||
av.visit(JvmStdlibNames.JET_METHOD_NULLABLE_RETURN_TYPE_FIELD, nullableReturnType);
|
||||
}
|
||||
}
|
||||
|
||||
public void visitEnd() {
|
||||
av.visitEnd();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user