run method

  1. @override
FutureOr<ASTValue> run(
  1. VMContext parentContext,
  2. ASTRunStatus runStatus
)
override

Implementation

@override
FutureOr<ASTValue> run(
    VMContext parentContext, ASTRunStatus runStatus) async {
  var context = VMContext(parentContext.block, parent: parentContext);
  var runStatus = ASTRunStatus();

  var prevContext = VMContext.setCurrent(context);
  try {
    await initStatement.run(context, runStatus);

    while (true) {
      var cond = await conditionExpression.run(context, runStatus);

      if (cond is ASTValueBool) {
        if (!cond.value) break;
      } else {
        var condOK = await cond.getValue(context);

        if (condOK is bool) {
          if (!condOK) break;
        } else {
          throw ApolloVMRuntimeError(
              'Condition not returning a boolean: $condOK');
        }
      }

      var loopContext = VMContext(parentContext.block, parent: context);

      VMContext.setCurrent(loopContext);

      await loopBlock.run(loopContext, runStatus);

      VMContext.setCurrent(context);

      await continueExpression.run(context, runStatus);
    }
  } finally {
    VMContext.setCurrent(prevContext);
  }

  return ASTValueVoid.instance;
}