backend: improve typealias support:

* handle TypeAliasConstructorDescriptor in codegen
* ignore ignore typealias declaration in codegen

Also add test 'typealias1'.
This commit is contained in:
Svyatoslav Scherbina
2017-01-13 16:57:04 +07:00
committed by SvyatoslavScherbina
parent 65444ec690
commit 0958d32605
4 changed files with 25 additions and 4 deletions
@@ -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
@@ -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)
+5
View File
@@ -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