Skip to content

Commit 3afa7bf

Browse files
authored
Merge pull request #171 from codingseb/dev
Dev
2 parents 0685013 + 08d47dd commit 3afa7bf

File tree

3 files changed

+45
-37
lines changed

3 files changed

+45
-37
lines changed

CodingSeb.ExpressionEvaluator.Tests/ExpressionEvaluatorTests.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Newtonsoft.Json;
1+
using Microsoft.CSharp.RuntimeBinder;
2+
using Newtonsoft.Json;
23
using NUnit.Framework;
34
using Shouldly;
45
using System;
@@ -1837,6 +1838,15 @@ public void Evaluate_DoubleDoubleQuotesInEscapedStringThrowException()
18371838

18381839
evaluator.Evaluate("@\"Hello \"\" Joe\"").ShouldBe(@"Hello "" Joe");
18391840
}
1841+
1842+
[Test]
1843+
[Category("Bug")]
1844+
public void Evaluate_NullAdditionShouldThrowExceptionNotReturnString()
1845+
{
1846+
var evaluator = new ExpressionEvaluator();
1847+
1848+
Should.Throw<RuntimeBinderException>(() => evaluator.Evaluate("(null + null) + null"));
1849+
}
18401850

18411851
//[Test]
18421852
//[Category("Bug")]

CodingSeb.ExpressionEvaluator/CodingSeb.ExpressionEvaluator.csproj

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
<Product>CodingSeb.ExpressionEvaluator</Product>
66
<Description>A Simple Math and Pseudo C# Expression Evaluator in One C# File. Can also execute small C# like scripts</Description>
77
<Copyright>Copyright © Coding Seb 2017</Copyright>
8-
<Version>1.4.40.0</Version>
9-
<AssemblyVersion>1.4.40.0</AssemblyVersion>
10-
<FileVersion>1.4.40.0</FileVersion>
8+
<Version>1.4.41.0</Version>
9+
<AssemblyVersion>1.4.41.0</AssemblyVersion>
10+
<FileVersion>1.4.41.0</FileVersion>
1111
<OutputPath>bin\$(Configuration)\</OutputPath>
1212
<Authors>Coding Seb</Authors>
1313
<PackageId>CodingSeb.ExpressionEvaluator</PackageId>
@@ -20,9 +20,7 @@
2020
<PackageIconUrl>https://github.com/codingseb/ExpressionEvaluator/blob/master/Icon.png?raw=true</PackageIconUrl>
2121
<PackageIcon>Icon.png</PackageIcon>
2222
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
23-
<PackageReleaseNotes>* Make shared cache for types resolution thread safe
24-
* Add ScriptEvaluating and ScriptEvaluated events
25-
* Add unaryOperatorsDictionary to manage custom operators that are both unaries and binaries better</PackageReleaseNotes>
23+
<PackageReleaseNotes>* fix: addition of null and bubble container</PackageReleaseNotes>
2624
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
2725
<RepositoryUrl>https://github.com/codingseb/ExpressionEvaluator</RepositoryUrl>
2826
<GenerateDocumentationFile>true</GenerateDocumentationFile>

CodingSeb.ExpressionEvaluator/ExpressionEvaluator.cs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/******************************************************************************************************
22
Title : ExpressionEvaluator (https://github.com/codingseb/ExpressionEvaluator)
3-
Version : 1.4.40.0
3+
Version : 1.4.41.0
44
(if last digit (the forth) is not a zero, the version is an intermediate version and can be unstable)
55
66
Author : Coding Seb
@@ -242,56 +242,56 @@ protected enum TryBlockEvaluatedState
242242
{
243243
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
244244
{
245-
{ExpressionOperator.UnaryPlus, (dynamic _, dynamic right) => +right },
246-
{ExpressionOperator.UnaryMinus, (dynamic _, dynamic right) => -right },
247-
{ExpressionOperator.LogicalNegation, (dynamic _, dynamic right) => !right },
248-
{ExpressionOperator.BitwiseComplement, (dynamic _, dynamic right) => ~right },
249-
{ExpressionOperator.Cast, (dynamic left, dynamic right) => ChangeType(right, left) },
245+
{ExpressionOperator.UnaryPlus, (_, right) => +right },
246+
{ExpressionOperator.UnaryMinus, (_, right) => -right },
247+
{ExpressionOperator.LogicalNegation, (_, right) => !right },
248+
{ExpressionOperator.BitwiseComplement, (_, right) => ~right },
249+
{ExpressionOperator.Cast, (left, right) => ChangeType(right, left) },
250250
},
251251
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
252252
{
253-
{ExpressionOperator.Multiply, (dynamic left, dynamic right) => left * right },
254-
{ExpressionOperator.Divide, (dynamic left, dynamic right) => left / right },
255-
{ExpressionOperator.Modulo, (dynamic left, dynamic right) => left % right },
253+
{ExpressionOperator.Multiply, (left, right) => left * right },
254+
{ExpressionOperator.Divide, (left, right) => left / right },
255+
{ExpressionOperator.Modulo, (left, right) => left % right },
256256
},
257257
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
258258
{
259-
{ExpressionOperator.Plus, (dynamic left, dynamic right) => left + right },
260-
{ExpressionOperator.Minus, (dynamic left, dynamic right) => left - right },
259+
{ExpressionOperator.Plus, (left, right) => left + right },
260+
{ExpressionOperator.Minus, (left, right) => left - right },
261261
},
262262
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
263263
{
264-
{ExpressionOperator.ShiftBitsLeft, (dynamic left, dynamic right) => left << right },
265-
{ExpressionOperator.ShiftBitsRight, (dynamic left, dynamic right) => left >> right },
264+
{ExpressionOperator.ShiftBitsLeft, (left, right) => left << right },
265+
{ExpressionOperator.ShiftBitsRight, (left, right) => left >> right },
266266
},
267267
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
268268
{
269-
{ExpressionOperator.Lower, (dynamic left, dynamic right) => left < right },
270-
{ExpressionOperator.Greater, (dynamic left, dynamic right) => left > right },
271-
{ExpressionOperator.LowerOrEqual, (dynamic left, dynamic right) => left <= right },
272-
{ExpressionOperator.GreaterOrEqual, (dynamic left, dynamic right) => left >= right },
273-
{ExpressionOperator.Is, (dynamic left, dynamic right) => left != null && (((ClassOrEnumType)right).Type).IsAssignableFrom(left.GetType()) },
269+
{ExpressionOperator.Lower, (left, right) => left < right },
270+
{ExpressionOperator.Greater, (left, right) => left > right },
271+
{ExpressionOperator.LowerOrEqual, (left, right) => left <= right },
272+
{ExpressionOperator.GreaterOrEqual, (left, right) => left >= right },
273+
{ExpressionOperator.Is, (left, right) => left != null && (((ClassOrEnumType)right).Type).IsAssignableFrom(left.GetType()) },
274274
},
275275
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
276276
{
277-
{ExpressionOperator.Equal, (dynamic left, dynamic right) => left == right },
278-
{ExpressionOperator.NotEqual, (dynamic left, dynamic right) => left != right },
277+
{ExpressionOperator.Equal, (left, right) => left == right },
278+
{ExpressionOperator.NotEqual, (left, right) => left != right },
279279
},
280280
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
281281
{
282-
{ExpressionOperator.LogicalAnd, (dynamic left, dynamic right) => left & right },
282+
{ExpressionOperator.LogicalAnd, (left, right) => left & right },
283283
},
284284
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
285285
{
286-
{ExpressionOperator.LogicalXor, (dynamic left, dynamic right) => left ^ right },
286+
{ExpressionOperator.LogicalXor, (left, right) => left ^ right },
287287
},
288288
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
289289
{
290-
{ExpressionOperator.LogicalOr, (dynamic left, dynamic right) => left | right },
290+
{ExpressionOperator.LogicalOr, (left, right) => left | right },
291291
},
292292
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
293293
{
294-
{ExpressionOperator.ConditionalAnd, (dynamic left, dynamic right) => {
294+
{ExpressionOperator.ConditionalAnd, (left, right) => {
295295
if ( left is BubbleExceptionContainer leftExceptionContainer)
296296
{
297297
leftExceptionContainer.Throw();
@@ -314,7 +314,7 @@ protected enum TryBlockEvaluatedState
314314
},
315315
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
316316
{
317-
{ExpressionOperator.ConditionalOr, (dynamic left, dynamic right) => {
317+
{ExpressionOperator.ConditionalOr, (left, right) => {
318318
if ( left is BubbleExceptionContainer leftExceptionContainer)
319319
{
320320
leftExceptionContainer.Throw();
@@ -337,7 +337,7 @@ protected enum TryBlockEvaluatedState
337337
},
338338
new Dictionary<ExpressionOperator, Func<dynamic, dynamic, object>>()
339339
{
340-
{ExpressionOperator.NullCoalescing, (dynamic left, dynamic right) => left ?? right },
340+
{ExpressionOperator.NullCoalescing, (left, right) => left ?? right },
341341
},
342342
};
343343

@@ -3206,7 +3206,7 @@ protected virtual object ProcessStack(Stack<object> stack)
32063206
.Select(e => e is NullConditionalNullValue ? null : e)
32073207
.ToList();
32083208

3209-
OperatorsEvaluations.ToList().ForEach((IDictionary<ExpressionOperator, Func<dynamic, dynamic, object>> operatorEvalutationsDict) =>
3209+
OperatorsEvaluations.ToList().ForEach(operatorEvalutationsDict =>
32103210
{
32113211
for (int i = list.Count - 1; i >= 0; i--)
32123212
{
@@ -3296,11 +3296,11 @@ void EvaluateFirstPreviousUnaryOp(int j)
32963296
{
32973297
list[i] = operatorEvalutationsDict[eOp](left, right);
32983298

3299-
if (left is BubbleExceptionContainer && right is string)
3299+
if (left is BubbleExceptionContainer && (right == null || right is string))
33003300
{
33013301
list[i] = left; //Bubble up the causing error
33023302
}
3303-
else if (right is BubbleExceptionContainer && left is string)
3303+
else if (right is BubbleExceptionContainer && (left is string || left is null))
33043304
{
33053305
list[i] = right; //Bubble up the causing error
33063306
}
@@ -3481,7 +3481,7 @@ protected virtual bool GetLambdaExpression(string expression, Stack<object> stac
34813481

34823482
bool inScriptAtDeclaration = inScript;
34833483

3484-
stack.Push(new InternalDelegate((object[] args) =>
3484+
stack.Push(new InternalDelegate(args =>
34853485
{
34863486
var vars = new Dictionary<string, object>(variables);
34873487

0 commit comments

Comments
 (0)