visitAssignExpr method

  1. @override
Uint8List visitAssignExpr(
  1. AssignExpr expr
)
override

Implementation

@override
Uint8List visitAssignExpr(AssignExpr expr) {
  final bytesBuilder = BytesBuilder();
  if (expr.op == _lexicon.assign) {
    if (expr.left is IdentifierExpr) {
      final localVariable = _localReference(expr.left);
      if (localVariable != null) {
        bytesBuilder.add(compileAST(expr.right));
        if (_isCurrentFunctionVariable(localVariable)) {
          bytesBuilder.addByte(
            localVariable.storage == HTResolvedStorage.capturedCell
                ? OpCode.localCellSet
                : OpCode.localSlotSet,
          );
          bytesBuilder.add(_uint16(localVariable.slot!));
        } else {
          final upvalueIndex = _upvalueIndex(localVariable);
          assert(upvalueIndex >= 0);
          bytesBuilder.addByte(OpCode.upvalueSet);
          bytesBuilder.add(_uint16(upvalueIndex));
        }
        return bytesBuilder.toBytes();
      }
    }
    if (expr.left is MemberExpr) {
      final value = compileAST(expr.right);
      bytesBuilder.add(value);
      final memberExpr = expr.left as MemberExpr;
      final object = compileAST(memberExpr.object);
      bytesBuilder.add(object);
      final key = visitIdentifierExpr(memberExpr.key);
      bytesBuilder.add(key);
      bytesBuilder.addByte(OpCode.memberSet);
      bytesBuilder.addByte(memberExpr.isNullable ? 1 : 0);
      Uint8List? objectId;
      if (memberExpr.object is IdentifierExpr) {
        objectId = _utf8String((memberExpr.object as IdentifierExpr).id);
      }
      if (objectId != null) {
        bytesBuilder.addByte(1);
        bytesBuilder.add(objectId);
      } else {
        bytesBuilder.addByte(0);
      }
    } else if (expr.left is SubExpr) {
      final value = compileAST(expr.right);
      bytesBuilder.add(value);
      final subExpr = expr.left as SubExpr;
      final array = compileAST(subExpr.object);
      bytesBuilder.add(array);
      final key = compileAST(subExpr.key);
      bytesBuilder.addByte(OpCode.createStackFrame);
      bytesBuilder.add(key);
      bytesBuilder.addByte(OpCode.retractStackFrame);
      bytesBuilder.addByte(OpCode.subSet);
      bytesBuilder.addByte(subExpr.isNullable ? 1 : 0);
      Uint8List? objectId;
      if (subExpr.object is IdentifierExpr) {
        objectId = _utf8String((subExpr.object as IdentifierExpr).id);
      }
      if (objectId != null) {
        bytesBuilder.addByte(1);
        bytesBuilder.add(objectId);
      } else {
        bytesBuilder.addByte(0);
      }
    } else {
      final right = compileAST(expr.right);
      bytesBuilder.add(right);
      final left = compileAST(expr.left);
      bytesBuilder.add(left);
      bytesBuilder.addByte(OpCode.assign);
    }
  }
  return bytesBuilder.toBytes();
}