JVM IR: Improve codegen for try/catch statements
This commit is contained in:
committed by
Dmitry Petrov
parent
af74fd047a
commit
b1b70e503c
+2
-2
@@ -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()
|
||||||
|
|||||||
-1
@@ -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
|
||||||
|
|||||||
+5
-1
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user