code generator fixes:

1. IR visitor does not stop children processing on IrClass entry.
2. method call (namely property getter).
This commit is contained in:
Konstantin Anisimov
2016-11-08 11:07:17 +03:00
parent 55f8257f92
commit 4a20e37c9f
@@ -203,6 +203,8 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
// do not generate any code for intrinsic classes as they require special handling // do not generate any code for intrinsic classes as they require special handling
return return
} }
super.visitClass(declaration)
} }
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//
@@ -322,10 +324,15 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
private fun evaluateGetField(value: IrGetField): LLVMOpaqueValue { private fun evaluateGetField(value: IrGetField): LLVMOpaqueValue {
logger.log("evaluateGetField : ${ir2string(value)}") logger.log("evaluateGetField : ${ir2string(value)}")
if (value.descriptor.dispatchReceiverParameter != null) { if (value.descriptor.dispatchReceiverParameter != null) {
val thisPtr = generator.load(generator.thisVariable(), generator.tmpVariable()) if (value.descriptor.getter != null) {
val typedPtr = generator.bitcast(pointerType(generator.classType(generator.currentClass!!)), thisPtr, generator.tmpVariable()) val tmpThis = generator.load(generator.thisVariable(), generator.tmpVariable())
val fieldPtr = LLVMBuildStructGEP(generator.context.llvmBuilder, typedPtr, generator.indexInClass(value.descriptor), generator.tmpVariable()) return evaluateSimpleFunctionCall(generator.tmpVariable(), value.descriptor.getter!!.original, mutableListOf(tmpThis))!!
return generator.load(fieldPtr!!, generator.tmpVariable()) } else {
val thisPtr = generator.load(generator.thisVariable(), generator.tmpVariable())
val typedPtr = generator.bitcast(pointerType(generator.classType(generator.currentClass!!)), thisPtr, generator.tmpVariable())
val fieldPtr = LLVMBuildStructGEP(generator.context.llvmBuilder, typedPtr, generator.indexInClass(value.descriptor), generator.tmpVariable())
return generator.load(fieldPtr!!, generator.tmpVariable())
}
} }
TODO() TODO()
} }
@@ -373,9 +380,9 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//
private fun evaluateSimpleFunctionCall(tmpVariableName: String, value: IrCall, args: MutableList<LLVMOpaqueValue?>): LLVMOpaqueValue? { private fun evaluateSimpleFunctionCall(tmpVariableName: String, descriptor: FunctionDescriptor, args: MutableList<LLVMOpaqueValue?>): LLVMOpaqueValue? {
logger.log("evaluateSimpleFunctionCall : $tmpVariableName = ${ir2string(value)}") //logger.log("evaluateSimpleFunctionCall : $tmpVariableName = ${ir2string(value)}")
return generator.call(value.descriptor as FunctionDescriptor, args, tmpVariableName) return generator.call(descriptor, args, tmpVariableName)
} }
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//
@@ -386,7 +393,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
descriptor.isOperator -> return evaluateOperatorCall(tmpVariableName, callee.origin!!, args) descriptor.isOperator -> return evaluateOperatorCall(tmpVariableName, callee.origin!!, args)
descriptor is IrBuiltinOperatorDescriptorBase -> return evaluateOperatorCall(tmpVariableName, callee.origin!!, args) descriptor is IrBuiltinOperatorDescriptorBase -> return evaluateOperatorCall(tmpVariableName, callee.origin!!, args)
descriptor is ClassConstructorDescriptor -> return evaluateConstructorCall(tmpVariableName, callee, args) descriptor is ClassConstructorDescriptor -> return evaluateConstructorCall(tmpVariableName, callee, args)
else -> return evaluateSimpleFunctionCall(tmpVariableName, callee, args) else -> return evaluateSimpleFunctionCall(tmpVariableName, descriptor, args)
} }
} }
@@ -401,7 +408,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
val constructorParams: MutableList<LLVMOpaqueValue?> = mutableListOf() val constructorParams: MutableList<LLVMOpaqueValue?> = mutableListOf()
constructorParams += thisValue constructorParams += thisValue
constructorParams += args constructorParams += args
return generator.call(callee.descriptor as FunctionDescriptor, constructorParams, variableName) return evaluateSimpleFunctionCall(variableName, callee.descriptor as FunctionDescriptor, constructorParams)
} }
} }