CodeSelfIncrement.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // created on 28/08/2004 at 17:30
  2. using System;
  3. using System.Reflection;
  4. using System.Reflection.Emit;
  5. namespace Mono.CodeGeneration
  6. {
  7. public class CodeSelfIncrement: CodeExpression
  8. {
  9. CodeValueReference exp;
  10. public CodeSelfIncrement (CodeValueReference exp)
  11. {
  12. this.exp = exp;
  13. if (!exp.IsNumber)
  14. throw new InvalidOperationException ("Operator '++' cannot be applied to operand of type '" + exp.GetResultType().FullName + "'");
  15. }
  16. public override void Generate (ILGenerator gen)
  17. {
  18. exp.Generate (gen);
  19. Type t = exp.GetResultType ();
  20. switch (Type.GetTypeCode (t))
  21. {
  22. case TypeCode.Byte:
  23. gen.Emit (OpCodes.Ldc_I4_1);
  24. gen.Emit (OpCodes.Add);
  25. gen.Emit (OpCodes.Conv_U1);
  26. break;
  27. case TypeCode.Decimal:
  28. MethodInfo met = typeof(Decimal).GetMethod ("op_Increment");
  29. CodeGenerationHelper.GenerateMethodCall (gen, null, met, exp);
  30. break;
  31. case TypeCode.Double:
  32. gen.Emit (OpCodes.Ldc_R8, 1);
  33. gen.Emit (OpCodes.Add);
  34. break;
  35. case TypeCode.Int16:
  36. gen.Emit (OpCodes.Ldc_I4_1);
  37. gen.Emit (OpCodes.Add);
  38. gen.Emit (OpCodes.Conv_I2);
  39. break;
  40. case TypeCode.UInt32:
  41. case TypeCode.Int32:
  42. gen.Emit (OpCodes.Ldc_I4_1);
  43. gen.Emit (OpCodes.Add);
  44. break;
  45. case TypeCode.UInt64:
  46. case TypeCode.Int64:
  47. gen.Emit (OpCodes.Ldc_I4_1);
  48. gen.Emit (OpCodes.Add);
  49. gen.Emit (OpCodes.Conv_U8);
  50. break;
  51. case TypeCode.SByte:
  52. gen.Emit (OpCodes.Ldc_I4_1);
  53. gen.Emit (OpCodes.Add);
  54. gen.Emit (OpCodes.Conv_I1);
  55. break;
  56. case TypeCode.Single:
  57. gen.Emit (OpCodes.Ldc_R4, 1);
  58. gen.Emit (OpCodes.Add);
  59. break;
  60. case TypeCode.UInt16:
  61. gen.Emit (OpCodes.Ldc_I4_1);
  62. gen.Emit (OpCodes.Add);
  63. gen.Emit (OpCodes.Conv_U2);
  64. break;
  65. }
  66. exp.GenerateSet (gen, exp);
  67. }
  68. public override void PrintCode (CodeWriter cp)
  69. {
  70. exp.PrintCode (cp);
  71. cp.Write ("++");
  72. }
  73. public override Type GetResultType ()
  74. {
  75. return exp.GetResultType();
  76. }
  77. }
  78. }