Example #1
0
 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;
 }
Example #2
0
 //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,