translator: fix function extensions double argument

This commit is contained in:
Alexey Stepanov
2016-08-16 10:52:18 +03:00
parent 1f4e3d7205
commit 14770a4485
3 changed files with 37 additions and 5 deletions
@@ -204,7 +204,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
val isExtension = selectorExpr is KtCallExpression && selectorExpr.getFunctionResolvedCallWithAssert(state.bindingContext).extensionReceiver != null
if (isExtension) {
return evaluateExtensionExpression(receiverExpr, selectorExpr as KtCallExpression, scopeDepth)
return evaluateExtensionExpression(receiverExpr, receiver, selectorExpr as KtCallExpression, scopeDepth)
}
if (receiver != null) {
@@ -213,15 +213,15 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
}
when (receiver.type) {
is LLVMReferenceType -> return evaluateMemberMethodOrField(receiver, selectorExpr.text, scopeDepth, selectorExpr)
else -> return evaluateExtensionExpression(receiverExpr, selectorExpr as KtCallExpression, scopeDepth)
else -> return evaluateExtensionExpression(receiverExpr, receiver, selectorExpr as KtCallExpression, scopeDepth)
}
}
val clazz = resolveCodegen(receiverExpr) ?: return evaluateExtensionExpression(receiverExpr, selectorExpr as KtCallExpression, scopeDepth)
val clazz = resolveCodegen(receiverExpr) ?: return evaluateExtensionExpression(receiverExpr, receiver, selectorExpr as KtCallExpression, scopeDepth)
return evaluateClassScopedDotExpression(clazz, selectorExpr, scopeDepth, receiver)
}
private fun evaluateExtensionExpression(receiver: KtExpression, selector: KtCallExpression, scopeDepth: Int): LLVMSingleValue? {
private fun evaluateExtensionExpression(receiver: KtExpression, receiverExpressionArgument: LLVMVariable?, selector: KtCallExpression, scopeDepth: Int): LLVMSingleValue? {
val receiverType = state.bindingContext.get(BindingContext.EXPRESSION_TYPE_INFO, receiver)
val standardType = LLVMMapStandardType(receiverType!!.type!!, state)
@@ -229,7 +229,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
val names = parseArgList(selector, scopeDepth)
val type = if (names.size > 0) "_${names.joinToString(separator = "_", transform = { it.type!!.mangle() })}" else ""
val extensionCodegen = state.extensionFunctions[standardType.toString()]?.get("$function$type") ?: throw UnexpectedException("$standardType:$function$type")
val receiverExpression = evaluateExpression(receiver, scopeDepth + 1)!!
val receiverExpression = receiverExpressionArgument ?: evaluateExpression(receiver, scopeDepth + 1)!!
val typeThisArgument = when (standardType) {
is LLVMReferenceType -> LLVMVariable("type", standardType, pointer = 1)
@@ -0,0 +1 @@
function_extensions_double_argument_1() == 129
@@ -0,0 +1,31 @@
class function_extensions_double_argument_1_slave(val buffer: IntArray) {
var pos = 0
fun read(): Int {
pos += 1
val pe = pos - 1
return buffer[pe]
}
fun isAtEnd(): Boolean {
return pos >= buffer.size
}
}
fun function_extensions_double_argument_1_master(inputStream: function_extensions_double_argument_1_slave): Int {
return inputStream.read().toInt()
}
fun function_extensions_double_argument_1(): Int {
val array = IntArray(7)
array[0] = 129
array[1] = 20
array[2] = 333
array[3] = 444
array[4] = 555
array[5] = 666
array[6] = 777
val kis = function_extensions_double_argument_1_slave(array)
return function_extensions_double_argument_1_master(kis)
}