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.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrField
|
||||
import org.jetbrains.kotlin.ir.declarations.IrProperty
|
||||
@@ -102,6 +103,9 @@ internal interface ContextUtils {
|
||||
val FunctionDescriptor.llvmFunction: LLVMValueRef
|
||||
get() {
|
||||
assert (this.kind.isReal)
|
||||
if (this is TypeAliasConstructorDescriptor) {
|
||||
return this.underlyingConstructorDescriptor.llvmFunction
|
||||
}
|
||||
val globalName = this.symbolName
|
||||
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) {
|
||||
declaration.acceptChildrenVoid(this)
|
||||
}
|
||||
@@ -1663,7 +1669,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
||||
|
||||
when (descriptor) {
|
||||
is IrBuiltinOperatorDescriptorBase -> return evaluateOperatorCall (callee, args)
|
||||
is ClassConstructorDescriptor -> return evaluateConstructorCall (callee, args)
|
||||
is ConstructorDescriptor -> return evaluateConstructorCall (callee, 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 {
|
||||
context.log("evaluateConstructorCall : ${ir2string(callee)}")
|
||||
memScoped {
|
||||
val containingClass = (callee.descriptor as ClassConstructorDescriptor).containingDeclaration
|
||||
val typeInfo = codegen.typeInfoValue(containingClass)
|
||||
val constructedClass = (callee.descriptor as ConstructorDescriptor).constructedClass
|
||||
val typeInfo = codegen.typeInfoValue(constructedClass)
|
||||
val allocHint = Int32(1).llvm
|
||||
val thisValue = if (containingClass.isArray) {
|
||||
val thisValue = if (constructedClass.isArray) {
|
||||
assert(args.size >= 1 && args[0].type == int32Type)
|
||||
val allocArrayInstanceArgs = listOf(typeInfo, allocHint, args[0])
|
||||
call(context.llvm.allocArrayFunction, allocArrayInstanceArgs)
|
||||
|
||||
@@ -143,6 +143,11 @@ task safe_cast(type: RunKonanTest) {
|
||||
source = "codegen/basics/safe_cast.kt"
|
||||
}
|
||||
|
||||
task typealias1(type: RunKonanTest) {
|
||||
goldValue = "42\n"
|
||||
source = "codegen/basics/typealias1.kt"
|
||||
}
|
||||
|
||||
task aritmetic(type: RunKonanTest) {
|
||||
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