Skip to content

Commit 4c1bcc0

Browse files
committed
proper use of CompilerFlags.DisableInterpreter
1 parent c8bedec commit 4c1bcc0

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

src/FastExpressionCompiler/FastExpressionCompiler.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)