visitForRangeStmt method

  1. @override
Uint8List visitForRangeStmt(
  1. ForRangeExpr stmt
)
override

Implementation

@override
Uint8List visitForRangeStmt(ForRangeExpr stmt) {
  final bytesBuilder = BytesBuilder();
  final lowered = _compilation.forRangeLoop(stmt)!;
  bytesBuilder.add(_lineInfo(stmt.line, stmt.column));
  if (_currentFunctionOptimization == null) {
    bytesBuilder.addByte(OpCode.codeBlock);
    bytesBuilder.add(_identifier(InternalIdentifier.forExpressionInit));
  }
  bytesBuilder.add(visitVarDecl(lowered.iterator));
  final condition = compileAST(lowered.condition);
  final loop = visitBlockStmt(lowered.loop);

  bytesBuilder.addByte(OpCode.loopPoint);
  final continueLength = condition.length + 1 + loop.length;
  final loopLength = condition.length + 1 + loop.length + 3;
  bytesBuilder.add(_uint16(continueLength));
  bytesBuilder.add(_uint16(loopLength));
  bytesBuilder.add(condition);
  bytesBuilder.addByte(OpCode.whileStmt);
  bytesBuilder.add(loop);
  bytesBuilder.addByte(OpCode.skip);
  bytesBuilder.add(_int16(-loopLength));
  if (_currentFunctionOptimization == null) {
    bytesBuilder.addByte(OpCode.endOfCodeBlock);
  }
  return bytesBuilder.toBytes();
}