visitStructObjExpr method

  1. @override
Uint8List visitStructObjExpr(
  1. StructObjExpr obj
)
override

Implementation

@override
Uint8List visitStructObjExpr(StructObjExpr obj) {
  final bytesBuilder = BytesBuilder();
  // Compile field values first — they push onto operand stack
  for (final field in obj.fields) {
    bytesBuilder.add(compileAST(field.fieldValue));
  }
  // Terminal opcode
  bytesBuilder.addByte(OpCode.makeStruct);
  bytesBuilder.addByte(obj.fields.length);
  for (final field in obj.fields) {
    bytesBuilder.addByte(field.isSpread ? 1 : 0);
    if (!field.isSpread) {
      bytesBuilder.add(_identifier(field.key!.id));
    }
  }
  if (obj.id != null) {
    bytesBuilder.addByte(1); // bool: has id
    bytesBuilder.add(_identifier(obj.id!.id));
  } else {
    bytesBuilder.addByte(0); // bool: has id
  }
  if (obj.prototypeId != null) {
    bytesBuilder.addByte(1); // bool: has prototype
    bytesBuilder.add(_identifier(obj.prototypeId!.id));
  } else {
    bytesBuilder.addByte(0); // bool: has prototype
  }
  return bytesBuilder.toBytes();
}