PageRenderTime 60ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 0ms

/mcs/class/dlr/Runtime/Microsoft.Scripting.Core/Compiler/LambdaCompiler.Generated.cs

https://github.com/tncor/mono
C# | 282 lines | 243 code | 18 blank | 21 comment | 5 complexity | 593d76cf58d55697706d0ea9a446a4c0 MD5 | raw file
  1. /* ****************************************************************************
  2. *
  3. * Copyright (c) Microsoft Corporation.
  4. *
  5. * This source code is subject to terms and conditions of the Apache License, Version 2.0. A
  6. * copy of the license can be found in the License.html file at the root of this distribution. If
  7. * you cannot locate the Apache License, Version 2.0, please send an email to
  8. * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
  9. * by the terms of the Apache License, Version 2.0.
  10. *
  11. * You must not remove this notice, or any other, from this software.
  12. *
  13. *
  14. * ***************************************************************************/
  15. using System.Diagnostics;
  16. using System.Dynamic.Utils;
  17. #if CLR2
  18. namespace Microsoft.Scripting.Ast.Compiler {
  19. #else
  20. namespace System.Linq.Expressions.Compiler {
  21. #endif
  22. partial class LambdaCompiler {
  23. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1505:AvoidUnmaintainableCode"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
  24. private void EmitExpression(Expression node, CompilationFlags flags) {
  25. Debug.Assert(node != null);
  26. bool emitStart = (flags & CompilationFlags.EmitExpressionStartMask) == CompilationFlags.EmitExpressionStart;
  27. CompilationFlags startEmitted = emitStart ? EmitExpressionStart(node) : CompilationFlags.EmitNoExpressionStart;
  28. // only pass tail call flags to emit the expression
  29. flags = flags & CompilationFlags.EmitAsTailCallMask;
  30. switch (node.NodeType) {
  31. #region Generated Expression Compiler
  32. // *** BEGIN GENERATED CODE ***
  33. // generated by function: gen_compiler from: generate_tree.py
  34. case ExpressionType.Add:
  35. EmitBinaryExpression(node, flags);
  36. break;
  37. case ExpressionType.AddChecked:
  38. EmitBinaryExpression(node, flags);
  39. break;
  40. case ExpressionType.And:
  41. EmitBinaryExpression(node, flags);
  42. break;
  43. case ExpressionType.AndAlso:
  44. EmitAndAlsoBinaryExpression(node, flags);
  45. break;
  46. case ExpressionType.ArrayLength:
  47. EmitUnaryExpression(node, flags);
  48. break;
  49. case ExpressionType.ArrayIndex:
  50. EmitBinaryExpression(node, flags);
  51. break;
  52. case ExpressionType.Call:
  53. EmitMethodCallExpression(node, flags);
  54. break;
  55. case ExpressionType.Coalesce:
  56. EmitCoalesceBinaryExpression(node);
  57. break;
  58. case ExpressionType.Conditional:
  59. EmitConditionalExpression(node, flags);
  60. break;
  61. case ExpressionType.Constant:
  62. EmitConstantExpression(node);
  63. break;
  64. case ExpressionType.Convert:
  65. EmitConvertUnaryExpression(node, flags);
  66. break;
  67. case ExpressionType.ConvertChecked:
  68. EmitConvertUnaryExpression(node, flags);
  69. break;
  70. case ExpressionType.Divide:
  71. EmitBinaryExpression(node, flags);
  72. break;
  73. case ExpressionType.Equal:
  74. EmitBinaryExpression(node, flags);
  75. break;
  76. case ExpressionType.ExclusiveOr:
  77. EmitBinaryExpression(node, flags);
  78. break;
  79. case ExpressionType.GreaterThan:
  80. EmitBinaryExpression(node, flags);
  81. break;
  82. case ExpressionType.GreaterThanOrEqual:
  83. EmitBinaryExpression(node, flags);
  84. break;
  85. case ExpressionType.Invoke:
  86. EmitInvocationExpression(node, flags);
  87. break;
  88. case ExpressionType.Lambda:
  89. EmitLambdaExpression(node);
  90. break;
  91. case ExpressionType.LeftShift:
  92. EmitBinaryExpression(node, flags);
  93. break;
  94. case ExpressionType.LessThan:
  95. EmitBinaryExpression(node, flags);
  96. break;
  97. case ExpressionType.LessThanOrEqual:
  98. EmitBinaryExpression(node, flags);
  99. break;
  100. case ExpressionType.ListInit:
  101. EmitListInitExpression(node);
  102. break;
  103. case ExpressionType.MemberAccess:
  104. EmitMemberExpression(node);
  105. break;
  106. case ExpressionType.MemberInit:
  107. EmitMemberInitExpression(node);
  108. break;
  109. case ExpressionType.Modulo:
  110. EmitBinaryExpression(node, flags);
  111. break;
  112. case ExpressionType.Multiply:
  113. EmitBinaryExpression(node, flags);
  114. break;
  115. case ExpressionType.MultiplyChecked:
  116. EmitBinaryExpression(node, flags);
  117. break;
  118. case ExpressionType.Negate:
  119. EmitUnaryExpression(node, flags);
  120. break;
  121. case ExpressionType.UnaryPlus:
  122. EmitUnaryExpression(node, flags);
  123. break;
  124. case ExpressionType.NegateChecked:
  125. EmitUnaryExpression(node, flags);
  126. break;
  127. case ExpressionType.New:
  128. EmitNewExpression(node);
  129. break;
  130. case ExpressionType.NewArrayInit:
  131. EmitNewArrayExpression(node);
  132. break;
  133. case ExpressionType.NewArrayBounds:
  134. EmitNewArrayExpression(node);
  135. break;
  136. case ExpressionType.Not:
  137. EmitUnaryExpression(node, flags);
  138. break;
  139. case ExpressionType.NotEqual:
  140. EmitBinaryExpression(node, flags);
  141. break;
  142. case ExpressionType.Or:
  143. EmitBinaryExpression(node, flags);
  144. break;
  145. case ExpressionType.OrElse:
  146. EmitOrElseBinaryExpression(node, flags);
  147. break;
  148. case ExpressionType.Parameter:
  149. EmitParameterExpression(node);
  150. break;
  151. case ExpressionType.Power:
  152. EmitBinaryExpression(node, flags);
  153. break;
  154. case ExpressionType.Quote:
  155. EmitQuoteUnaryExpression(node);
  156. break;
  157. case ExpressionType.RightShift:
  158. EmitBinaryExpression(node, flags);
  159. break;
  160. case ExpressionType.Subtract:
  161. EmitBinaryExpression(node, flags);
  162. break;
  163. case ExpressionType.SubtractChecked:
  164. EmitBinaryExpression(node, flags);
  165. break;
  166. case ExpressionType.TypeAs:
  167. EmitUnaryExpression(node, flags);
  168. break;
  169. case ExpressionType.TypeIs:
  170. EmitTypeBinaryExpression(node);
  171. break;
  172. case ExpressionType.Assign:
  173. EmitAssignBinaryExpression(node);
  174. break;
  175. case ExpressionType.Block:
  176. EmitBlockExpression(node, flags);
  177. break;
  178. case ExpressionType.DebugInfo:
  179. EmitDebugInfoExpression(node);
  180. break;
  181. case ExpressionType.Decrement:
  182. EmitUnaryExpression(node, flags);
  183. break;
  184. case ExpressionType.Dynamic:
  185. EmitDynamicExpression(node);
  186. break;
  187. case ExpressionType.Default:
  188. EmitDefaultExpression(node);
  189. break;
  190. case ExpressionType.Extension:
  191. EmitExtensionExpression(node);
  192. break;
  193. case ExpressionType.Goto:
  194. EmitGotoExpression(node, flags);
  195. break;
  196. case ExpressionType.Increment:
  197. EmitUnaryExpression(node, flags);
  198. break;
  199. case ExpressionType.Index:
  200. EmitIndexExpression(node);
  201. break;
  202. case ExpressionType.Label:
  203. EmitLabelExpression(node, flags);
  204. break;
  205. case ExpressionType.RuntimeVariables:
  206. EmitRuntimeVariablesExpression(node);
  207. break;
  208. case ExpressionType.Loop:
  209. EmitLoopExpression(node);
  210. break;
  211. case ExpressionType.Switch:
  212. EmitSwitchExpression(node, flags);
  213. break;
  214. case ExpressionType.Throw:
  215. EmitThrowUnaryExpression(node);
  216. break;
  217. case ExpressionType.Try:
  218. EmitTryExpression(node);
  219. break;
  220. case ExpressionType.Unbox:
  221. EmitUnboxUnaryExpression(node);
  222. break;
  223. case ExpressionType.TypeEqual:
  224. EmitTypeBinaryExpression(node);
  225. break;
  226. case ExpressionType.OnesComplement:
  227. EmitUnaryExpression(node, flags);
  228. break;
  229. case ExpressionType.IsTrue:
  230. EmitUnaryExpression(node, flags);
  231. break;
  232. case ExpressionType.IsFalse:
  233. EmitUnaryExpression(node, flags);
  234. break;
  235. // *** END GENERATED CODE ***
  236. #endregion
  237. default:
  238. throw ContractUtils.Unreachable;
  239. }
  240. if (emitStart) {
  241. EmitExpressionEnd(startEmitted);
  242. }
  243. }
  244. private static bool IsChecked(ExpressionType op) {
  245. switch (op) {
  246. #region Generated Checked Operations
  247. // *** BEGIN GENERATED CODE ***
  248. // generated by function: gen_checked_ops from: generate_tree.py
  249. case ExpressionType.AddChecked:
  250. case ExpressionType.ConvertChecked:
  251. case ExpressionType.MultiplyChecked:
  252. case ExpressionType.NegateChecked:
  253. case ExpressionType.SubtractChecked:
  254. case ExpressionType.AddAssignChecked:
  255. case ExpressionType.MultiplyAssignChecked:
  256. case ExpressionType.SubtractAssignChecked:
  257. // *** END GENERATED CODE ***
  258. #endregion
  259. return true;
  260. }
  261. return false;
  262. }
  263. }
  264. }