visitForStmt method

  1. @override
Uint8List visitForStmt(
  1. ForExpr stmt
)
override

Implementation

@override
Uint8List visitForStmt(ForExpr stmt) {
  final bytesBuilder = BytesBuilder();
  final lowered = _compilation.forLoop(stmt)!;
  bytesBuilder.add(_lineInfo(stmt.line, stmt.column));
  if (_currentFunctionOptimization == null) {
    bytesBuilder.addByte(OpCode.codeBlock);
    bytesBuilder.add(_identifier(InternalIdentifier.forExpressionInit));
  }
  _markedSymbolsList.add(lowered.markedSymbols);
  try {
    final initializer = lowered.initializer;
    if (initializer != null) {
      bytesBuilder.add(visitVarDecl(initializer));
    }
    final condition = compileAST(lowered.condition);
    final increment =
        lowered.increment == null ? null : compileAST(lowered.increment!);
    final loop = visitBlockStmt(lowered.loop);
    final continueLength = condition.length + loop.length + 1;
    final breakLength = continueLength + (increment?.length ?? 0) + 3;
    bytesBuilder.addByte(OpCode.loopPoint);
    bytesBuilder.add(_uint16(continueLength));
    bytesBuilder.add(_uint16(breakLength));
    bytesBuilder.add(condition);
    bytesBuilder.addByte(OpCode.whileStmt);
    bytesBuilder.add(loop);
    if (increment != null) {
      bytesBuilder.add(increment);
    }
    bytesBuilder.addByte(OpCode.skip);
    bytesBuilder.add(_int16(-breakLength));
  } finally {
    _markedSymbolsList.removeLast();
  }
  if (_currentFunctionOptimization == null) {
    bytesBuilder.addByte(OpCode.endOfCodeBlock);
  }
  return bytesBuilder.toBytes();
}