visitForRangeStmt method
Implementation
@override
Uint8List visitForRangeStmt(ForRangeExpr stmt) {
final bytesBuilder = BytesBuilder();
bytesBuilder.add(_lineInfo(stmt.line, stmt.column));
bytesBuilder.addByte(OpCode.codeBlock);
bytesBuilder.add(_identifier(InternalIdentifier.forExpressionInit));
final collection = stmt.iterateValue
? MemberExpr(
stmt.collection, IdentifierExpr(_lexicon.idValues, isLocal: false))
: stmt.collection;
// declare the iterator
final iterInit = MemberExpr(
collection, IdentifierExpr(_lexicon.idIterator, isLocal: false));
// final iterInitBytes = compileAST(iterInit, endOfExec: true);
final iterId = '__iter${iterIndex++}';
final iterDecl = VarDecl(
IdentifierExpr(iterId),
initializer: iterInit,
line: stmt.iterator.line,
column: stmt.iterator.column,
);
// final iterDecl = _assembleVarDeclStmt(
// iterId, stmt.iterator.line, stmt.iterator.column,
// initializer: iterInitBytes);
bytesBuilder.add(visitVarDecl(iterDecl));
// update iter move result
// calls iterator.moveNext()
final moveIter = CallExpr(MemberExpr(IdentifierExpr(iterId),
IdentifierExpr(_lexicon.idMoveNext, isLocal: false)));
final moveIterBytes = visitCallExpr(moveIter);
final condition = moveIterBytes;
// get current item value
stmt.iterator.initializer = MemberExpr(IdentifierExpr(iterId),
IdentifierExpr(_lexicon.idCurrent, isLocal: false));
stmt.loop.statements.insert(0, stmt.iterator);
final loop = visitBlockStmt(stmt.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));
bytesBuilder.addByte(OpCode.endOfCodeBlock);
return bytesBuilder.toBytes();
}