Support a more optimized way of storing types in metadata
Together with almost every type now there's also an id which references a type from a separate table. Storing such ids instead of Type messages will allow to reduce the size of the metadata for files where types are used many times over and over again. Currently only deserialization of such types is supported, along with the former mechanism
This commit is contained in:
@@ -47,7 +47,7 @@ internal abstract class DescriptorBasedProperty<out R> protected constructor(
|
||||
val jvmSignature = RuntimeTypeMapper.mapPropertySignature(descriptor)
|
||||
when (jvmSignature) {
|
||||
is KotlinProperty -> {
|
||||
JvmProtoBufUtil.getJvmFieldSignature(jvmSignature.proto, jvmSignature.nameResolver)?.let {
|
||||
JvmProtoBufUtil.getJvmFieldSignature(jvmSignature.proto, jvmSignature.nameResolver, jvmSignature.typeTable)?.let {
|
||||
container.findFieldBySignature(jvmSignature.proto, jvmSignature.nameResolver, it.name)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||
@@ -100,7 +101,8 @@ internal sealed class JvmPropertySignature {
|
||||
val descriptor: PropertyDescriptor,
|
||||
val proto: ProtoBuf.Property,
|
||||
val signature: JvmProtoBuf.JvmPropertySignature,
|
||||
val nameResolver: NameResolver
|
||||
val nameResolver: NameResolver,
|
||||
val typeTable: TypeTable
|
||||
) : JvmPropertySignature() {
|
||||
private val string: String
|
||||
|
||||
@@ -110,7 +112,7 @@ internal sealed class JvmPropertySignature {
|
||||
}
|
||||
else {
|
||||
val (name, desc) =
|
||||
JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver) ?:
|
||||
JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable) ?:
|
||||
throw KotlinReflectionInternalError("No field signature for property: $descriptor")
|
||||
|
||||
val moduleSuffix =
|
||||
@@ -154,12 +156,12 @@ internal object RuntimeTypeMapper {
|
||||
|
||||
val proto = function.proto
|
||||
if (proto is ProtoBuf.Function) {
|
||||
JvmProtoBufUtil.getJvmMethodSignature(proto, function.nameResolver)?.let { signature ->
|
||||
JvmProtoBufUtil.getJvmMethodSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
|
||||
return JvmFunctionSignature.KotlinFunction(signature)
|
||||
}
|
||||
}
|
||||
if (proto is ProtoBuf.Constructor) {
|
||||
JvmProtoBufUtil.getJvmConstructorSignature(proto, function.nameResolver)?.let { signature ->
|
||||
JvmProtoBufUtil.getJvmConstructorSignature(proto, function.nameResolver, function.typeTable)?.let { signature ->
|
||||
return JvmFunctionSignature.KotlinConstructor(signature)
|
||||
}
|
||||
}
|
||||
@@ -191,7 +193,7 @@ internal object RuntimeTypeMapper {
|
||||
throw KotlinReflectionInternalError("No metadata found for $property")
|
||||
}
|
||||
return JvmPropertySignature.KotlinProperty(
|
||||
property, proto, proto.getExtension(JvmProtoBuf.propertySignature), property.nameResolver
|
||||
property, proto, proto.getExtension(JvmProtoBuf.propertySignature), property.nameResolver, property.typeTable
|
||||
)
|
||||
}
|
||||
else if (property is JavaPropertyDescriptor) {
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.load.kotlin.JvmNameResolver
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializationContext
|
||||
import org.jetbrains.kotlin.serialization.deserialization.MemberDeserializer
|
||||
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
|
||||
import org.jetbrains.kotlin.serialization.jvm.BitEncoding
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
||||
@@ -43,8 +44,10 @@ public fun <R> Function<R>.reflect(): KFunction<R>? {
|
||||
)
|
||||
val proto = ProtoBuf.Function.parseFrom(input, JvmProtoBufUtil.EXTENSION_REGISTRY)
|
||||
val moduleData = javaClass.getOrCreateModule()
|
||||
val context = DeserializationContext(moduleData.deserialization, nameResolver, moduleData.module,
|
||||
parentTypeDeserializer = null, typeParameters = listOf())
|
||||
val context = DeserializationContext(
|
||||
moduleData.deserialization, nameResolver, moduleData.module,
|
||||
typeTable = TypeTable(proto.typeTable), parentTypeDeserializer = null, typeParameters = listOf()
|
||||
)
|
||||
val descriptor = MemberDeserializer(context).loadFunction(proto)
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
return KFunctionImpl(EmptyContainerForLocal, descriptor) as KFunction<R>
|
||||
|
||||
Reference in New Issue
Block a user