From 38f4e6e8bf3f2623e626b01bc3720e052a556789 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Mon, 1 Mar 2021 22:21:57 +0300 Subject: [PATCH] Implement interpretation of assert method --- .../intrinsics/IntrinsicEvaluator.kt | 1 + .../intrinsics/IntrinsicImplementations.kt | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicEvaluator.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicEvaluator.kt index a5ae369c3ba..002a674970d 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicEvaluator.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicEvaluator.kt @@ -23,6 +23,7 @@ internal class IntrinsicEvaluator { JsPrimitives.equalTo(irFunction) -> JsPrimitives.evaluate(irFunction, stack, interpret) ArrayConstructor.equalTo(irFunction) -> ArrayConstructor.evaluate(irFunction, stack, interpret) SourceLocation.equalTo(irFunction) -> SourceLocation.evaluate(irFunction, stack, interpret) + AssertIntrinsic.equalTo(irFunction) -> AssertIntrinsic.evaluate(irFunction, stack, interpret) else -> throw InterpreterMethodNotFoundError("Method ${irFunction.name} hasn't implemented") } } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicImplementations.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicImplementations.kt index 0d11c9b6a30..e9f1c14d0cf 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicImplementations.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/intrinsics/IntrinsicImplementations.kt @@ -205,4 +205,25 @@ internal object SourceLocation : IntrinsicBase() { stack.pushReturnValue(stack.getCurrentStackInfo().toState(irFunction.returnType)) return Next } +} + +internal object AssertIntrinsic : IntrinsicBase() { + override fun equalTo(irFunction: IrFunction): Boolean { + val fqName = irFunction.fqNameWhenAvailable.toString() + return fqName == "kotlin.PreconditionsKt.assert" + } + + override fun evaluate(irFunction: IrFunction, stack: Stack, interpret: IrElement.() -> ExecutionResult): ExecutionResult { + val value = stack.getVariable(irFunction.valueParameters.first().symbol).state.asBoolean() + when (irFunction.valueParameters.size) { + 1 -> if (!value) AssertionError("Assertion failed").throwAsUserException() + 2 -> if (!value) { + val messageLambda = stack.getVariable(irFunction.valueParameters.last().symbol).state as KFunctionState + stack.newFrame(asSubFrame = true) { messageLambda.irFunction.body!!.interpret() } + .check(ReturnLabel.RETURN) { return it } + AssertionError(stack.popReturnValue().asString()).throwAsUserException() + } + } + return Next + } } \ No newline at end of file