@@ -496,10 +496,9 @@ internal static object TryCompileBoundToFirstClosureParam(Type delegateType, Exp
496496 {
497497#endif
498498 // Try to avoid compilation altogether for Func<bool> delegates via Interpreter, see #468
499- if ((flags & CompilerFlags.DisableInterpreter) == 0 &
500- returnType == typeof(bool) & closurePlusParamTypes.Length == 1
499+ if (returnType == typeof(bool) & closurePlusParamTypes.Length == 1
501500 && Interpreter.IsCandidateForInterpretation(bodyExpr)
502- && Interpreter.TryInterpretBool_new(out var result, bodyExpr))
501+ && Interpreter.TryInterpretBool_new(out var result, bodyExpr, flags ))
503502 return result ? Interpreter.TrueFunc : Interpreter.FalseFunc;
504503
505504 // The method collects the info from the all nested lambdas deep down up-front and de-duplicates the lambdas as well.
@@ -2081,8 +2080,7 @@ public static bool TryEmit(Expression expr,
20812080 case ExpressionType.Equal:
20822081 case ExpressionType.NotEqual:
20832082 {
2084- if ((setup & CompilerFlags.DisableInterpreter) == 0 && exprType.IsPrimitive &&
2085- Interpreter.TryInterpretBool_new(out var boolResult, expr))
2083+ if (exprType.IsPrimitive && Interpreter.TryInterpretBool_new(out var boolResult, expr, setup))
20862084 {
20872085 if ((parent & ParentFlags.IgnoreResult) == 0)
20882086 il.Demit(boolResult ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);
@@ -2102,8 +2100,8 @@ public static bool TryEmit(Expression expr,
21022100 case ExpressionType.LeftShift:
21032101 case ExpressionType.RightShift:
21042102 {
2105- return (setup & CompilerFlags.DisableInterpreter) == 0 && exprType.IsPrimitive
2106- && TryInterpretAndEmitResult(expr, il, parent)
2103+ return exprType.IsPrimitive
2104+ && TryInterpretAndEmitResult(expr, il, parent, setup )
21072105 || TryEmitArithmetic(((BinaryExpression)expr).Left, ((BinaryExpression)expr).Right, nodeType, exprType, paramExprs, il,
21082106 ref closure, setup, parent);
21092107 }
@@ -2118,8 +2116,7 @@ public static bool TryEmit(Expression expr,
21182116 case ExpressionType.AndAlso:
21192117 case ExpressionType.OrElse:
21202118 {
2121- if ((setup & CompilerFlags.DisableInterpreter) == 0 && exprType.IsPrimitive &&
2122- Interpreter.TryInterpretBool_new(out var resultBool, expr))
2119+ if (exprType.IsPrimitive && Interpreter.TryInterpretBool_new(out var resultBool, expr, setup))
21232120 {
21242121 if ((parent & ParentFlags.IgnoreResult) == 0)
21252122 il.Demit(resultBool ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);
@@ -2129,8 +2126,7 @@ public static bool TryEmit(Expression expr,
21292126 }
21302127 case ExpressionType.Not:
21312128 {
2132- if ((setup & CompilerFlags.DisableInterpreter) == 0 && exprType.IsPrimitive &&
2133- Interpreter.TryInterpretBool_new(out var resultBool, expr))
2129+ if (exprType.IsPrimitive && Interpreter.TryInterpretBool_new(out var resultBool, expr, setup))
21342130 {
21352131 if ((parent & ParentFlags.IgnoreResult) == 0)
21362132 il.Demit(resultBool ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);
@@ -5955,7 +5951,7 @@ private static bool TryEmitConditional(
59555951 ILGenerator il, ref ClosureInfo closure, CompilerFlags setup, ParentFlags parent)
59565952 {
59575953 // Try emit a single side of the condition based on the interpreted condition value
5958- if (Interpreter.TryInterpretBool_new(out var testIsTrue, testExpr))
5954+ if (Interpreter.TryInterpretBool_new(out var testIsTrue, testExpr, setup ))
59595955 return testIsTrue
59605956 ? TryEmit(ifTrueExpr, paramExprs, il, ref closure, setup, parent)
59615957 : TryEmit(ifFalseExpr, paramExprs, il, ref closure, setup, parent);
@@ -6396,10 +6392,12 @@ private static void EmitLoadArgAddress(ILGenerator il, int paramIndex)
63966392
63976393 /// <summary>Tries to interpret and emit the result IL
63986394 /// In case of exception return false, to allow FEC emit normally and throw in the invocation phase</summary>
6399- public static bool TryInterpretAndEmitResult(Expression expr, ILGenerator il, ParentFlags parent)
6395+ public static bool TryInterpretAndEmitResult(Expression expr, ILGenerator il, ParentFlags parent, CompilerFlags flags )
64006396 {
64016397 var type = expr.Type;
64026398 Debug.Assert(type.IsPrimitive);
6399+ if ((flags & CompilerFlags.DisableInterpreter) != 0)
6400+ return false;
64036401
64046402 var typeCode = Type.GetTypeCode(type);
64056403 try
@@ -7819,10 +7817,12 @@ public static bool TryInterpretBool(out bool result, Expression expr)
78197817
78207818 /// <summary>Wraps `TryInterpretPrimitive` in the try catch block.
78217819 /// In case of exception FEC will emit the whole computation to throw exception in the invocation phase</summary>
7822- public static bool TryInterpretBool_new(out bool result, Expression expr)
7820+ public static bool TryInterpretBool_new(out bool result, Expression expr, CompilerFlags flags )
78237821 {
78247822 Debug.Assert(expr.Type.IsPrimitive);
78257823 result = false;
7824+ if ((flags & CompilerFlags.DisableInterpreter) != 0)
7825+ return false;
78267826 try
78277827 {
78287828 var ok = TryInterpretBool(ref result, expr, expr.NodeType);
0 commit comments