CodeSelfIncrement.cs 2.1 KB

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