Implement interpretation of assert method

This commit is contained in:
Ivan Kylchik
2021-03-01 22:21:57 +03:00
committed by TeamCityServer
parent 8617809528
commit 38f4e6e8bf
2 changed files with 22 additions and 0 deletions
@@ -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")
}
}
@@ -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
}
}