Skip to content

Commit

Permalink
Fix invalid optimization on maps with non-constant indices.
Browse files Browse the repository at this point in the history
  • Loading branch information
r3c committed Mar 15, 2020
1 parent c2a25d8 commit d5078d8
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/Cottle.Test/Parsers/OptimizeParserTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public void Parse_OptimizeAccess_SkipWhenNonPureIndices()
new[]
{
new ExpressionElement(Expression.CreateConstant(0),
Expression.CreateInvoke(OptimizeParserTester.ImpureFunction, Array.Empty<Expression>())),
Expression.CreateSymbol("AAA")),
new ExpressionElement(Expression.CreateConstant(1),
Expression.CreateSymbol("BBB")),
new ExpressionElement(Expression.CreateSymbol("x"),
Expand Down
10 changes: 5 additions & 5 deletions src/Cottle/Parsers/Optimize/Optimizers/RecursiveOptimizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,18 @@ internal class RecursiveOptimizer : IOptimizer
return Expression.CreateConstant(source.Value.Fields[subscript]);
case ExpressionType.Map:
var impure = false;
var unsure = false;
var value = Expression.Void;
foreach (var element in source.Elements)
{
if (!RecursiveOptimizer.IsPure(element.Key) || !RecursiveOptimizer.IsPure(element.Value))
impure = true;
else if (element.Key.Type == ExpressionType.Constant && element.Key.Value == subscript)
if (element.Key.Type != ExpressionType.Constant || !RecursiveOptimizer.IsPure(element.Value))
unsure = true;
else if (element.Key.Value == subscript)
value = element.Value;
}
return impure ? expression : value;
return unsure ? expression : value;
default:
return expression;
Expand Down

0 comments on commit d5078d8

Please sign in to comment.