From b577c05eaa0e3a199d1bc118ba4bfb40fc686ed1 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Thu, 22 Feb 2018 19:13:02 +0300 Subject: [PATCH] DFG: Added return type to function declaration --- .../kotlin/backend/konan/optimizations/DFGBuilder.kt | 2 ++ .../kotlin/backend/konan/optimizations/DFGSerializer.kt | 7 +++++-- .../kotlin/backend/konan/optimizations/DataFlowIR.kt | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt index 97a4bed51bd..0912e4e0245 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGBuilder.kt @@ -483,9 +483,11 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag val parameterTypes = (allParameters.map { it.type } + (if (descriptor.isSuspend) listOf(continuationType) else emptyList())) .map { symbolTable.mapClass(choosePrimary(it.erasure())) } .toTypedArray() + val returnType = if (descriptor.isSuspend) context.builtIns.anyType else (descriptor.returnType ?: context.builtIns.unitType) return DataFlowIR.Function( symbol = symbolTable.mapFunction(descriptor), parameterTypes = parameterTypes, + returnType = symbolTable.mapType(returnType), body = DataFlowIR.FunctionBody(allNodes.distinct().toList(), returnsNode, throwsNode) ) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGSerializer.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGSerializer.kt index 90c85eec090..3f9853c1a09 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGSerializer.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DFGSerializer.kt @@ -665,13 +665,14 @@ internal object DFGSerializer { } } - class Function(val symbol: Int, val parameterTypes: IntArray, val body: FunctionBody) { + class Function(val symbol: Int, val parameterTypes: IntArray, val returnType: Int, val body: FunctionBody) { - constructor(data: ArraySlice) : this(data.readInt(), data.readIntArray(), FunctionBody(data)) + constructor(data: ArraySlice) : this(data.readInt(), data.readIntArray(), data.readInt(), FunctionBody(data)) fun write(result: ArraySlice) { result.writeInt(symbol) result.writeIntArray(parameterTypes) + result.writeInt(returnType) body.write(result) } } @@ -820,6 +821,7 @@ internal object DFGSerializer { Function( functionSymbolMap[function.symbol]!!, function.parameterTypes.map { typeMap[it]!! }.toIntArray(), + typeMap[function.returnType]!!, FunctionBody(nodes, nodeMap[body.returns]!!, nodeMap[body.throws]!!) ) } @@ -1115,6 +1117,7 @@ internal object DFGSerializer { val function = DataFlowIR.Function( symbol = symbol, parameterTypes = it.parameterTypes.map { types[it] }.toTypedArray(), + returnType = types[it.returnType], body = deserializeBody(it.body) ) functions.put(symbol, function) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt index b3330447def..ae3f385aab8 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/DataFlowIR.kt @@ -245,6 +245,7 @@ internal object DataFlowIR { class Function(val symbol: FunctionSymbol, val parameterTypes: Array, + val returnType: Type, val body: FunctionBody) { fun debugOutput() {