public AndOrExpressionGenerator(GeneratorFactory factory, BlockGenerator block, BinaryExpressionSyntaxNode expr) : base(factory) { _type = expr.SpecializationType.GetVMSpecializationType(); _left = factory.CreateExpression(block, expr.Left); _right = factory.CreateExpression(block, expr.Right); if (_left.GetSingleType() != _type) { _leftStack = block.TempAllocator.Allocate(_left.GetSingleType()); } if (_right.GetSingleType() != _type) { _rightStack = block.TempAllocator.Allocate(_right.GetSingleType()); } _opcode = expr.Operator.V == BinaryOperator.Raw.And ? OpCodes.ISFC : OpCodes.ISTC; }
//This public ctor works for arithmetic binary ops. public BinaryExpressionGenerator(GeneratorFactory factory, BlockGenerator block, BinaryExpressionSyntaxNode expr) : this(factory, block, factory.CreateExpression(block, expr.Left), factory.CreateExpression(block, expr.Right), expr.SpecializationType.GetVMSpecializationType()) { _opcode = expr.Operator.V switch { BinaryOperator.Raw.Add => OpCodes.ADD, BinaryOperator.Raw.Sub => OpCodes.SUB, BinaryOperator.Raw.Mul => OpCodes.MUL, BinaryOperator.Raw.Div => OpCodes.DIV, BinaryOperator.Raw.Mod => OpCodes.MOD, BinaryOperator.Raw.Pow => OpCodes.POW, _ => throw new Exception(), //Should not get here. }; }
public ComparisonBinaryExpressionGenerator(GeneratorFactory factory, BlockGenerator block, BinaryExpressionSyntaxNode expr) : base(factory, block, CheckSwap(factory, block, expr, out var right, out var op, out var r), right,