backend: improve typealias support:
* handle TypeAliasConstructorDescriptor in codegen * ignore ignore typealias declaration in codegen Also add test 'typealias1'.
This commit is contained in:
committed by
SvyatoslavScherbina
parent
65444ec690
commit
0958d32605
+4
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.konan.descriptors.vtableSize
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
||||||
@@ -102,6 +103,9 @@ internal interface ContextUtils {
|
|||||||
val FunctionDescriptor.llvmFunction: LLVMValueRef
|
val FunctionDescriptor.llvmFunction: LLVMValueRef
|
||||||
get() {
|
get() {
|
||||||
assert (this.kind.isReal)
|
assert (this.kind.isReal)
|
||||||
|
if (this is TypeAliasConstructorDescriptor) {
|
||||||
|
return this.underlyingConstructorDescriptor.llvmFunction
|
||||||
|
}
|
||||||
val globalName = this.symbolName
|
val globalName = this.symbolName
|
||||||
val module = context.llvmModule
|
val module = context.llvmModule
|
||||||
|
|
||||||
|
|||||||
+10
-4
@@ -587,6 +587,12 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
|
|
||||||
//-------------------------------------------------------------------------//
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
|
override fun visitTypeAlias(declaration: IrTypeAlias) {
|
||||||
|
// Nothing to do.
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------//
|
||||||
|
|
||||||
override fun visitProperty(declaration: IrProperty) {
|
override fun visitProperty(declaration: IrProperty) {
|
||||||
declaration.acceptChildrenVoid(this)
|
declaration.acceptChildrenVoid(this)
|
||||||
}
|
}
|
||||||
@@ -1663,7 +1669,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
|
|
||||||
when (descriptor) {
|
when (descriptor) {
|
||||||
is IrBuiltinOperatorDescriptorBase -> return evaluateOperatorCall (callee, args)
|
is IrBuiltinOperatorDescriptorBase -> return evaluateOperatorCall (callee, args)
|
||||||
is ClassConstructorDescriptor -> return evaluateConstructorCall (callee, args)
|
is ConstructorDescriptor -> return evaluateConstructorCall (callee, args)
|
||||||
else -> return evaluateSimpleFunctionCall(descriptor, args)
|
else -> return evaluateSimpleFunctionCall(descriptor, args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1728,10 +1734,10 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
private fun evaluateConstructorCall(callee: IrCall, args: List<LLVMValueRef>): LLVMValueRef {
|
private fun evaluateConstructorCall(callee: IrCall, args: List<LLVMValueRef>): LLVMValueRef {
|
||||||
context.log("evaluateConstructorCall : ${ir2string(callee)}")
|
context.log("evaluateConstructorCall : ${ir2string(callee)}")
|
||||||
memScoped {
|
memScoped {
|
||||||
val containingClass = (callee.descriptor as ClassConstructorDescriptor).containingDeclaration
|
val constructedClass = (callee.descriptor as ConstructorDescriptor).constructedClass
|
||||||
val typeInfo = codegen.typeInfoValue(containingClass)
|
val typeInfo = codegen.typeInfoValue(constructedClass)
|
||||||
val allocHint = Int32(1).llvm
|
val allocHint = Int32(1).llvm
|
||||||
val thisValue = if (containingClass.isArray) {
|
val thisValue = if (constructedClass.isArray) {
|
||||||
assert(args.size >= 1 && args[0].type == int32Type)
|
assert(args.size >= 1 && args[0].type == int32Type)
|
||||||
val allocArrayInstanceArgs = listOf(typeInfo, allocHint, args[0])
|
val allocArrayInstanceArgs = listOf(typeInfo, allocHint, args[0])
|
||||||
call(context.llvm.allocArrayFunction, allocArrayInstanceArgs)
|
call(context.llvm.allocArrayFunction, allocArrayInstanceArgs)
|
||||||
|
|||||||
@@ -143,6 +143,11 @@ task safe_cast(type: RunKonanTest) {
|
|||||||
source = "codegen/basics/safe_cast.kt"
|
source = "codegen/basics/safe_cast.kt"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
task typealias1(type: RunKonanTest) {
|
||||||
|
goldValue = "42\n"
|
||||||
|
source = "codegen/basics/typealias1.kt"
|
||||||
|
}
|
||||||
|
|
||||||
task aritmetic(type: RunKonanTest) {
|
task aritmetic(type: RunKonanTest) {
|
||||||
source = "codegen/function/arithmetic.kt"
|
source = "codegen/function/arithmetic.kt"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fun main(args: Array<String>) {
|
||||||
|
println(Bar(42).x)
|
||||||
|
}
|
||||||
|
|
||||||
|
class Foo(val x: Int)
|
||||||
|
typealias Bar = Foo
|
||||||
Reference in New Issue
Block a user