visitForRangeStmt method
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();
}