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