There might be a clash between getter name and box function name
This commit is contained in:
Igor Chevdar
2019-07-02 19:32:57 +03:00
parent 9ae3884a94
commit d22bd18926
7 changed files with 24 additions and 18 deletions
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.backend.konan.llvm.*
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
@@ -44,6 +41,8 @@ private fun KonanSymbols.getTypeConversionImpl(
}?.symbol }?.symbol
} }
internal object DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION : IrDeclarationOriginImpl("INLINE_CLASS_SPECIAL_FUNCTION")
internal val Context.getBoxFunction: (IrClass) -> IrSimpleFunction by Context.lazyMapMember { inlinedClass -> internal val Context.getBoxFunction: (IrClass) -> IrSimpleFunction by Context.lazyMapMember { inlinedClass ->
assert(inlinedClass.isUsedAsBoxClass()) assert(inlinedClass.isUsedAsBoxClass())
assert(inlinedClass.parent is IrFile) { "Expected top level inline class" } assert(inlinedClass.parent is IrFile) { "Expected top level inline class" }
@@ -63,7 +62,7 @@ internal val Context.getBoxFunction: (IrClass) -> IrSimpleFunction by Context.la
val descriptor = WrappedSimpleFunctionDescriptor() val descriptor = WrappedSimpleFunctionDescriptor()
IrFunctionImpl( IrFunctionImpl(
startOffset, endOffset, startOffset, endOffset,
IrDeclarationOrigin.DEFINED, DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION,
IrSimpleFunctionSymbolImpl(descriptor), IrSimpleFunctionSymbolImpl(descriptor),
Name.special("<${inlinedClass.name}-box>"), Name.special("<${inlinedClass.name}-box>"),
Visibilities.PUBLIC, Visibilities.PUBLIC,
@@ -114,7 +113,7 @@ internal val Context.getUnboxFunction: (IrClass) -> IrSimpleFunction by Context.
val descriptor = WrappedSimpleFunctionDescriptor() val descriptor = WrappedSimpleFunctionDescriptor()
IrFunctionImpl( IrFunctionImpl(
startOffset, endOffset, startOffset, endOffset,
IrDeclarationOrigin.DEFINED, DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION,
IrSimpleFunctionSymbolImpl(descriptor), IrSimpleFunctionSymbolImpl(descriptor),
Name.special("<${inlinedClass.name}-unbox>"), Name.special("<${inlinedClass.name}-unbox>"),
Visibilities.PUBLIC, Visibilities.PUBLIC,
@@ -95,12 +95,6 @@ val IrDeclaration.parentDeclarationsWithSelf: Sequence<IrDeclaration>
fun IrClass.companionObject() = this.declarations.filterIsInstance<IrClass>().atMostOne { it.isCompanion } fun IrClass.companionObject() = this.declarations.filterIsInstance<IrClass>().atMostOne { it.isCompanion }
val IrDeclaration.isGetter get() = this is IrSimpleFunction && this == this.correspondingProperty?.getter
val IrDeclaration.isSetter get() = this is IrSimpleFunction && this == this.correspondingProperty?.setter
val IrDeclaration.isAccessor get() = this.isGetter || this.isSetter
fun buildSimpleAnnotation(irBuiltIns: IrBuiltIns, startOffset: Int, endOffset: Int, fun buildSimpleAnnotation(irBuiltIns: IrBuiltIns, startOffset: Int, endOffset: Int,
annotationClass: IrClass, vararg args: String): IrConstructorCall { annotationClass: IrClass, vararg args: String): IrConstructorCall {
val constructor = annotationClass.constructors.single() val constructor = annotationClass.constructors.single()
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
@@ -401,7 +402,7 @@ private class InlineClassTransformer(private val context: Context) : IrBuildingT
startOffset, startOffset,
endOffset, endOffset,
IrDeclarationOrigin.DEFINED, IrDeclarationOrigin.DEFINED,
descriptor, IrPropertySymbolImpl(descriptor),
irField.name, irField.name,
irField.visibility, irField.visibility,
Modality.FINAL, Modality.FINAL,
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.konan.ir.*
import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.backend.konan.llvm.*
import org.jetbrains.kotlin.backend.konan.llvm.KonanMangler.functionName import org.jetbrains.kotlin.backend.konan.llvm.KonanMangler.functionName
import org.jetbrains.kotlin.backend.konan.llvm.KonanMangler.symbolName import org.jetbrains.kotlin.backend.konan.llvm.KonanMangler.symbolName
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_BRIDGE_METHOD
import org.jetbrains.kotlin.backend.konan.lower.bridgeTarget import org.jetbrains.kotlin.backend.konan.lower.bridgeTarget
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
@@ -646,7 +647,8 @@ internal object DataFlowIR {
} }
private val IrFunction.isSpecial get() = private val IrFunction.isSpecial get() =
name.asString().let { it.startsWith("<bridge-") || it.endsWith("-box>") || it.endsWith("-unbox>") } origin == DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION
|| origin is DECLARATION_ORIGIN_BRIDGE_METHOD
private fun mapPropertyInitializer(irField: IrField): FunctionSymbol { private fun mapPropertyInitializer(irField: IrField): FunctionSymbol {
functionMap[irField]?.let { return it } functionMap[irField]?.let { return it }
@@ -1047,10 +1047,8 @@ internal object Devirtualization {
} }
} }
private val specialNames = listOf("-box>", "-unbox>") private fun IrExpression.isBoxOrUnboxCall() =
(this is IrCall && symbol.owner.origin == DECLARATION_ORIGIN_INLINE_CLASS_SPECIAL_FUNCTION)
// TODO: do it more reliably.
private fun IrExpression.isBoxOrUnboxCall() = (this is IrCall && symbol.owner.name.asString().let { name -> specialNames.any { name.endsWith(it) } })
private fun devirtualize(irModule: IrModuleFragment, context: Context, externalModulesDFG: ExternalModulesDFG, private fun devirtualize(irModule: IrModuleFragment, context: Context, externalModulesDFG: ExternalModulesDFG,
devirtualizedCallSites: Map<IrCall, DevirtualizedCallSite>) { devirtualizedCallSites: Map<IrCall, DevirtualizedCallSite>) {
+7
View File
@@ -2357,9 +2357,16 @@ standaloneTest("args0") {
standaloneTest("devirtualization_lateinitInterface") { standaloneTest("devirtualization_lateinitInterface") {
goldValue = "42\n" goldValue = "42\n"
flags = ["-opt"]
source = "codegen/devirtualization/lateinitInterface.kt" source = "codegen/devirtualization/lateinitInterface.kt"
} }
standaloneTest("devirtualization_getter_looking_as_box_function") {
goldValue = "box\n"
flags = ["-opt"]
source = "codegen/devirtualization/getter_looking_as_box_function.kt"
}
standaloneTest("multiargs") { standaloneTest("multiargs") {
arguments = ["AAA", "BB", "C"] arguments = ["AAA", "BB", "C"]
multiRuns = true multiRuns = true
@@ -0,0 +1,5 @@
class Foo(val box: String = "box")
fun main() {
println(Foo().box)
}