From 14770a4485d4c19d53bb6277e9d07aefddf5e7b4 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Tue, 16 Aug 2016 10:52:18 +0300 Subject: [PATCH] translator: fix function extensions double argument --- .../kotlinnative/translator/BlockCodegen.kt | 10 +++--- .../function_extensions_double_argument_1.txt | 1 + .../function_extensions_double_argument_1.kt | 31 +++++++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 translator/src/test/kotlin/tests/input/function_extensions_double_argument_1.txt create mode 100644 translator/src/test/kotlin/tests/kotlin/function_extensions_double_argument_1.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 8c48a3b229d..378de964773 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -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) diff --git a/translator/src/test/kotlin/tests/input/function_extensions_double_argument_1.txt b/translator/src/test/kotlin/tests/input/function_extensions_double_argument_1.txt new file mode 100644 index 00000000000..9707169f1ff --- /dev/null +++ b/translator/src/test/kotlin/tests/input/function_extensions_double_argument_1.txt @@ -0,0 +1 @@ +function_extensions_double_argument_1() == 129 diff --git a/translator/src/test/kotlin/tests/kotlin/function_extensions_double_argument_1.kt b/translator/src/test/kotlin/tests/kotlin/function_extensions_double_argument_1.kt new file mode 100644 index 00000000000..1e752421e68 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/function_extensions_double_argument_1.kt @@ -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) +}