1 /* ****************************************************************************
3 * Copyright (c) Microsoft Corporation.
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.
11 * You must not remove this notice, or any other, from this software.
14 * ***************************************************************************/
16 using System.Diagnostics;
17 using System.Dynamic.Utils;
20 namespace Microsoft.Scripting.Ast.Compiler {
22 namespace System.Linq.Expressions.Compiler {
24 internal partial class StackSpiller {
27 /// Rewrite the expression
30 /// <param name="node">Expression to rewrite</param>
31 /// <param name="stack">State of the stack before the expression is emitted.</param>
32 /// <returns>Rewritten expression.</returns>
33 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1505:AvoidUnmaintainableCode")]
34 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
35 private Result RewriteExpression(Expression node, Stack stack) {
37 return new Result(RewriteAction.None, null);
41 switch (node.NodeType) {
42 #region Generated StackSpiller Switch
44 // *** BEGIN GENERATED CODE ***
45 // generated by function: gen_stackspiller_switch from: generate_tree.py
47 case ExpressionType.Add:
48 result = RewriteBinaryExpression(node, stack);
50 case ExpressionType.AddChecked:
51 result = RewriteBinaryExpression(node, stack);
53 case ExpressionType.And:
54 result = RewriteBinaryExpression(node, stack);
56 case ExpressionType.AndAlso:
57 result = RewriteLogicalBinaryExpression(node, stack);
59 case ExpressionType.ArrayLength:
60 result = RewriteUnaryExpression(node, stack);
62 case ExpressionType.ArrayIndex:
63 result = RewriteBinaryExpression(node, stack);
65 case ExpressionType.Call:
66 result = RewriteMethodCallExpression(node, stack);
68 case ExpressionType.Coalesce:
69 result = RewriteLogicalBinaryExpression(node, stack);
71 case ExpressionType.Conditional:
72 result = RewriteConditionalExpression(node, stack);
74 case ExpressionType.Convert:
75 result = RewriteUnaryExpression(node, stack);
77 case ExpressionType.ConvertChecked:
78 result = RewriteUnaryExpression(node, stack);
80 case ExpressionType.Divide:
81 result = RewriteBinaryExpression(node, stack);
83 case ExpressionType.Equal:
84 result = RewriteBinaryExpression(node, stack);
86 case ExpressionType.ExclusiveOr:
87 result = RewriteBinaryExpression(node, stack);
89 case ExpressionType.GreaterThan:
90 result = RewriteBinaryExpression(node, stack);
92 case ExpressionType.GreaterThanOrEqual:
93 result = RewriteBinaryExpression(node, stack);
95 case ExpressionType.Invoke:
96 result = RewriteInvocationExpression(node, stack);
98 case ExpressionType.Lambda:
99 result = RewriteLambdaExpression(node, stack);
101 case ExpressionType.LeftShift:
102 result = RewriteBinaryExpression(node, stack);
104 case ExpressionType.LessThan:
105 result = RewriteBinaryExpression(node, stack);
107 case ExpressionType.LessThanOrEqual:
108 result = RewriteBinaryExpression(node, stack);
110 case ExpressionType.ListInit:
111 result = RewriteListInitExpression(node, stack);
113 case ExpressionType.MemberAccess:
114 result = RewriteMemberExpression(node, stack);
116 case ExpressionType.MemberInit:
117 result = RewriteMemberInitExpression(node, stack);
119 case ExpressionType.Modulo:
120 result = RewriteBinaryExpression(node, stack);
122 case ExpressionType.Multiply:
123 result = RewriteBinaryExpression(node, stack);
125 case ExpressionType.MultiplyChecked:
126 result = RewriteBinaryExpression(node, stack);
128 case ExpressionType.Negate:
129 result = RewriteUnaryExpression(node, stack);
131 case ExpressionType.UnaryPlus:
132 result = RewriteUnaryExpression(node, stack);
134 case ExpressionType.NegateChecked:
135 result = RewriteUnaryExpression(node, stack);
137 case ExpressionType.New:
138 result = RewriteNewExpression(node, stack);
140 case ExpressionType.NewArrayInit:
141 result = RewriteNewArrayExpression(node, stack);
143 case ExpressionType.NewArrayBounds:
144 result = RewriteNewArrayExpression(node, stack);
146 case ExpressionType.Not:
147 result = RewriteUnaryExpression(node, stack);
149 case ExpressionType.NotEqual:
150 result = RewriteBinaryExpression(node, stack);
152 case ExpressionType.Or:
153 result = RewriteBinaryExpression(node, stack);
155 case ExpressionType.OrElse:
156 result = RewriteLogicalBinaryExpression(node, stack);
158 case ExpressionType.Power:
159 result = RewriteBinaryExpression(node, stack);
161 case ExpressionType.RightShift:
162 result = RewriteBinaryExpression(node, stack);
164 case ExpressionType.Subtract:
165 result = RewriteBinaryExpression(node, stack);
167 case ExpressionType.SubtractChecked:
168 result = RewriteBinaryExpression(node, stack);
170 case ExpressionType.TypeAs:
171 result = RewriteUnaryExpression(node, stack);
173 case ExpressionType.TypeIs:
174 result = RewriteTypeBinaryExpression(node, stack);
176 case ExpressionType.Assign:
177 result = RewriteAssignBinaryExpression(node, stack);
179 case ExpressionType.Block:
180 result = RewriteBlockExpression(node, stack);
182 case ExpressionType.Decrement:
183 result = RewriteUnaryExpression(node, stack);
185 case ExpressionType.Dynamic:
186 result = RewriteDynamicExpression(node, stack);
188 case ExpressionType.Extension:
189 result = RewriteExtensionExpression(node, stack);
191 case ExpressionType.Goto:
192 result = RewriteGotoExpression(node, stack);
194 case ExpressionType.Increment:
195 result = RewriteUnaryExpression(node, stack);
197 case ExpressionType.Index:
198 result = RewriteIndexExpression(node, stack);
200 case ExpressionType.Label:
201 result = RewriteLabelExpression(node, stack);
203 case ExpressionType.Loop:
204 result = RewriteLoopExpression(node, stack);
206 case ExpressionType.Switch:
207 result = RewriteSwitchExpression(node, stack);
209 case ExpressionType.Throw:
210 result = RewriteThrowUnaryExpression(node, stack);
212 case ExpressionType.Try:
213 result = RewriteTryExpression(node, stack);
215 case ExpressionType.Unbox:
216 result = RewriteUnaryExpression(node, stack);
218 case ExpressionType.TypeEqual:
219 result = RewriteTypeBinaryExpression(node, stack);
221 case ExpressionType.OnesComplement:
222 result = RewriteUnaryExpression(node, stack);
224 case ExpressionType.IsTrue:
225 result = RewriteUnaryExpression(node, stack);
227 case ExpressionType.IsFalse:
228 result = RewriteUnaryExpression(node, stack);
230 case ExpressionType.AddAssign:
231 case ExpressionType.AndAssign:
232 case ExpressionType.DivideAssign:
233 case ExpressionType.ExclusiveOrAssign:
234 case ExpressionType.LeftShiftAssign:
235 case ExpressionType.ModuloAssign:
236 case ExpressionType.MultiplyAssign:
237 case ExpressionType.OrAssign:
238 case ExpressionType.PowerAssign:
239 case ExpressionType.RightShiftAssign:
240 case ExpressionType.SubtractAssign:
241 case ExpressionType.AddAssignChecked:
242 case ExpressionType.MultiplyAssignChecked:
243 case ExpressionType.SubtractAssignChecked:
244 case ExpressionType.PreIncrementAssign:
245 case ExpressionType.PreDecrementAssign:
246 case ExpressionType.PostIncrementAssign:
247 case ExpressionType.PostDecrementAssign:
248 result = RewriteReducibleExpression(node, stack);
250 case ExpressionType.Quote:
251 case ExpressionType.Parameter:
252 case ExpressionType.Constant:
253 case ExpressionType.RuntimeVariables:
254 case ExpressionType.Default:
255 case ExpressionType.DebugInfo:
256 return new Result(RewriteAction.None, node);
258 // *** END GENERATED CODE ***
263 throw ContractUtils.Unreachable;
266 VerifyRewrite(result, node);