From c446fa3fc97f32ad13fbbd997ea53752cf11f9fe Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 8 Jun 2012 18:57:14 +0400 Subject: [PATCH] Replaced int flags with BitSet in internal API. --- .../jet/codegen/FunctionCodegen.java | 3 +-- .../jet/codegen/PropertyCodegen.java | 6 +++++- .../kotlin/JetMethodAnnotationWriter.java | 19 ++++++++++++----- .../resolve/java/JavaDescriptorResolver.java | 2 +- .../java/JavaDescriptorResolverHelper.java | 6 +++--- .../jet/lang/resolve/java/JvmStdlibNames.java | 5 +++-- .../resolve/java/kt/JetMethodAnnotation.java | 21 ++++++++++++------- 7 files changed, 40 insertions(+), 22 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index a13eb684a54..7d98bc5e18f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -29,7 +29,6 @@ import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmClassName; -import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.objectweb.asm.Label; @@ -136,7 +135,7 @@ public class FunctionCodegen { throw new IllegalStateException(); } JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); - aw.writeFlags(JvmStdlibNames.JET_METHOD_FLAGS_DEFAULT); + aw.writeFlags(new BitSet()); aw.writeNullableReturnType(functionDescriptor.getReturnType().isNullable()); aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); aw.writeReturnType(jvmSignature.getKotlinReturnType()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java index 493b796a187..2b5663d8b12 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java @@ -36,6 +36,8 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; +import java.util.BitSet; + /** * @author max */ @@ -221,7 +223,9 @@ public class PropertyCodegen { public static void generateJetPropertyAnnotation(MethodVisitor mv, @NotNull String kotlinType, @NotNull String typeParameters) { JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); - aw.writeFlags(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY); + BitSet flags = new BitSet(); + flags.set(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT); + aw.writeFlags(flags); aw.writeTypeParameters(typeParameters); aw.writePropertyType(kotlinType); aw.visitEnd(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/signature/kotlin/JetMethodAnnotationWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/signature/kotlin/JetMethodAnnotationWriter.java index fd0eeea8577..82f69f2e0a3 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/signature/kotlin/JetMethodAnnotationWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/signature/kotlin/JetMethodAnnotationWriter.java @@ -21,6 +21,8 @@ import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.MethodVisitor; +import java.util.BitSet; + /** * @author Stepan Koltsov */ @@ -30,13 +32,20 @@ public class JetMethodAnnotationWriter { private JetMethodAnnotationWriter(AnnotationVisitor av) { this.av = av; } - - public void writeFlags(int flags) { - if (flags != JvmStdlibNames.JET_METHOD_FLAGS_DEFAULT) { - av.visit(JvmStdlibNames.JET_METHOD_FLAGS_FIELD, flags); + + public void writeFlags(BitSet flags) { + int flagsValue = 0; + for (int bit = 0; bit < flags.length(); bit++) { + if (flags.get(bit)) { + flagsValue |= (1 << bit); + } + } + + if (flagsValue != JvmStdlibNames.JET_METHOD_FLAGS_DEFAULT_VALUE) { + av.visit(JvmStdlibNames.JET_METHOD_FLAGS_FIELD, flagsValue); } } - + public void writeTypeParameters(@NotNull String typeParameters) { if (typeParameters.length() > 0) { av.visit(JvmStdlibNames.JET_METHOD_TYPE_PARAMETERS_FIELD, typeParameters); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 81ad8730af0..e4628048c54 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1597,7 +1597,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes } // TODO: ugly - if ((method.getJetMethod().flags() & JvmStdlibNames.JET_METHOD_FLAG_PROPERTY) != 0) { + if (method.getJetMethod().flags().get(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT)) { return null; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java index f9606ef0396..8d012e51774 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolverHelper.java @@ -125,7 +125,7 @@ class JavaDescriptorResolverHelper { NamedMembers members = getNamedMembers(Name.identifier(propertyName)); // TODO: some java properties too - if ((method.getJetMethod().flags() & JvmStdlibNames.JET_METHOD_FLAG_PROPERTY) != 0) { + if (method.getJetMethod().flags().get(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT)) { int i = 0; @@ -167,7 +167,7 @@ class JavaDescriptorResolverHelper { String propertyName = propertyParseResult.getPropertyName(); NamedMembers members = getNamedMembers(Name.identifier(propertyName)); - if ((method.getJetMethod().flags() & JvmStdlibNames.JET_METHOD_FLAG_PROPERTY) != 0) { + if (method.getJetMethod().flags().get(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT)) { if (method.getParameters().size() == 0) { // TODO: report error properly throw new IllegalStateException(); @@ -204,7 +204,7 @@ class JavaDescriptorResolverHelper { } } - if ((method.getJetMethod().flags() & JvmStdlibNames.JET_METHOD_FLAG_PROPERTY) == 0) { + if (!method.getJetMethod().flags().get(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT)) { NamedMembers namedMembers = getNamedMembers(Name.identifier(method.getName())); namedMembers.addMethod(method); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java index 354be51f0ec..c3a91cac4ec 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JvmStdlibNames.java @@ -48,8 +48,9 @@ public class JvmStdlibNames { public static final String JET_METHOD_TYPE_PARAMETERS_FIELD = "typeParameters"; public static final String JET_METHOD_PROPERTY_TYPE_FIELD = "propertyType"; - public static final int JET_METHOD_FLAGS_DEFAULT = 0; - public static final int JET_METHOD_FLAG_PROPERTY = 1; + public static final int JET_METHOD_FLAGS_DEFAULT_VALUE = 0; + public static final int JET_METHOD_FLAGS_BITS = 1; + public static final int JET_METHOD_FLAG_PROPERTY_BIT = 0; public static final JvmClassName JET_CONSTRUCTOR = JvmClassName.byFqNameWithoutInnerClasses("jet.runtime.typeinfo.JetConstructor"); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/JetMethodAnnotation.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/JetMethodAnnotation.java index addce51be90..e74b81210c9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/JetMethodAnnotation.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kt/JetMethodAnnotation.java @@ -22,6 +22,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; +import java.util.BitSet; + /** * @author Stepan Koltsov */ @@ -31,16 +33,19 @@ public class JetMethodAnnotation extends PsiAnnotationWrapper { super(psiAnnotation); } - private int flags; - private boolean flagsInitialized; - public int flags() { - if (!flagsInitialized) { - flags = getIntAttribute(JvmStdlibNames.JET_METHOD_FLAGS_FIELD, -1); - if (flags == -1) { + private BitSet flags = null; + public BitSet flags() { + if (flags == null) { + int flagsValue = getIntAttribute(JvmStdlibNames.JET_METHOD_FLAGS_FIELD, JvmStdlibNames.JET_METHOD_FLAGS_DEFAULT_VALUE); + if (flagsValue == JvmStdlibNames.JET_METHOD_FLAGS_DEFAULT_VALUE) { // for compatibility - flags = getIntAttribute(JvmStdlibNames.JET_METHOD_KIND_FIELD, JvmStdlibNames.JET_METHOD_FLAGS_DEFAULT); + flagsValue = getIntAttribute(JvmStdlibNames.JET_METHOD_KIND_FIELD, JvmStdlibNames.JET_METHOD_FLAGS_DEFAULT_VALUE); + } + + flags = new BitSet(JvmStdlibNames.JET_METHOD_FLAGS_BITS); + for (int bit = 0; bit < JvmStdlibNames.JET_METHOD_FLAGS_BITS; bit++) { + flags.set(bit, (flagsValue & (1 << bit)) != 0); } - flagsInitialized = true; } return flags; }