Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ CompileSwitchExpression()

void System.Linq.Expressions.Interpreter.LightCompiler.CompileSwitchExpression ( Expression expr)
inlineprivate

Definition at line 1138 of file LightCompiler.cs.

1139 {
1140 SwitchExpression switchExpression = (SwitchExpression)expr;
1141 if (switchExpression.Cases.All((SwitchCase c) => c.TestValues.All((Expression t) => t is ConstantExpression)))
1142 {
1143 if (switchExpression.Cases.Count == 0)
1144 {
1145 CompileAsVoid(switchExpression.SwitchValue);
1146 if (switchExpression.DefaultBody != null)
1147 {
1148 Compile(switchExpression.DefaultBody);
1149 }
1150 return;
1151 }
1152 TypeCode typeCode = switchExpression.SwitchValue.Type.GetTypeCode();
1153 if (switchExpression.Comparison == null)
1154 {
1155 switch (typeCode)
1156 {
1157 case TypeCode.Int32:
1159 return;
1160 case TypeCode.SByte:
1161 case TypeCode.Byte:
1162 case TypeCode.Int16:
1163 case TypeCode.UInt16:
1164 case TypeCode.UInt32:
1165 case TypeCode.Int64:
1166 case TypeCode.UInt64:
1168 return;
1169 }
1170 }
1171 if (typeCode == TypeCode.String)
1172 {
1173 MethodInfo methodInfo = CachedReflectionInfo.String_op_Equality_String_String;
1174 if (methodInfo != null && !methodInfo.IsStatic)
1175 {
1176 methodInfo = null;
1177 }
1178 if (object.Equals(switchExpression.Comparison, methodInfo))
1179 {
1181 return;
1182 }
1183 }
1184 }
1185 LocalDefinition definition = _locals.DefineLocal(Expression.Parameter(switchExpression.SwitchValue.Type), _instructions.Count);
1186 Compile(switchExpression.SwitchValue);
1188 LabelTarget target = Expression.Label(switchExpression.Type, "done");
1189 foreach (SwitchCase @case in switchExpression.Cases)
1190 {
1191 foreach (Expression testValue in @case.TestValues)
1192 {
1194 }
1195 }
1196 CompileLabelExpression(Expression.Label(target, switchExpression.DefaultBody));
1198 }
void CompileStringSwitchExpression(SwitchExpression node)
void Compile(Expression expr, bool asVoid)
void CompileConditionalExpression(Expression expr, bool asVoid)
void UndefineLocal(LocalDefinition definition, int end)
LocalDefinition DefineLocal(ParameterExpression variable, int start)

References System.Linq.Expressions.Interpreter.LightCompiler._instructions, System.Linq.Expressions.Interpreter.LightCompiler._locals, System.Linq.Expressions.Interpreter.LightCompiler.Compile(), System.Linq.Expressions.Interpreter.LightCompiler.CompileAsVoid(), System.Linq.Expressions.Interpreter.LightCompiler.CompileConditionalExpression(), System.Linq.Expressions.Interpreter.LightCompiler.CompileLabelExpression(), System.Linq.Expressions.Interpreter.LightCompiler.CompileStringSwitchExpression(), System.Linq.Expressions.Expression< TDelegate >.Condition(), System.Linq.Expressions.Interpreter.InstructionList.Count, System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.Linq.Expressions.Interpreter.LocalVariables.DefineLocal(), System.Linq.Expressions.Interpreter.InstructionList.EmitStoreLocal(), System.Linq.Expressions.Utils.Empty, System.Linq.Expressions.Expression< TDelegate >.Equal(), System.Linq.Expressions.Expression< TDelegate >.Goto(), System.Linq.Expressions.Expression< TDelegate >.Label(), System.Linq.Expressions.Expression< TDelegate >.Parameter(), System.Linq.Expressions.CachedReflectionInfo.String_op_Equality_String_String, System.Linq.Expressions.SwitchCase.TestValues, and System.Linq.Expressions.Interpreter.LocalVariables.UndefineLocal().

Referenced by System.Linq.Expressions.Interpreter.LightCompiler.CompileNoLabelPush().