public override void GenCode(ICodeGenerator cg) { var gen = cg.GetGenerator; LeftOperand.GenCode(cg); RightOperand.GenCode(cg); gen.Emit(OpCodes.Sub); }
public override void GenCode(ICodeGenerator cg) { LeftOperand.GenCode(cg); RightOperand.GenCode(cg); if (LeftOperand.ReturnType.PrimitiveType is StringType) { MethodInfo method = typeof(string).GetMethod("Compare", new Type[] { typeof(string), typeof(string) }); cg.GetGenerator.Emit(OpCodes.Call, method); cg.GetGenerator.Emit(OpCodes.Ldc_I4_0); } cg.GetGenerator.Emit(OpCodes.Ceq); }
public override void GenCode(ICodeGenerator cg) { var gen = cg.GetGenerator; var falseLabel = gen.DefineLabel(); var endLabel = gen.DefineLabel(); LeftOperand.GenCode(cg); gen.Emit(OpCodes.Brfalse, falseLabel); RightOperand.GenCode(cg); gen.Emit(OpCodes.Brfalse, falseLabel); gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Br, endLabel); gen.MarkLabel(falseLabel); gen.Emit(OpCodes.Ldc_I4_0); gen.MarkLabel(endLabel); }
public override void GenCode(ICodeGenerator cg) { var gen = cg.GetGenerator; var trueLabel = gen.DefineLabel(); var endLabel = gen.DefineLabel(); //Si leftOperand es true saltar a trueLabel LeftOperand.GenCode(cg); gen.Emit(OpCodes.Brtrue, trueLabel); //Si el segundo lo es idem RightOperand.GenCode(cg); gen.Emit(OpCodes.Brtrue, trueLabel); //Si ninguno es true ponemos 0 en la pila y saltamos al final gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Br, endLabel); //Si alguno es true ponemos uno en la pila y seguimos hasta el final gen.MarkLabel(trueLabel); gen.Emit(OpCodes.Ldc_I4_1); //Fin del codigo gen.MarkLabel(endLabel); }
public override void GenCode(ICodeGenerator cg) { LeftOperand.GenCode(cg); RightOperand.GenCode(cg); }