From 93d200be82010c058a3d09da4b1fa5e5e90ffb47 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 8 Jul 2013 18:41:07 +0400 Subject: [PATCH] Minor, move byte arrays logic to ClassData/PackageData --- .../codegen/ImplementationBodyCodegen.java | 26 +++++-------------- .../jet/codegen/NamespaceCodegen.java | 22 +++++----------- .../descriptors/serialization/ClassData.java | 14 ++++++++++ .../serialization/NameResolver.java | 10 +++++++ .../serialization/NameSerializationUtil.java | 23 ++++++++++------ .../serialization/PackageData.java | 26 +++++++++++++++---- 6 files changed, 73 insertions(+), 48 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 7f4e4f83e6e..0f2f919c1ec 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -41,7 +41,9 @@ import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.codegen.state.JetTypeMapperMode; -import org.jetbrains.jet.descriptors.serialization.*; +import org.jetbrains.jet.descriptors.serialization.ClassData; +import org.jetbrains.jet.descriptors.serialization.DescriptorSerializer; +import org.jetbrains.jet.descriptors.serialization.ProtoBuf; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor; import org.jetbrains.jet.lang.psi.*; @@ -61,16 +63,14 @@ import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; -import org.jetbrains.jet.utils.ExceptionUtils; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.util.*; import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.jet.codegen.AsmUtil.*; import static org.jetbrains.jet.codegen.CodegenUtil.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; +import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.callableDescriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*; @@ -220,26 +220,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } private void writeKotlinInfo() { - AnnotationVisitor av = v.getVisitor().visitAnnotation(JvmStdlibNames.KOTLIN_INFO_CLASS.getDescriptor(), true); - DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(typeMapper)); ProtoBuf.Class classProto = serializer.classProto(descriptor).build(); - try { - ByteArrayOutputStream classStream = new ByteArrayOutputStream(); - classProto.writeTo(classStream); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - NameSerializationUtil.serializeNameTable(out, serializer.getNameTable()); - out.write(classStream.toByteArray()); - - av.visit("data", out.toByteArray()); - } - catch (IOException e) { - throw ExceptionUtils.rethrow(e); - } + ClassData data = new ClassData(createNameResolver(serializer.getNameTable()), classProto); + AnnotationVisitor av = v.getVisitor().visitAnnotation(JvmStdlibNames.KOTLIN_INFO_CLASS.getDescriptor(), true); + av.visit("data", data.toBytes()); av.visitEnd(); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index 3ad01c6706b..da8cb5a43a7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -31,7 +31,7 @@ import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.context.FieldOwnerContext; import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.descriptors.serialization.DescriptorSerializer; -import org.jetbrains.jet.descriptors.serialization.NameSerializationUtil; +import org.jetbrains.jet.descriptors.serialization.PackageData; import org.jetbrains.jet.descriptors.serialization.ProtoBuf; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; @@ -45,15 +45,13 @@ import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.utils.ExceptionUtils; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.util.Collection; import java.util.Collections; import java.util.List; import static org.jetbrains.asm4.Opcodes.*; +import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver; import static org.jetbrains.jet.lang.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.getNotNull; @@ -160,19 +158,11 @@ public class NamespaceCodegen extends MemberCodegen { if (!writeAnnotation) return; - ByteArrayOutputStream stream = new ByteArrayOutputStream(); + PackageData data = new PackageData(createNameResolver(serializer.getNameTable()), packageProto.build()); - NameSerializationUtil.serializeNameTable(stream, serializer.getNameTable()); - try { - packageProto.build().writeTo(stream); - } - catch (IOException e) { - throw ExceptionUtils.rethrow(e); - } - - AnnotationVisitor kotlinInfo = v.getClassBuilder().newAnnotation(JvmStdlibNames.KOTLIN_INFO_CLASS.getDescriptor(), true); - kotlinInfo.visit("data", stream.toByteArray()); - kotlinInfo.visitEnd(); + AnnotationVisitor av = v.getClassBuilder().newAnnotation(JvmStdlibNames.KOTLIN_INFO_CLASS.getDescriptor(), true); + av.visit("data", data.toBytes()); + av.visitEnd(); } private void generate(JetFile file) { diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassData.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassData.java index c3afeb59107..5fd442048f9 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassData.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/ClassData.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.utils.ExceptionUtils; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; public final class ClassData { @@ -55,4 +56,17 @@ public final class ClassData { public ProtoBuf.Class getClassProto() { return classProto; } + + @NotNull + public byte[] toBytes() { + try { + ByteArrayOutputStream result = new ByteArrayOutputStream(); + NameSerializationUtil.serializeNameResolver(result, nameResolver); + classProto.writeTo(result); + return result.toByteArray(); + } + catch (IOException e) { + throw ExceptionUtils.rethrow(e); + } + } } diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameResolver.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameResolver.java index c27e1dbf855..75690ab6691 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameResolver.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameResolver.java @@ -36,6 +36,16 @@ public class NameResolver { this.qualifiedNames = qualifiedNames; } + @NotNull + public ProtoBuf.SimpleNameTable getSimpleNameTable() { + return simpleNames; + } + + @NotNull + public ProtoBuf.QualifiedNameTable getQualifiedNameTable() { + return qualifiedNames; + } + @NotNull public Name getName(int index) { String name = simpleNames.getName(index); diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameSerializationUtil.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameSerializationUtil.java index c057a72538c..901383bec10 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameSerializationUtil.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/NameSerializationUtil.java @@ -39,12 +39,21 @@ public class NameSerializationUtil { } } - public static void serializeNameTable(@NotNull OutputStream out, @NotNull NameTable nameTable) { - try { - ProtoBuf.SimpleNameTable simpleNamesProto = toSimpleNameTable(nameTable); - simpleNamesProto.writeDelimitedTo(out); + public static void serializeNameResolver(@NotNull OutputStream out, @NotNull NameResolver nameResolver) { + serializeNameTable(out, nameResolver.getSimpleNameTable(), nameResolver.getQualifiedNameTable()); + } - ProtoBuf.QualifiedNameTable qualifiedNameTable = toQualifiedNameTable(nameTable); + public static void serializeNameTable(@NotNull OutputStream out, @NotNull NameTable nameTable) { + serializeNameTable(out, toSimpleNameTable(nameTable), toQualifiedNameTable(nameTable)); + } + + private static void serializeNameTable( + @NotNull OutputStream out, + @NotNull ProtoBuf.SimpleNameTable simpleNameTable, + @NotNull ProtoBuf.QualifiedNameTable qualifiedNameTable + ) { + try { + simpleNameTable.writeDelimitedTo(out); qualifiedNameTable.writeDelimitedTo(out); } catch (IOException e) { @@ -72,8 +81,6 @@ public class NameSerializationUtil { @NotNull public static NameResolver createNameResolver(@NotNull NameTable table) { - return new NameResolver( - toSimpleNameTable(table), - toQualifiedNameTable(table)); + return new NameResolver(toSimpleNameTable(table), toQualifiedNameTable(table)); } } diff --git a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/PackageData.java b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/PackageData.java index 496bd33d70b..89b46ab0b08 100644 --- a/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/PackageData.java +++ b/compiler/frontend/serialization/src/org/jetbrains/jet/descriptors/serialization/PackageData.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.utils.ExceptionUtils; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; public final class PackageData { @@ -41,16 +42,31 @@ public final class PackageData { private final ProtoBuf.Package packageProto; - public PackageData(@NotNull NameResolver resolver, @NotNull ProtoBuf.Package proto) { - nameResolver = resolver; - packageProto = proto; + public PackageData(@NotNull NameResolver nameResolver, @NotNull ProtoBuf.Package packageProto) { + this.nameResolver = nameResolver; + this.packageProto = packageProto; } + @NotNull + public NameResolver getNameResolver() { + return nameResolver; + } + + @NotNull public ProtoBuf.Package getPackageProto() { return packageProto; } - public NameResolver getNameResolver() { - return nameResolver; + @NotNull + public byte[] toBytes() { + try { + ByteArrayOutputStream result = new ByteArrayOutputStream(); + NameSerializationUtil.serializeNameResolver(result, nameResolver); + packageProto.writeTo(result); + return result.toByteArray(); + } + catch (IOException e) { + throw ExceptionUtils.rethrow(e); + } } }