IrInterpret: remove thread creation / joining (performance fix)

This commit is contained in:
Mikhail Glukhikh
2021-02-24 16:03:32 +03:00
parent df62b5e311
commit a9b9cced15
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import java.lang.invoke.MethodHandle import java.lang.invoke.MethodHandle
import kotlin.concurrent.thread
private const val MAX_COMMANDS = 500_000 private const val MAX_COMMANDS = 500_000
@@ -75,23 +74,19 @@ class IrInterpreter(private val irBuiltIns: IrBuiltIns, private val bodyMap: Map
fun interpret(expression: IrExpression): IrExpression { fun interpret(expression: IrExpression): IrExpression {
stack.clean() stack.clean()
lateinit var result: IrExpression return try {
thread(start = true) { when (val returnLabel = expression.interpret().returnLabel) {
result = try { ReturnLabel.REGULAR -> stack.popReturnValue().toIrExpression(expression)
when (val returnLabel = expression.interpret().returnLabel) { ReturnLabel.EXCEPTION -> {
ReturnLabel.REGULAR -> stack.popReturnValue().toIrExpression(expression) val message = (stack.popReturnValue() as ExceptionState).getFullDescription()
ReturnLabel.EXCEPTION -> { IrErrorExpressionImpl(expression.startOffset, expression.endOffset, expression.type, "\n" + message)
val message = (stack.popReturnValue() as ExceptionState).getFullDescription()
IrErrorExpressionImpl(expression.startOffset, expression.endOffset, expression.type, "\n" + message)
}
else -> TODO("$returnLabel not supported as result of interpretation")
} }
} catch (e: InterpreterException) { else -> TODO("$returnLabel not supported as result of interpretation")
// TODO don't handle, throw to lowering
IrErrorExpressionImpl(expression.startOffset, expression.endOffset, expression.type, "\n" + e.message)
} }
}.join() } catch (e: InterpreterException) {
return result // TODO don't handle, throw to lowering
IrErrorExpressionImpl(expression.startOffset, expression.endOffset, expression.type, "\n" + e.message)
}
} }
private fun IrElement.interpret(): ExecutionResult { private fun IrElement.interpret(): ExecutionResult {