@@ -33,6 +33,12 @@ public static class ExpressionBuilder
3333 private static readonly MethodInfo CheckContextMethod = typeof ( ResolutionContext ) . GetStaticMethod ( nameof ( ResolutionContext . CheckContext ) ) ;
3434 private static readonly MethodInfo ContextMapMethod = typeof ( ResolutionContext ) . GetInstanceMethod ( nameof ( ResolutionContext . MapInternal ) ) ;
3535 private static readonly MethodInfo ArrayEmptyMethod = typeof ( Array ) . GetStaticMethod ( nameof ( Array . Empty ) ) ;
36+ private static readonly ParameterExpression Disposable = Variable ( typeof ( IDisposable ) , "disposableEnumerator" ) ;
37+ private static readonly ParameterExpression [ ] DisposableArray = new [ ] { Disposable } ;
38+ private static readonly Expression DisposeCall = IfNullElse ( Disposable , Empty , Expression . Call ( Disposable , DisposeMethod ) ) ;
39+ private static readonly ParameterExpression Index = Variable ( typeof ( int ) , "sourceArrayIndex" ) ;
40+ private static readonly BinaryExpression ResetIndex = Assign ( Index , Zero ) ;
41+ private static readonly UnaryExpression IncrementIndex = PostIncrementAssign ( Index ) ;
3642
3743 public static Expression MapExpression ( this IGlobalConfiguration configurationProvider , ProfileMap profileMap , TypePair typePair , Expression sourceParameter ,
3844 MemberMap propertyMap = null , Expression destinationParameter = null )
@@ -262,13 +268,12 @@ public static Expression ForEach(ParameterExpression loopVar, Expression collect
262268 static Expression ForEachArrayItem ( ParameterExpression loopVar , Expression array , Expression loopContent )
263269 {
264270 var breakLabel = Label ( "LoopBreak" ) ;
265- var index = Variable ( typeof ( int ) , "sourceArrayIndex" ) ;
266- var loop = Block ( new [ ] { index , loopVar } ,
267- Assign ( index , Zero ) ,
271+ var loop = Block ( new [ ] { Index , loopVar } ,
272+ ResetIndex ,
268273 Loop (
269274 IfThenElse (
270- LessThan ( index , ArrayLength ( array ) ) ,
271- Block ( Assign ( loopVar , ArrayAccess ( array , index ) ) , loopContent , PostIncrementAssign ( index ) ) ,
275+ LessThan ( Index , ArrayLength ( array ) ) ,
276+ Block ( Assign ( loopVar , ArrayAccess ( array , Index ) ) , loopContent , IncrementIndex ) ,
272277 Break ( breakLabel )
273278 ) ,
274279 breakLabel ) ) ;
@@ -287,9 +292,8 @@ static Expression Using(Expression disposable, Expression body)
287292 {
288293 return body ;
289294 }
290- var disposableVariable = Variable ( typeof ( IDisposable ) , "disposableVariable" ) ;
291- var assignDisposable = Assign ( disposableVariable , TypeAs ( disposable , typeof ( IDisposable ) ) ) ;
292- disposeCall = Block ( new [ ] { disposableVariable } , assignDisposable , IfNullElse ( disposableVariable , Empty , Expression . Call ( disposableVariable , DisposeMethod ) ) ) ;
295+ var assignDisposable = Assign ( Disposable , TypeAs ( disposable , typeof ( IDisposable ) ) ) ;
296+ disposeCall = Block ( DisposableArray , assignDisposable , DisposeCall ) ;
293297 }
294298 return TryFinally ( body , disposeCall ) ;
295299 }
0 commit comments