public override void Generate(CodeGenerator cg) { LeftOperand.Generate(cg); RightOperand.Generate(cg); cg.generator.Emit(OperatorOpCode); }
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); }
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); }
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); } }
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); }
public override void Generate(CodeGenerator generator) { LeftOperand.Generate(generator); RightOperand.Generate(generator); generator.Generator.Emit(OperatorOpCode); }