Skip to content

Commit 548779a

Browse files
authored
Merge pull request #521 from dadhi/copilot/optimize-expression-representation
Add flat LightExpression model with direct FE builder API, fill remaining LE conversion gaps, add LE vs FE creation benchmark, and start deterministic FE/LE property testing
2 parents 7dbafcf + 46072b5 commit 548779a

7 files changed

Lines changed: 2122 additions & 24 deletions

File tree

src/FastExpressionCompiler.LightExpression/Expression.cs

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2773,11 +2773,11 @@ internal static Expression ConvertToLightExpression(SysExpr sysExpr, ref SmallLi
27732773
var pe = (System.Linq.Expressions.ParameterExpression)sysExpr;
27742774
return Expression.Parameter(pe.IsByRef ? exprType.MakeByRefType() : exprType, pe.Name);
27752775
}
2776-
case ExpressionType.Lambda:
2777-
{
2778-
var le = (System.Linq.Expressions.LambdaExpression)sysExpr;
2779-
var body = le.Body.ToLightExpression(ref exprsConverted);
2780-
var retType = le.ReturnType;
2776+
case ExpressionType.Lambda:
2777+
{
2778+
var le = (System.Linq.Expressions.LambdaExpression)sysExpr;
2779+
var body = le.Body.ToLightExpression(ref exprsConverted);
2780+
var retType = le.ReturnType;
27812781
var pars = le.Parameters;
27822782
var parCount = pars.Count;
27832783
switch (parCount)
@@ -2819,16 +2819,40 @@ internal static Expression ConvertToLightExpression(SysExpr sysExpr, ref SmallLi
28192819
(ParameterExpression)pars[5].ToLightExpression(ref exprsConverted), retType);
28202820
default:
28212821
var pes = new ParameterExpression[parCount];
2822-
for (var i = 0; i < pes.Length; i++)
2823-
pes[i] = (ParameterExpression)le.Parameters[i].ToLightExpression(ref exprsConverted);
2824-
return Expression.Lambda(exprType, body, pes, retType);
2825-
}
2826-
}
2827-
default:
2828-
if (sysExpr is System.Linq.Expressions.UnaryExpression ue)
2829-
{
2830-
var operand = ue.Operand.ToLightExpression(ref exprsConverted);
2831-
return Expression.MakeUnary(nodeType, operand, exprType, ue.Method);
2822+
for (var i = 0; i < pes.Length; i++)
2823+
pes[i] = (ParameterExpression)le.Parameters[i].ToLightExpression(ref exprsConverted);
2824+
return Expression.Lambda(exprType, body, pes, retType);
2825+
}
2826+
}
2827+
case ExpressionType.Dynamic:
2828+
{
2829+
var de = (System.Linq.Expressions.DynamicExpression)sysExpr;
2830+
var sysArgs = de.Arguments;
2831+
var args = new Expression[sysArgs.Count];
2832+
for (var i = 0; i < args.Length; ++i)
2833+
args[i] = sysArgs[i].ToLightExpression(ref exprsConverted);
2834+
return new DynamicExpression(de.DelegateType, de.Binder, args);
2835+
}
2836+
case ExpressionType.RuntimeVariables:
2837+
{
2838+
var rve = (System.Linq.Expressions.RuntimeVariablesExpression)sysExpr;
2839+
var sysVars = rve.Variables;
2840+
var vars = new ParameterExpression[sysVars.Count];
2841+
for (var i = 0; i < vars.Length; ++i)
2842+
vars[i] = (ParameterExpression)sysVars[i].ToLightExpression(ref exprsConverted);
2843+
return new RuntimeVariablesExpression(vars);
2844+
}
2845+
case ExpressionType.DebugInfo:
2846+
{
2847+
var die = (System.Linq.Expressions.DebugInfoExpression)sysExpr;
2848+
return Expression.DebugInfo(new SymbolDocumentInfo(die.Document.FileName),
2849+
die.StartLine, die.StartColumn, die.EndLine, die.EndColumn);
2850+
}
2851+
default:
2852+
if (sysExpr is System.Linq.Expressions.UnaryExpression ue)
2853+
{
2854+
var operand = ue.Operand.ToLightExpression(ref exprsConverted);
2855+
return Expression.MakeUnary(nodeType, operand, exprType, ue.Method);
28322856
}
28332857

28342858
if (sysExpr is System.Linq.Expressions.BinaryExpression be)
@@ -5924,4 +5948,4 @@ public interface IParameterProvider
59245948
ParameterExpression GetParameter(int index);
59255949
}
59265950

5927-
#nullable restore
5951+
#nullable restore

0 commit comments

Comments
 (0)