visitBinaryExpr method
Implementation
@override
Uint8List visitBinaryExpr(BinaryExpr expr) {
final bytesBuilder = BytesBuilder();
final left = compileAST(expr.left);
final right = compileAST(expr.right);
if (expr.op == _lexicon.ifNull) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.orLeft);
bytesBuilder.addByte(HTOpCode.ifNull);
bytesBuilder.add(_uint16(right.length + 1)); // length of right value
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.endOfExec);
} else if (expr.op == _lexicon.logicalOr) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.orLeft);
bytesBuilder.addByte(HTOpCode.logicalOr);
bytesBuilder.add(_uint16(right.length + 1)); // length of right value
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.endOfExec);
} else if (expr.op == _lexicon.logicalAnd) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.andLeft);
bytesBuilder.addByte(HTOpCode.logicalAnd);
bytesBuilder.add(_uint16(right.length + 1)); // length of right value
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.endOfExec);
} else if (expr.op == _lexicon.equal) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.equalLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.equal);
} else if (expr.op == _lexicon.notEqual) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.equalLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.notEqual);
} else if (expr.op == _lexicon.lesser) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.relationLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.lesser);
} else if (expr.op == _lexicon.greater) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.relationLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.greater);
} else if (expr.op == _lexicon.lesserOrEqual) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.relationLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.lesserOrEqual);
} else if (expr.op == _lexicon.greaterOrEqual) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.relationLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.greaterOrEqual);
} else if (expr.op == _lexicon.kAs) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.relationLeft);
final right = compileAST(expr.right);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.typeAs);
} else if (expr.op == _lexicon.kIs) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.relationLeft);
final right = compileAST(expr.right);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.typeIs);
} else if (expr.op == _lexicon.kIsNot) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.relationLeft);
final right = compileAST(expr.right);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.typeIsNot);
} else if (expr.op == _lexicon.add) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.addLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.add);
} else if (expr.op == _lexicon.subtract) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.addLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.subtract);
} else if (expr.op == _lexicon.multiply) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.multiplyLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.multiply);
} else if (expr.op == _lexicon.devide) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.multiplyLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.devide);
} else if (expr.op == _lexicon.truncatingDevide) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.multiplyLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.truncatingDevide);
} else if (expr.op == _lexicon.modulo) {
bytesBuilder.add(left);
bytesBuilder.addByte(HTOpCode.register);
bytesBuilder.addByte(HTRegIdx.multiplyLeft);
bytesBuilder.add(right);
bytesBuilder.addByte(HTOpCode.modulo);
} else if (expr.op == _lexicon.kIn) {
final containsCallExpr = CallExpr(
MemberExpr(expr.right,
IdentifierExpr(_lexicon.idCollectionContains, isLocal: false)),
positionalArgs: [expr.left]);
final containsCallExprBytes = visitCallExpr(containsCallExpr);
bytesBuilder.add(containsCallExprBytes);
} else if (expr.op == _lexicon.kNotIn) {
final containsCallExpr = CallExpr(
MemberExpr(expr.right,
IdentifierExpr(_lexicon.idCollectionContains, isLocal: false)),
positionalArgs: [expr.left]);
final containsCallExprBytes = visitCallExpr(containsCallExpr);
bytesBuilder.add(containsCallExprBytes);
bytesBuilder.addByte(HTOpCode.logicalNot);
}
return bytesBuilder.toBytes();
}