public override void Generate(CodeGenerator cg)
        {
            LeftOperand.Generate(cg);
            RightOperand.Generate(cg);

            cg.generator.Emit(OperatorOpCode);
        }
Example #2
0
        public override void Generate(CodeGenerator generator)
        {
            LeftOperand.Generate(generator);

            ILGenerator il  = generator.Generator;
            Label       end = il.DefineLabel();

            // Put 1 on evaluation stack if first operand is not 0; 0 otherwise
            il.Emit(OpCodes.Ldc_I4_0);
            il.Emit(OpCodes.Ceq);
            il.Emit(OpCodes.Ldc_I4_0);
            il.Emit(OpCodes.Ceq);

            // If first operand matches short circuit condition (& -> 0 (false), | -> 1 (true)) then return
            il.Emit(OpCodes.Dup);
            il.Emit(ShortCircuitOpCode);
            il.Emit(OpCodes.Beq, end);

            RightOperand.Generate(generator);

            // Put 1 on evaluation stack if second operand is not 0; 0 otherwise
            il.Emit(OpCodes.Ldc_I4_0);
            il.Emit(OpCodes.Ceq);
            il.Emit(OpCodes.Ldc_I4_0);
            il.Emit(OpCodes.Ceq);

            // Perform bitwise operation
            il.Emit(OperatorOpCode);
            il.MarkLabel(end);
        }
Example #3
0
        public override void Generate(CodeGenerator cg)
        {
            Label op1false = cg.generator.DefineLabel();
            Label op2false = cg.generator.DefineLabel();
            Label end      = cg.generator.DefineLabel();

            LeftOperand.Generate(cg);
            cg.generator.Emit(OpCodes.Ldc_I4_0);
            cg.generator.Emit(OpCodes.Beq, op1false);

            //el primer operando era verdadero
            cg.generator.Emit(OpCodes.Ldc_I4_1);
            cg.generator.Emit(OpCodes.Br, end);

            //el primer operando era falso
            cg.generator.MarkLabel(op1false);
            RightOperand.Generate(cg);
            cg.generator.Emit(OpCodes.Ldc_I4_0);
            cg.generator.Emit(OpCodes.Beq, op2false);

            //el segundo operando era verdadero (el primer op es falso)
            cg.generator.Emit(OpCodes.Ldc_I4_1);
            cg.generator.Emit(OpCodes.Br, end);

            //el segundo operando es falso (el segundo op es falso)
            cg.generator.MarkLabel(op2false);
            cg.generator.Emit(OpCodes.Ldc_I4_0);

            cg.generator.MarkLabel(end);
        }
Example #4
0
        public override void Generate(CodeGenerator generator)
        {
            LeftOperand.Generate(generator);
            RightOperand.Generate(generator);

            ILGenerator il = generator.Generator;

            if (LeftOperand.Type == Types.Int)
            {
                CompareInt(generator.Generator);
            }

            else if (LeftOperand.Type == Types.String)
            {
                CompareString(generator.Generator);
            }

            else
            {
                CompareOther(generator.Generator);
            }
        }
Example #5
0
        public override void Generate(CodeGenerator cg)
        {
            Label ret1 = cg.generator.DefineLabel();
            Label end  = cg.generator.DefineLabel();

            LeftOperand.Generate(cg);
            RightOperand.Generate(cg);

            if (LeftOperand.returnType.isString)
            {
                cg.generator.Emit(OpCodes.Call, typeof(string).GetMethod("Compare", new Type[] { typeof(string), typeof(string) }));
                cg.generator.Emit(OpCodes.Ldc_I4_0);
            }
            cg.generator.Emit(OperatorOpCode, ret1);

            cg.generator.Emit(OpCodes.Ldc_I4_0);
            cg.generator.Emit(OpCodes.Br, end);

            cg.generator.MarkLabel(ret1);
            cg.generator.Emit(OpCodes.Ldc_I4_1);

            cg.generator.MarkLabel(end);
        }
Example #6
0
 public override void Generate(CodeGenerator generator)
 {
     LeftOperand.Generate(generator);
     RightOperand.Generate(generator);
     generator.Generator.Emit(OperatorOpCode);
 }