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

◆ EmitLift()

void System.Linq.Expressions.Compiler.LambdaCompiler.EmitLift ( ExpressionType nodeType,
Type resultType,
MethodCallExpression mc,
ParameterExpression[] paramList,
Expression[] argList )
inlineprivate

Definition at line 1939 of file LambdaCompiler.cs.

1940 {
1941 switch (nodeType)
1942 {
1943 default:
1944 {
1950 int j = 0;
1951 for (int num2 = paramList.Length; j < num2; j++)
1952 {
1953 ParameterExpression variable2 = paramList[j];
1955 if (expression2.Type.IsNullableType())
1956 {
1957 _scope.AddLocal(this, variable2);
1960 _ilg.EmitHasValue(expression2.Type);
1964 _ilg.EmitGetValueOrDefault(expression2.Type);
1966 }
1967 else
1968 {
1969 _scope.AddLocal(this, variable2);
1971 if (!expression2.Type.IsValueType)
1972 {
1977 }
1979 }
1982 }
1984 if (resultType.IsNullableType() && !TypeUtils.AreEquivalent(resultType, mc.Type))
1985 {
1988 }
1991 if (TypeUtils.AreEquivalent(resultType, mc.Type.GetNullableType()))
1992 {
1993 if (resultType.IsValueType)
1994 {
2000 }
2001 else
2002 {
2004 }
2005 }
2006 else
2007 {
2009 }
2012 break;
2013 }
2014 case ExpressionType.Equal:
2015 case ExpressionType.NotEqual:
2016 if (!TypeUtils.AreEquivalent(resultType, mc.Type.GetNullableType()))
2017 {
2027 int i = 0;
2028 for (int num = paramList.Length; i < num; i++)
2029 {
2030 ParameterExpression variable = paramList[i];
2032 _scope.AddLocal(this, variable);
2033 if (expression.Type.IsNullableType())
2034 {
2037 _ilg.EmitHasValue(expression.Type);
2047 _ilg.EmitGetValueOrDefault(expression.Type);
2048 }
2049 else
2050 {
2052 if (!expression.Type.IsValueType)
2053 {
2064 }
2065 else
2066 {
2069 }
2070 }
2072 }
2078 if (resultType.IsNullableType() && !TypeUtils.AreEquivalent(resultType, mc.Type))
2079 {
2082 }
2085 _ilg.EmitPrimitive(nodeType == ExpressionType.Equal);
2088 _ilg.EmitPrimitive(nodeType == ExpressionType.NotEqual);
2092 break;
2093 }
2094 goto default;
2095 }
2096 }
static ConstructorInfo GetNullableConstructor(Type nullableType)
Definition TypeUtils.cs:34
static bool AreEquivalent(Type t1, Type t2)
Definition TypeUtils.cs:664
void EmitSet(ParameterExpression variable)
void AddLocal(LambdaCompiler gen, ParameterExpression variable)
void EmitAddress(Expression node, Type type)
void EmitMethodCallExpression(Expression expr, CompilationFlags flags)
virtual void MarkLabel(Label loc)
virtual void Emit(OpCode opcode)
static readonly OpCode Ldloca
Definition OpCodes.cs:427
static readonly OpCode Brtrue
Definition OpCodes.cs:119
static readonly OpCode Br_S
Definition OpCodes.cs:89
static readonly OpCode Or
Definition OpCodes.cs:195
static readonly OpCode Stloc
Definition OpCodes.cs:429
static readonly OpCode Newobj
Definition OpCodes.cs:233
static readonly OpCode And
Definition OpCodes.cs:193
static readonly OpCode Initobj
Definition OpCodes.cs:441
static readonly OpCode Ceq
Definition OpCodes.cs:405
static readonly OpCode Ldc_I4_1
Definition OpCodes.cs:51
static readonly OpCode Ldc_I4_0
Definition OpCodes.cs:49
static readonly OpCode Ldloc
Definition OpCodes.cs:425
static readonly OpCode Ldnull
Definition OpCodes.cs:45
static readonly OpCode Dup
Definition OpCodes.cs:77

References System.Linq.Expressions.Compiler.LambdaCompiler._ilg, System.Linq.Expressions.Compiler.LambdaCompiler._scope, System.Linq.Expressions.Compiler.CompilerScope.AddLocal(), System.Reflection.Emit.OpCodes.And, System.Dynamic.Utils.TypeUtils.AreEquivalent(), System.Reflection.Emit.OpCodes.Br_S, System.Reflection.Emit.OpCodes.Brtrue, System.Reflection.Emit.OpCodes.Ceq, System.Reflection.Emit.ILGenerator.DefineLabel(), System.Reflection.Emit.OpCodes.Dup, System.Reflection.Emit.ILGenerator.Emit(), System.Linq.Expressions.Compiler.LambdaCompiler.EmitAddress(), System.Linq.Expressions.Compiler.LambdaCompiler.EmitExpression(), System.Linq.Expressions.Compiler.LambdaCompiler.EmitMethodCallExpression(), System.Linq.Expressions.Compiler.CompilerScope.EmitSet(), System.Linq.Expressions.Compiler.LambdaCompiler.FreeLocal(), System.Linq.Expressions.Compiler.LambdaCompiler.GetLocal(), System.Dynamic.Utils.TypeUtils.GetNullableConstructor(), System.Reflection.Emit.OpCodes.Initobj, System.Reflection.Emit.OpCodes.Ldc_I4_0, System.Reflection.Emit.OpCodes.Ldc_I4_1, System.Reflection.Emit.OpCodes.Ldloc, System.Reflection.Emit.OpCodes.Ldloca, System.Reflection.Emit.OpCodes.Ldnull, System.Reflection.Emit.ILGenerator.MarkLabel(), System.Reflection.Emit.OpCodes.Newobj, System.Reflection.Emit.OpCodes.Or, and System.Reflection.Emit.OpCodes.Stloc.

Referenced by System.Linq.Expressions.Compiler.LambdaCompiler.EmitBinaryMethod(), and System.Linq.Expressions.Compiler.LambdaCompiler.EmitUnaryMethod().