Skip to content

Commit 150bdd6

Browse files
Copilotdadhi
andauthored
fix: finalize flat expression direct builder review notes
Agent-Logs-Url: https://github.com/dadhi/FastExpressionCompiler/sessions/15dd11ed-8bf0-4fd4-b514-3d2ff4e4e346 Co-authored-by: dadhi <39516+dadhi@users.noreply.github.com>
1 parent b6a8952 commit 150bdd6

2 files changed

Lines changed: 14 additions & 6 deletions

File tree

src/FastExpressionCompiler.LightExpression/FlatExpression.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -783,18 +783,18 @@ ExpressionType.Equal or ExpressionType.NotEqual or ExpressionType.GreaterThan or
783783
};
784784
}
785785

786-
private static Type GetArrayElementType(Type arrayType, int rank)
786+
private static Type GetArrayElementType(Type arrayType, int depth)
787787
{
788788
var elementType = arrayType;
789-
for (var i = 0; i < rank; ++i)
789+
for (var i = 0; i < depth; ++i)
790790
elementType = elementType.GetElementType();
791791
return elementType ?? typeof(object);
792792
}
793793

794794
private int CloneChild(int index)
795795
{
796796
ref var node = ref Nodes[index];
797-
return node.ChildCount == 0
797+
return ShouldCloneWhenLinking(node)
798798
? AddNode(node.Type, node.Obj, node.NodeType, node.Kind, null, node.ChildIdx)
799799
: index;
800800
}
@@ -810,6 +810,14 @@ private int[] CloneChildrenToArray(IEnumerable<int> children)
810810
return cloned.ToArray();
811811
}
812812

813+
// Any leaf reused in more than one parent would have its intrusive sibling link (`NextIdx`) overwritten.
814+
// Clone the leaf before linking so the direct builder API may safely reuse returned indexes for
815+
// parameters, labels, constants, default values and parameterless `new` expressions.
816+
private static bool ShouldCloneWhenLinking(in ExprNode node) =>
817+
node.Kind == ExprNodeKind.LabelTarget ||
818+
node.NodeType == ExpressionType.Parameter ||
819+
node.ChildCount == 0;
820+
813821
private static IEnumerable<int> Single(int item)
814822
{
815823
yield return item;

test/FastExpressionCompiler.LightExpression.UnitTests/LightExpressionTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -473,11 +473,11 @@ public void Can_build_flat_expression_control_flow_directly()
473473

474474
var sysLambda = (System.Linq.Expressions.LambdaExpression)fe.ToExpression();
475475
var block = (System.Linq.Expressions.BlockExpression)sysLambda.Body;
476-
var @goto = (System.Linq.Expressions.GotoExpression)block.Expressions[0];
476+
var gotoExpr = (System.Linq.Expressions.GotoExpression)block.Expressions[0];
477477
var label = (System.Linq.Expressions.LabelExpression)block.Expressions[1];
478478

479-
Asserts.AreSame(sysLambda.Parameters[0], @goto.Value);
480-
Asserts.AreSame(@goto.Target, label.Target);
479+
Asserts.AreSame(sysLambda.Parameters[0], gotoExpr.Value);
480+
Asserts.AreSame(gotoExpr.Target, label.Target);
481481
}
482482

483483
public class A

0 commit comments

Comments
 (0)