visitCallExpr method

  1. @override
Uint8List visitCallExpr(
  1. CallExpr expr
)
override

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