Fix memory leak in CBridgeGen (#3243)
Affecting String and CValuesRef conversions when calling variadic C functions
This commit is contained in:
committed by
GitHub
parent
65e6f85dc1
commit
e869e40596
+11
-6
@@ -159,7 +159,7 @@ internal class KotlinCBridgeBuilder(
|
||||
internal class KotlinCallBuilder(private val irBuilder: IrBuilderWithScope, private val symbols: KonanSymbols) {
|
||||
val prepare = mutableListOf<IrStatement>()
|
||||
val arguments = mutableListOf<IrExpression>()
|
||||
val cleanup = mutableListOf<IrStatement>()
|
||||
val cleanup = mutableListOf<IrBuilderWithScope.() -> 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user