From b2b3a1ac14cbda4844a93992e1341215df5212d4 Mon Sep 17 00:00:00 2001 From: Vitaliy Fedorchenko Date: Wed, 8 Jul 2020 21:38:18 +0300 Subject: [PATCH] Fixed an issue when comparison result is used as an argument in a method call #30 --- README.md | 2 +- src/NReco.LambdaParser.Tests/LambdaParserTests.cs | 2 ++ src/NReco.LambdaParser/Linq/LambdaParser.cs | 7 ++++++- src/NReco.LambdaParser/NReco.LambdaParser.csproj | 7 +++++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 75cdc45..29f4673 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,6 @@ var lambdaParser = new LambdaParser(valComparer); NReco.LambdaParser is in production use at [SeekTable.com](https://www.seektable.com/) and [PivotData microservice](https://www.nrecosite.com/pivotdata_service.aspx) (used for user-defined calculated cube members: formulas, custom formatting). ## License -Copyright 2016-2019 Vitaliy Fedorchenko +Copyright 2016-2020 Vitaliy Fedorchenko Distributed under the MIT license diff --git a/src/NReco.LambdaParser.Tests/LambdaParserTests.cs b/src/NReco.LambdaParser.Tests/LambdaParserTests.cs index dff729b..78e7ea3 100644 --- a/src/NReco.LambdaParser.Tests/LambdaParserTests.cs +++ b/src/NReco.LambdaParser.Tests/LambdaParserTests.cs @@ -41,6 +41,8 @@ public class LambdaParserTests { Assert.Equal("st", lambdaParser.Eval("test.Substring(2)", varContext ) ); + Assert.Equal(true, lambdaParser.Eval("NOT(NOT(1==1))", varContext)); + Assert.Equal(3M, lambdaParser.Eval("1+2", varContext) ); Assert.Equal(6M, lambdaParser.Eval("1+2+3", varContext)); Assert.Equal("b{0}_", lambdaParser.Eval("\"b{0}_\"", varContext)); diff --git a/src/NReco.LambdaParser/Linq/LambdaParser.cs b/src/NReco.LambdaParser/Linq/LambdaParser.cs index 8061f10..89cf891 100644 --- a/src/NReco.LambdaParser/Linq/LambdaParser.cs +++ b/src/NReco.LambdaParser/Linq/LambdaParser.cs @@ -536,7 +536,12 @@ internal class ExtractParamsVisitor : ExpressionVisitor { } // read parameter var paramExpr = ParseConditional(expr, end); - args.Add(paramExpr.Expr); + var argExpr = paramExpr.Expr; + if (!(argExpr is ConstantExpression constExpr && constExpr.Value is LambdaParameterWrapper)) { + // result may be a primitive type like bool + argExpr = Expression.Convert(argExpr, typeof(object)); + } + args.Add(argExpr); end = paramExpr.End; } while (true); } diff --git a/src/NReco.LambdaParser/NReco.LambdaParser.csproj b/src/NReco.LambdaParser/NReco.LambdaParser.csproj index 2d952e5..33c1a41 100644 --- a/src/NReco.LambdaParser/NReco.LambdaParser.csproj +++ b/src/NReco.LambdaParser/NReco.LambdaParser.csproj @@ -3,9 +3,9 @@ Runtime expressions parser and evaluator (formulas, conditions, method calls, properties/indexers etc). Builds LINQ expression tree and compiles it to lambda delegate with full support of dynamically typed variables. Dynamic expressions evaluator - Copyright (c) 2013-2019 Vitalii Fedorchenko + Copyright (c) 2013-2020 Vitalii Fedorchenko NReco.LambdaParser - 1.0.11 + 1.0.12 Vitalii Fedorchenko netstandard2.0;netstandard1.3;net45 @@ -17,6 +17,9 @@ NReco.LambdaParser LambdaParser;Formula;Parser;Math;Expression;Evaluator;Eval;LINQ-dynamic;PCL;netstandard;netcore;net40;net45;WindowsPhone8;Silverlight Source code and examples: https://github.com/nreco/lambdaparser +v.1.0.12 changes: +- fixed an issue when comparison result is used as an argument in a method call #30 + v.1.0.11 changes: - removed legacy Portable targets that cause build problems in some environments