[cfe] AbortStatus in statement executor for constants.

Change-Id: I96d5a7bc7aed69898e2c8bf048aeadf3b02387c6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/191100
Reviewed-by: Jake Macdonald <jakemac@google.com>
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
This commit is contained in:
Kallen Tu 2021-03-16 15:56:51 +00:00 committed by commit-bot@chromium.org
parent 3f5384bd08
commit 00b6a815d9

View file

@ -1009,6 +1009,8 @@ class ConstantEvaluator implements ExpressionVisitor<Constant> {
ExecutionStatus status = statement.accept(statementEvaluator);
if (status is ReturnStatus) {
return status.value;
} else if (status is AbortStatus) {
return status.error;
}
return createInvalidExpressionConstant(statement,
'No valid constant returned from the execution of $statement.');
@ -3342,7 +3344,7 @@ class StatementConstantEvaluator extends StatementVisitor<ExecutionStatus> {
@override
ExecutionStatus visitIfStatement(IfStatement node) {
Constant condition = evaluate(node.condition);
if (condition is AbortConstant) return new ReturnStatus(condition);
if (condition is AbortConstant) return new AbortStatus(condition);
if (condition is BoolConstant) {
if (condition.value) {
return node.then.accept(this);
@ -3352,7 +3354,7 @@ class StatementConstantEvaluator extends StatementVisitor<ExecutionStatus> {
return const ProceedStatus();
}
} else {
return new ReturnStatus(exprEvaluator.createErrorConstant(
return new AbortStatus(exprEvaluator.createErrorConstant(
node.condition,
templateConstEvalInvalidType.withArguments(
condition,
@ -3365,7 +3367,7 @@ class StatementConstantEvaluator extends StatementVisitor<ExecutionStatus> {
@override
ExecutionStatus visitExpressionStatement(ExpressionStatement node) {
Constant value = evaluate(node.expression);
if (value is AbortConstant) return new ReturnStatus(value);
if (value is AbortConstant) return new AbortStatus(value);
return const ProceedStatus();
}
@ -3376,7 +3378,7 @@ class StatementConstantEvaluator extends StatementVisitor<ExecutionStatus> {
@override
ExecutionStatus visitVariableDeclaration(VariableDeclaration node) {
Constant value = evaluate(node.initializer);
if (value is AbortConstant) return new ReturnStatus(value);
if (value is AbortConstant) return new AbortStatus(value);
exprEvaluator.env.addVariableValue(node, value);
return const ProceedStatus();
}
@ -3549,6 +3551,12 @@ class ReturnStatus extends ExecutionStatus {
ReturnStatus(this.value);
}
/// Status with an exception or error that the statement has thrown.
class AbortStatus extends ExecutionStatus {
final AbortConstant error;
AbortStatus(this.error);
}
/// An intermediate result that is used within the [ConstantEvaluator].
class IntermediateValue implements Constant {
dynamic value;