Bot releases are visible (Hide)
Published by dadhi 6 months ago
feat: #133 Optimize Switch Expression
feat: #393 Support ToCSharpString of the block in the ternary expression
feat: #396 Optimize conditional expressions with the DefaultExpression left or right operand the same way as ConstantExpression
fix: #390 System.AccessViolationException when mapping using Mapster
fix: #391 ToCSharpString outputs ? for Nullable which does not produce the compile-able code
fix: #392 ToExpressionString wrongly declares Label instead of LabelTarget array
fix: #394 Calling a user defined == operator runs into a CLR invalid program exception
fix: #397 Fix and optimize the Switch support
fix: #399 Coalesce nullable with 0 is not working
fix: #400 Fix the direct assignment of Try to Member expression because indirect assignment through tmp var works
fix: #401 Invoke inlining is not working with collections in AutoMapper tests
fix: #404 An expression with a single parameter concatenated to a string causes 'Exception has been thrown by the target of an invocation' during delegate invocation
fix: #405 NullReferenceException with V4.X when using long?[]
fix: #406 NullReferenceException with V4.X
fix: #407 NullReferenceException when setting the Enum field
fix: #408 Dictionary mapping failing when the InvocationExpression inlining is involved
Published by dadhi 9 months ago
Published by dadhi 11 months ago
Published by dadhi 11 months ago
fixed: #352 xxxAssign doesn't work with MemberAccess
fixed: #353 NullReferenceException when calling CompileFast() results
fixed: #357 Invalid program exception
fixed: #366 FastExpressionCompiler[v3.3.4] gives incorrect results in some linq operations
fixed: #368 Fix duplicate nested lambda compilation
fixed: #374 CompileFast doesn't work with HasFlag
added: #264 Optimize the array index emit to emit specific Ldelem_ code instead of generic Ldelem
added: #273 Implement IArgumentProvider for the BlockExpression to minimize the consumed memory
added: #346 Is it possible to implement ref local variables?
added: #359 Improve the performance of variable lookup
added: #367 Better diagnostics and debugging with error codes from Collect and Compile rounds
added: #369 Decrease memory occupied by the LightExpression Block by storing Expression in SmallList (partly on stack)
added: #370 Optimize any nested lambda compilation (LINQ) by compiling right after collect one-by-one
added: #372 Support LightExpression.Expression.TryConvertDelegateIntrinsic for converting one type of delegate to another
added: #373 Support custom C# printing for the LightExpression.Expression
Published by dadhi almost 2 years ago
fixed: #345 EmitCall is for the varargs method and should not be used for normal convention
fixed: #347 InvalidProgramException on compiling an expression that returns a record which implements IList
fixed: #349 Error when loading struct parameters closed by the nested lambda e.g. predicate in Linq
fixed: #355 Error with converting to/from signed/unsigned integers (Thanks to @TYoungSL for the PR!)
fixed: the C# output for if-else test condition, and inc/dec operations; and for label at the end of the lambda
fixed: ref assignment C# output
perf: Replace ILGenerator.Emit(OpCodes.Call, ..) with EmitMethodCall performance
Published by dadhi about 2 years ago
Published by dadhi over 2 years ago
Published by dadhi over 2 years ago
Published by dadhi over 2 years ago
Published by dadhi over 2 years ago
Published by dadhi about 3 years ago
Published by dadhi over 3 years ago
Published by dadhi over 3 years ago
Published by dadhi over 3 years ago
Published by dadhi over 3 years ago
Published by dadhi over 3 years ago
Published by dadhi over 3 years ago
ToCSharpString()
, specifically in the TryCatch, and the Goto, and the Label expressionsPublished by dadhi over 3 years ago
fixed: #298 LightExpression with the NewExpression of 4 arguments has ArgumentCount = 3
Published by dadhi over 3 years ago
This version contains a lot of fixes and improvements and as-little-as-possible breaking changes.
ToCSharpString()
extension method to output the compile-able C# code described by the expression (tries hard).ToExpressionString()
extension method to output the valid expression construction syntax, so given an expression object you'll get e.g. Lambda(New(...))
.enum CompilerFlags { Default, NoInvocationLambdaInlining, EnableDelegateDebugInfo}
parameter for the compilationEnableDelegateDebugInfo
adds the diagnostic info into the compiled delegate including its source Expression and C# code. Can be used as following: var f = e.CompileFast(true, CompilerFlags.EnableDelegateDebugInfo);
var di = f.Target as IDelegateDebugInfo;
Assert.IsNotNull(di.Expression);
Assert.IsNotNull(di.ExpressionString);
Assert.IsNotNull(di.CSharpString);
ExpressionVisitor
.FastExpressionCompiler.LightExpression.Expression
and the System.Linq.Expression
.IArgumentProvider
and IParameterProvider
for some expressions.Published by dadhi over 5 years ago
Contains breaking changes, but likely or lucky you'll need to re-compile only.
V2 was developed with a strong help of @jogibear9988, @dzmitry-lahoda, @MaceWindu,
and other contributors - kudos to all of them!
FEC package now is split in two: [FastExpressionCompiler (FEC)] and [FastExpressionCompiler.LightExpression (FEC.LE)]. The packages are not dependent on each other and may be used together.
FEC.LightExpression allows a drop-in replacement for manually created expression, the only change is different namespace using. LE.Expression is "lighter" because it is faster created and consumes less memory. It does it by avoiding most of compatibility and verification checks. But it does not mean it is not safe! You can convert it to System Expression as easy as calling ToExpression
or ToLambdaExpression
and it will run the usual verification. This conversation also enables fallback to Expression.Compile
inside the CompileFast
.
ExpressionInfo
and supporting logic is moved from FEC to FEC.LEExpressionInfo
is renamed to Expression
but moved into new namespace FastExpressionCompiler.LightExpression
ExpressionInfo
noise and now is much simpler and lost 33% LOC.LIGHT_EXPRESSION
build variable controlling what to compile: System.Linq.Expressions.Expression
or FastExpressionCompiler.LightExpression
int.TryParse