diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt index 2d15f4993bd..b2f2134b30d 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/StateMachineBuilder.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower.coroutines import org.jetbrains.kotlin.backend.common.ir.isElseBranch +import org.jetbrains.kotlin.backend.common.ir.isPure import org.jetbrains.kotlin.backend.common.ir.isSuspend import org.jetbrains.kotlin.backend.common.peek import org.jetbrains.kotlin.backend.common.pop @@ -15,7 +16,6 @@ import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder -import org.jetbrains.kotlin.backend.common.ir.isPure import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* @@ -488,6 +488,44 @@ class StateMachineBuilder( transformLastExpression { expression.apply { argument = it } } } + override fun visitVararg(expression: IrVararg) { + if (expression !in suspendableNodes) return addStatement(expression) + val spreadIndices = mutableSetOf() + val arguments: Array = expression.elements + .mapIndexed { index, item -> + if (item is IrSpreadElement) { + spreadIndices.add(index) + item.expression + } else { + item as IrExpression + } + } + .toTypedArray() + val newArgs = transformArguments(arguments) + .mapIndexed { index, item -> + requireNotNull(item) + if (index in spreadIndices) { + IrSpreadElementImpl( + item.startOffset, + item.endOffset, + item + ) + } else { + item + } + } + .toList() + addStatement( + IrVarargImpl( + expression.startOffset, + expression.endOffset, + expression.type, + expression.varargElementType, + newArgs + ) + ) + } + private fun transformArguments(arguments: Array): Array { var suspendableCount = arguments.fold(0) { r, n -> if (n != null && n in suspendableNodes) r + 1 else r }