From 5541488ca0b56bc8dbeee8395d744de5c7f8cb77 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 14 Jun 2012 20:38:47 +0400 Subject: [PATCH] Added BitSetUtils and method converting BitSet to int. --- .../codegen/ImplementationBodyCodegen.java | 10 ++++- .../kotlin/JetMethodAnnotationWriter.java | 9 +---- .../org/jetbrains/jet/utils/BitSetUtils.java | 38 +++++++++++++++++++ 3 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 compiler/util/src/org/jetbrains/jet/utils/BitSetUtils.java diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 0e984eef72a..489aeff5c62 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.scopes.DescriptorPredicate; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.utils.BitSetUtils; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; @@ -168,11 +169,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (signature.getKotlinGenericSignature() != null || descriptor.getVisibility() != Visibilities.PUBLIC) { AnnotationVisitor annotationVisitor = v.newAnnotation(myClass, JvmStdlibNames.JET_CLASS.getDescriptor(), true); annotationVisitor.visit(JvmStdlibNames.JET_CLASS_SIGNATURE, signature.getKotlinGenericSignature()); + BitSet flags = new BitSet(); if (descriptor.getVisibility() == Visibilities.INTERNAL) { - annotationVisitor.visit(JvmStdlibNames.JET_CLASS_FLAGS_FIELD, 1 << JvmStdlibNames.FLAG_INTERNAL_BIT); + flags.set(JvmStdlibNames.FLAG_INTERNAL_BIT); } else if (descriptor.getVisibility() == Visibilities.PRIVATE) { - annotationVisitor.visit(JvmStdlibNames.JET_CLASS_FLAGS_FIELD, 1 << JvmStdlibNames.FLAG_PRIVATE_BIT); + flags.set(JvmStdlibNames.FLAG_PRIVATE_BIT); + } + int flagsValue = BitSetUtils.toInt(flags); + if (JvmStdlibNames.FLAGS_DEFAULT_VALUE != flagsValue) { + annotationVisitor.visit(JvmStdlibNames.JET_CLASS_FLAGS_FIELD, flagsValue); } annotationVisitor.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 b6639867b6f..d4e073be03a 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 @@ -18,6 +18,7 @@ package org.jetbrains.jet.codegen.signature.kotlin; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; +import org.jetbrains.jet.utils.BitSetUtils; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.MethodVisitor; @@ -34,13 +35,7 @@ public class JetMethodAnnotationWriter { } public void writeFlags(BitSet flags) { - int flagsValue = 0; - for (int bit = 0; bit < flags.length(); bit++) { - if (flags.get(bit)) { - flagsValue |= (1 << bit); - } - } - + int flagsValue = BitSetUtils.toInt(flags); if (flagsValue != JvmStdlibNames.FLAGS_DEFAULT_VALUE) { av.visit(JvmStdlibNames.JET_METHOD_FLAGS_FIELD, flagsValue); } diff --git a/compiler/util/src/org/jetbrains/jet/utils/BitSetUtils.java b/compiler/util/src/org/jetbrains/jet/utils/BitSetUtils.java new file mode 100644 index 00000000000..8bfda1fc4e0 --- /dev/null +++ b/compiler/util/src/org/jetbrains/jet/utils/BitSetUtils.java @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.utils; + +import java.util.BitSet; + +/** + * @author Evgeny Gerashchenko + * @since 6/14/12 + */ +public class BitSetUtils { + private BitSetUtils() { + } + + public static int toInt(BitSet bitSet) { + int intValue = 0; + for (int bit = 0; bit < bitSet.length(); bit++) { + if (bitSet.get(bit)) { + intValue |= (1 << bit); + } + } + return intValue; + } +}