mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 02:42:05 +00:00
[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:
parent
3f5384bd08
commit
00b6a815d9
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue