Implement interpretation of assert method
This commit is contained in:
committed by
TeamCityServer
parent
8617809528
commit
38f4e6e8bf
+1
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
+21
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user