[KLIB] Optimize deserialization a bit

This commit is contained in:
Roman Artemev
2021-08-05 11:41:39 +03:00
committed by teamcityserver
parent 7add820f0d
commit 3dcee8fda8
@@ -177,7 +177,7 @@ class SymbolTable(
} }
inline fun referenced(d: D, orElse: () -> S): S { inline fun referenced(d: D, reg: Boolean = true, orElse: () -> S): S {
synchronized(lock) { synchronized(lock) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
val d0 = d.original as D val d0 = d.original as D
@@ -187,8 +187,10 @@ class SymbolTable(
val s = get(d0) val s = get(d0)
if (s == null) { if (s == null) {
val new = orElse() val new = orElse()
assert(unboundSymbols.add(new)) { if (reg) {
"Symbol for $new was already referenced" assert(unboundSymbols.add(new)) {
"Symbol for $new was already referenced"
}
} }
set(new) set(new)
return new return new
@@ -198,12 +200,14 @@ class SymbolTable(
} }
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
inline fun referenced(sig: IdSignature, orElse: () -> S): S { inline fun referenced(sig: IdSignature, reg: Boolean = true, orElse: () -> S): S {
synchronized(lock) { synchronized(lock) {
return get(sig) ?: run { return get(sig) ?: run {
val new = orElse() val new = orElse()
assert(unboundSymbols.add(new)) { if (reg) {
"Symbol for ${new.signature} was already referenced" assert(unboundSymbols.add(new)) {
"Symbol for ${new.signature} was already referenced"
}
} }
set(new) set(new)
new new
@@ -515,7 +519,7 @@ class SymbolTable(
override fun referenceClassFromLinker(sig: IdSignature): IrClassSymbol = override fun referenceClassFromLinker(sig: IdSignature): IrClassSymbol =
classSymbolTable.run { classSymbolTable.run {
if (sig.isPubliclyVisible) referenced(sig) { IrClassPublicSymbolImpl(sig) } if (sig.isPubliclyVisible) referenced(sig, false) { IrClassPublicSymbolImpl(sig) }
else IrClassSymbolImpl() else IrClassSymbolImpl()
} }
@@ -582,7 +586,7 @@ class SymbolTable(
override fun referenceConstructorFromLinker(sig: IdSignature): IrConstructorSymbol = override fun referenceConstructorFromLinker(sig: IdSignature): IrConstructorSymbol =
constructorSymbolTable.run { constructorSymbolTable.run {
if (sig.isPubliclyVisible) referenced(sig) { IrConstructorPublicSymbolImpl(sig) } if (sig.isPubliclyVisible) referenced(sig, false) { IrConstructorPublicSymbolImpl(sig) }
else IrConstructorSymbolImpl() else IrConstructorSymbolImpl()
} }
@@ -634,7 +638,7 @@ class SymbolTable(
override fun referenceEnumEntryFromLinker(sig: IdSignature) = override fun referenceEnumEntryFromLinker(sig: IdSignature) =
enumEntrySymbolTable.run { enumEntrySymbolTable.run {
if (sig.isPubliclyVisible) referenced(sig) { IrEnumEntryPublicSymbolImpl(sig) } if (sig.isPubliclyVisible) referenced(sig, false) { IrEnumEntryPublicSymbolImpl(sig) }
else IrEnumEntrySymbolImpl() else IrEnumEntrySymbolImpl()
} }
@@ -786,7 +790,7 @@ class SymbolTable(
override fun referencePropertyFromLinker(sig: IdSignature): IrPropertySymbol = override fun referencePropertyFromLinker(sig: IdSignature): IrPropertySymbol =
propertySymbolTable.run { propertySymbolTable.run {
if (sig.isPubliclyVisible) referenced(sig) { IrPropertyPublicSymbolImpl(sig) } if (sig.isPubliclyVisible) referenced(sig, false) { IrPropertyPublicSymbolImpl(sig) }
else IrPropertySymbolImpl() else IrPropertySymbolImpl()
} }
@@ -817,7 +821,7 @@ class SymbolTable(
override fun referenceTypeAliasFromLinker(sig: IdSignature) = override fun referenceTypeAliasFromLinker(sig: IdSignature) =
typeAliasSymbolTable.run { typeAliasSymbolTable.run {
if (sig.isPubliclyVisible) referenced(sig) { IrTypeAliasPublicSymbolImpl(sig) } if (sig.isPubliclyVisible) referenced(sig, false) { IrTypeAliasPublicSymbolImpl(sig) }
else IrTypeAliasSymbolImpl() else IrTypeAliasSymbolImpl()
} }
@@ -894,7 +898,7 @@ class SymbolTable(
override fun referenceSimpleFunctionFromLinker(sig: IdSignature): IrSimpleFunctionSymbol { override fun referenceSimpleFunctionFromLinker(sig: IdSignature): IrSimpleFunctionSymbol {
return simpleFunctionSymbolTable.run { return simpleFunctionSymbolTable.run {
if (sig.isPubliclyVisible) referenced(sig) { IrSimpleFunctionPublicSymbolImpl(sig) } if (sig.isPubliclyVisible) referenced(sig, false) { IrSimpleFunctionPublicSymbolImpl(sig) }
else IrSimpleFunctionSymbolImpl() else IrSimpleFunctionSymbolImpl()
} }
} }
@@ -1025,7 +1029,7 @@ class SymbolTable(
} }
override fun referenceGlobalTypeParameterFromLinker(sig: IdSignature): IrTypeParameterSymbol { override fun referenceGlobalTypeParameterFromLinker(sig: IdSignature): IrTypeParameterSymbol {
return globalTypeParameterSymbolTable.referenced(sig) { return globalTypeParameterSymbolTable.referenced(sig, false) {
if (sig.isPubliclyVisible) IrTypeParameterPublicSymbolImpl(sig) else IrTypeParameterSymbolImpl() if (sig.isPubliclyVisible) IrTypeParameterPublicSymbolImpl(sig) else IrTypeParameterSymbolImpl()
} }
} }