From e869e405969540a2526d8b13409bc49b91f6adc0 Mon Sep 17 00:00:00 2001 From: SvyatoslavScherbina Date: Mon, 12 Aug 2019 14:02:39 +0300 Subject: [PATCH] Fix memory leak in CBridgeGen (#3243) Affecting String and CValuesRef conversions when calling variadic C functions --- .../backend/konan/cgen/CBridgeGenUtils.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGenUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGenUtils.kt index a3eb119828f..e5845dd73b5 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGenUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGenUtils.kt @@ -159,7 +159,7 @@ internal class KotlinCBridgeBuilder( internal class KotlinCallBuilder(private val irBuilder: IrBuilderWithScope, private val symbols: KonanSymbols) { val prepare = mutableListOf() val arguments = mutableListOf() - val cleanup = mutableListOf() + val cleanup = mutableListOf IrStatement>() private var memScope: IrVariable? = null @@ -172,8 +172,10 @@ internal class KotlinCallBuilder(private val irBuilder: IrBuilderWithScope, priv prepare += newMemScope val clearImpl = symbols.interopMemScope.owner.simpleFunctions().single { it.name.asString() == "clearImpl" } - cleanup += irCall(clearImpl).apply { - dispatchReceiver = irGet(memScope!!) + cleanup += { + irCall(clearImpl).apply { + dispatchReceiver = irGet(memScope!!) + } } irGet(newMemScope) @@ -207,15 +209,18 @@ internal class KotlinCallBuilder(private val irBuilder: IrBuilderWithScope, priv +kotlinCall } else { // Note: generating try-catch as finally blocks are already lowered. - +IrTryImpl(startOffset, endOffset, kotlinCall.type).apply { + val result = irTemporary(IrTryImpl(startOffset, endOffset, kotlinCall.type).apply { tryResult = kotlinCall catches += irCatch(context.irBuiltIns.throwableType).apply { result = irBlock(kotlinCall) { - cleanup.forEach { +it } + cleanup.forEach { +it() } +irThrow(irGet(catchParameter)) } } - } + }) + // TODO: consider handling a cleanup failure properly. + cleanup.forEach { +it() } + +irGet(result) } } }