visitCallExpr method
Implementation
@override
Uint8List visitCallExpr(CallExpr expr) {
final bytesBuilder = BytesBuilder();
// Callee first
bytesBuilder.add(compileAST(expr.callee));
// Positional args — values push onto operand stack
for (final arg in expr.positionalArgs) {
bytesBuilder.add(compileAST(arg));
}
// Named args — values push onto operand stack
for (final arg in expr.namedArgs.values) {
bytesBuilder.add(compileAST(arg));
}
// Terminal call opcode
bytesBuilder.addByte(OpCode.call);
int flags = 0;
if (expr.isNullable) flags |= 1;
if (expr.hasNewOperator) flags |= 2;
Uint8List? objectId;
if (expr.callee is IdentifierExpr) {
objectId = _utf8String((expr.callee as IdentifierExpr).id);
}
if (objectId != null) flags |= 4;
bytesBuilder.addByte(flags);
if (objectId != null) {
bytesBuilder.add(objectId);
}
bytesBuilder.addByte(expr.namedArgs.length);
for (final name in expr.namedArgs.keys) {
bytesBuilder.add(_identifier(name));
}
bytesBuilder.addByte(expr.positionalArgs.length);
for (final arg in expr.positionalArgs) {
bytesBuilder.addByte(arg is SpreadExpr ? 1 : 0);
}
return bytesBuilder.toBytes();
}