JVM IR: Improve codegen for try/catch statements

This commit is contained in:
Steven Schäfer
2019-10-24 14:34:07 +02:00
committed by Dmitry Petrov
parent af74fd047a
commit b1b70e503c
4 changed files with 7 additions and 5 deletions
@@ -519,7 +519,7 @@ class ExpressionCodegen(
override fun visitSetVariable(expression: IrSetVariable, data: BlockInfo): PromisedValue { override fun visitSetVariable(expression: IrSetVariable, data: BlockInfo): PromisedValue {
expression.markLineNumber(startOffset = true) expression.markLineNumber(startOffset = true)
setVariable(expression.symbol, expression.value, data) setVariable(expression.symbol, expression.value, data)
return defaultValue(expression.type) return immaterialUnitValue
} }
fun setVariable(symbol: IrValueSymbol, value: IrExpression, data: BlockInfo) { fun setVariable(symbol: IrValueSymbol, value: IrExpression, data: BlockInfo) {
@@ -751,7 +751,7 @@ class ExpressionCodegen(
mv.nop() mv.nop()
val tryAsmType = aTry.asmType val tryAsmType = aTry.asmType
val tryResult = aTry.tryResult.accept(this, data) val tryResult = aTry.tryResult.accept(this, data)
val isExpression = true //TODO: more wise check is required val isExpression = !aTry.type.isUnit()
var savedValue: Int? = null var savedValue: Int? = null
if (isExpression) { if (isExpression) {
tryResult.coerce(tryAsmType, aTry.type).materialize() tryResult.coerce(tryAsmType, aTry.type).materialize()
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.backend.jvm.codegen package org.jetbrains.kotlin.backend.jvm.codegen
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
import org.jetbrains.kotlin.codegen.AsmUtil import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.ClassBuilderMode import org.jetbrains.kotlin.codegen.ClassBuilderMode
import org.jetbrains.kotlin.codegen.visitAnnotableParameterCount import org.jetbrains.kotlin.codegen.visitAnnotableParameterCount
@@ -1,3 +1,4 @@
// IGNORE_BACKEND: JVM_IR
// WITH_COROUTINES // WITH_COROUTINES
import helpers.* import helpers.*
@@ -41,6 +42,9 @@ fun box(): String {
// 1 LOCALVARIABLE i Ljava/lang/String; L.* 3 // 1 LOCALVARIABLE i Ljava/lang/String; L.* 3
// 1 LOCALVARIABLE s Ljava/lang/String; L.* 3 // 1 LOCALVARIABLE s Ljava/lang/String; L.* 3
// 1 PUTFIELD VarValueConflictsWithTableSameSortKt\$box\$1.L\$0 : Ljava/lang/Object; // 1 PUTFIELD VarValueConflictsWithTableSameSortKt\$box\$1.L\$0 : Ljava/lang/Object;
/* 1 load in try/finally */ /* 1 load in the catch (e: Throwable) { throw e } block which is implicitly wrapped around try/finally */
// 1 ALOAD 3\s+ATHROW
/* 1 load in result = s */ /* 1 load in result = s */
// 1 ALOAD 3\s+PUTFIELD kotlin/jvm/internal/Ref\$ObjectRef\.element
/* But no further load when spilling 's' to the continuation */
// 2 ALOAD 3 // 2 ALOAD 3
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun z() {} fun z() {}
fun foo() { fun foo() {