Add new jvm compilation key ignoreConstOptimizationErrors

This key suppose to be a workaround in keys if something goes
wrong in ir interpreter.
This commit is contained in:
Ivan Kylchik
2022-08-18 15:44:31 +03:00
committed by Space
parent 44af612775
commit 3027ea9551
6 changed files with 23 additions and 3 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm.lower
import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.IrErrorExpression
@@ -40,7 +41,10 @@ class ConstEvaluationLowering(val context: JvmBackendContext) : FileLoweringPass
.report(JvmBackendErrors.EXCEPTION_IN_CONST_EXPRESSION, warning.description)
}
val transformer = IrConstTransformer(interpreter, irFile, mode = EvaluationMode.ONLY_INTRINSIC_CONST, ::onWarning, ::onError)
val suppressErrors = context.configuration.getBoolean(JVMConfigurationKeys.IGNORE_CONST_OPTIMIZATION_ERRORS)
val transformer = IrConstTransformer(
interpreter, irFile, mode = EvaluationMode.ONLY_INTRINSIC_CONST, ::onWarning, ::onError, suppressErrors
)
irFile.transformChildren(transformer, null)
}
}
@@ -7,12 +7,14 @@ package org.jetbrains.kotlin.ir.interpreter.checker
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrVarargImpl
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
import org.jetbrains.kotlin.ir.interpreter.isPrimitiveArray
@@ -26,7 +28,8 @@ class IrConstTransformer(
private val irFile: IrFile,
private val mode: EvaluationMode,
private val onWarning: (IrElement, IrErrorExpression) -> Unit = { _, _ -> },
private val onError: (IrElement, IrErrorExpression) -> Unit = { _, _ -> }
private val onError: (IrElement, IrErrorExpression) -> Unit = { _, _ -> },
private val suppressExceptions: Boolean = false,
) : IrElementTransformerVoid() {
private fun IrExpression.warningIfError(original: IrExpression): IrExpression {
if (this is IrErrorExpression) {
@@ -52,7 +55,8 @@ class IrConstTransformer(
val result = try {
interpreter.interpret(this, irFile)
} catch (e: Throwable) {
throw AssertionError("Error occurred while optimizing an expression:\n${this.dump()}", e)
if (!suppressExceptions) throw AssertionError("Error occurred while optimizing an expression:\n${this.dump()}", e)
return IrErrorExpressionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, this.type, e.message.toString()).warningIfError(this)
}
return if (failAsError) result.reportIfError(this) else result.warningIfError(this)