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