@@ -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,36 +268,34 @@ 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 ) ) ; 
275280                return  loop ; 
276281            } 
277-             static Expression  Using ( Expression  disposable ,  Expression  body ) 
282+             static Expression  Using ( Expression  target ,  Expression  body ) 
278283            { 
279-                 Expression  disposeCall ; 
280-                 if  ( typeof ( IDisposable ) . IsAssignableFrom ( disposable . Type ) ) 
284+                 Expression  finallyDispose ; 
285+                 if  ( typeof ( IDisposable ) . IsAssignableFrom ( target . Type ) ) 
281286                { 
282-                     disposeCall  =  Expression . Call ( disposable ,  DisposeMethod ) ; 
287+                     finallyDispose  =  Expression . Call ( target ,  DisposeMethod ) ; 
283288                } 
284289                else 
285290                { 
286-                     if  ( disposable . Type . IsValueType ) 
291+                     if  ( target . Type . IsValueType ) 
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 ( target ,  typeof ( IDisposable ) ) ) ; 
296+                     finallyDispose  =  Block ( DisposableArray ,  assignDisposable ,  DisposeCall ) ; 
293297                } 
294-                 return  TryFinally ( body ,  disposeCall ) ; 
298+                 return  TryFinally ( body ,  finallyDispose ) ; 
295299            } 
296300        } 
297301        // Expression.Property(string) is inefficient because it does a case insensitive match 
0 commit comments