Minor, move byte arrays logic to ClassData/PackageData

This commit is contained in:
Alexander Udalov
2013-07-08 18:41:07 +04:00
parent e63cef0848
commit 93d200be82
6 changed files with 73 additions and 48 deletions
@@ -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.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.codegen.state.JetTypeMapperMode; 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.*;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor; import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptor;
import org.jetbrains.jet.lang.psi.*; 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.TypeUtils;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.utils.ExceptionUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.*; import java.util.*;
import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.asm4.Opcodes.*;
import static org.jetbrains.jet.codegen.AsmUtil.*; import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.CodegenUtil.*; import static org.jetbrains.jet.codegen.CodegenUtil.*;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; 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.callableDescriptorToDeclaration;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
@@ -220,26 +220,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
private void writeKotlinInfo() { private void writeKotlinInfo() {
AnnotationVisitor av = v.getVisitor().visitAnnotation(JvmStdlibNames.KOTLIN_INFO_CLASS.getDescriptor(), true);
DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(typeMapper)); DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(typeMapper));
ProtoBuf.Class classProto = serializer.classProto(descriptor).build(); ProtoBuf.Class classProto = serializer.classProto(descriptor).build();
try { ClassData data = new ClassData(createNameResolver(serializer.getNameTable()), classProto);
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);
}
AnnotationVisitor av = v.getVisitor().visitAnnotation(JvmStdlibNames.KOTLIN_INFO_CLASS.getDescriptor(), true);
av.visit("data", data.toBytes());
av.visitEnd(); av.visitEnd();
} }
@@ -31,7 +31,7 @@ import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.context.FieldOwnerContext; import org.jetbrains.jet.codegen.context.FieldOwnerContext;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.descriptors.serialization.DescriptorSerializer; 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.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; 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.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; 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.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static org.jetbrains.asm4.Opcodes.*; 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.BindingContext.DECLARATION_TO_DESCRIPTOR;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.getNotNull; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.getNotNull;
@@ -160,19 +158,11 @@ public class NamespaceCodegen extends MemberCodegen {
if (!writeAnnotation) return; if (!writeAnnotation) return;
ByteArrayOutputStream stream = new ByteArrayOutputStream(); PackageData data = new PackageData(createNameResolver(serializer.getNameTable()), packageProto.build());
NameSerializationUtil.serializeNameTable(stream, serializer.getNameTable()); AnnotationVisitor av = v.getClassBuilder().newAnnotation(JvmStdlibNames.KOTLIN_INFO_CLASS.getDescriptor(), true);
try { av.visit("data", data.toBytes());
packageProto.build().writeTo(stream); av.visitEnd();
}
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();
} }
private void generate(JetFile file) { private void generate(JetFile file) {
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.utils.ExceptionUtils; import org.jetbrains.jet.utils.ExceptionUtils;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
public final class ClassData { public final class ClassData {
@@ -55,4 +56,17 @@ public final class ClassData {
public ProtoBuf.Class getClassProto() { public ProtoBuf.Class getClassProto() {
return classProto; 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);
}
}
} }
@@ -36,6 +36,16 @@ public class NameResolver {
this.qualifiedNames = qualifiedNames; this.qualifiedNames = qualifiedNames;
} }
@NotNull
public ProtoBuf.SimpleNameTable getSimpleNameTable() {
return simpleNames;
}
@NotNull
public ProtoBuf.QualifiedNameTable getQualifiedNameTable() {
return qualifiedNames;
}
@NotNull @NotNull
public Name getName(int index) { public Name getName(int index) {
String name = simpleNames.getName(index); String name = simpleNames.getName(index);
@@ -39,12 +39,21 @@ public class NameSerializationUtil {
} }
} }
public static void serializeNameTable(@NotNull OutputStream out, @NotNull NameTable nameTable) { public static void serializeNameResolver(@NotNull OutputStream out, @NotNull NameResolver nameResolver) {
try { serializeNameTable(out, nameResolver.getSimpleNameTable(), nameResolver.getQualifiedNameTable());
ProtoBuf.SimpleNameTable simpleNamesProto = toSimpleNameTable(nameTable); }
simpleNamesProto.writeDelimitedTo(out);
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); qualifiedNameTable.writeDelimitedTo(out);
} }
catch (IOException e) { catch (IOException e) {
@@ -72,8 +81,6 @@ public class NameSerializationUtil {
@NotNull @NotNull
public static NameResolver createNameResolver(@NotNull NameTable table) { public static NameResolver createNameResolver(@NotNull NameTable table) {
return new NameResolver( return new NameResolver(toSimpleNameTable(table), toQualifiedNameTable(table));
toSimpleNameTable(table),
toQualifiedNameTable(table));
} }
} }
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.utils.ExceptionUtils; import org.jetbrains.jet.utils.ExceptionUtils;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
public final class PackageData { public final class PackageData {
@@ -41,16 +42,31 @@ public final class PackageData {
private final ProtoBuf.Package packageProto; private final ProtoBuf.Package packageProto;
public PackageData(@NotNull NameResolver resolver, @NotNull ProtoBuf.Package proto) { public PackageData(@NotNull NameResolver nameResolver, @NotNull ProtoBuf.Package packageProto) {
nameResolver = resolver; this.nameResolver = nameResolver;
packageProto = proto; this.packageProto = packageProto;
} }
@NotNull
public NameResolver getNameResolver() {
return nameResolver;
}
@NotNull
public ProtoBuf.Package getPackageProto() { public ProtoBuf.Package getPackageProto() {
return packageProto; return packageProto;
} }
public NameResolver getNameResolver() { @NotNull
return nameResolver; 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);
}
} }
} }