@@ -570,7 +570,7 @@ public ClosureInfo(ClosureStatus status, object[] constValues = null, int[] cons
570570 constValues == null ? Tools . Empty < int > ( ) : constUsage ?? new int [ constValues . Length ] ) ;
571571
572572 NonPassedParameters = Tools . Empty < ParameterExpression > ( ) ;
573- NestedLambdas = Tools . Empty < NestedLambdaInfo > ( ) ;
573+ NestedLambdas = Tools . Empty < NestedLambdaInfo > ( ) ;
574574
575575 LastEmitIsAddress = false ;
576576 CurrentTryCatchFinallyIndex = - 1 ;
@@ -1317,13 +1317,15 @@ private static bool TryCollectBoundConstants(ref ClosureInfo closure, Expression
13171317 {
13181318 if ( blockVarExprs . Count == 1 )
13191319 closure . PushBlockWithVars ( blockVarExprs [ 0 ] ) ;
1320- else
1320+ else if ( blockVarExprs . Count != 0 )
13211321 closure . PushBlockWithVars ( blockVarExprs ) ;
13221322
13231323 for ( var i = 0 ; i < blockExprCount ; i ++ )
13241324 if ( ! TryCollectBoundConstants ( ref closure , blockExprs [ i ] , paramExprs , isNestedLambda , ref rootClosure , flags ) )
13251325 return false ;
1326- closure . PopBlock ( ) ;
1326+
1327+ if ( blockVarExprs . Count != 0 )
1328+ closure . PopBlock ( ) ;
13271329 }
13281330
13291331 return true ;
@@ -1823,8 +1825,7 @@ public static bool TryEmit(Expression expr, IReadOnlyList<PE> paramExprs,
18231825 case ExpressionType . ExclusiveOr :
18241826 case ExpressionType . LeftShift :
18251827 case ExpressionType . RightShift :
1826- var arithmeticExpr = ( BinaryExpression ) expr ;
1827- return TryEmitArithmetic ( arithmeticExpr , expr . NodeType , paramExprs , il , ref closure , setup , parent ) ;
1828+ return TryEmitArithmetic ( ( BinaryExpression ) expr , expr . NodeType , paramExprs , il , ref closure , setup , parent ) ;
18281829
18291830 case ExpressionType . AndAlso :
18301831 case ExpressionType . OrElse :
@@ -4469,10 +4470,9 @@ private static bool TryEmitArithmetic(BinaryExpression expr, ExpressionType expr
44694470 EmitStoreLocalVariableAndLoadItsAddress ( il , lefType ) ;
44704471
44714472 il . Emit ( OpCodes . Dup ) ;
4472- il . Emit ( OpCodes . Call , lefType . FindNullableHasValueGetterMethod ( ) ) ;
4473-
4473+ il . Emit ( OpCodes . Call , lefType . FindNullableHasValueGetterMethod ( ) ) ;
44744474 il . Emit ( OpCodes . Brfalse , leftNoValueLabel ) ;
4475- il . Emit ( OpCodes . Call , lefType . FindNullableGetValueOrDefaultMethod ( ) ) ;
4475+ il . Emit ( OpCodes . Call , lefType . FindNullableGetValueOrDefaultMethod ( ) ) ;
44764476 }
44774477 else if ( ! TryEmit ( leftExpr , paramExprs , il , ref closure , setup , flags ) )
44784478 return false ;
@@ -4491,9 +4491,9 @@ private static bool TryEmitArithmetic(BinaryExpression expr, ExpressionType expr
44914491 EmitStoreLocalVariableAndLoadItsAddress ( il , rightType ) ;
44924492
44934493 il . Emit ( OpCodes . Dup ) ;
4494- il . Emit ( OpCodes . Call , rightType . FindNullableHasValueGetterMethod ( ) ) ;
4494+ il . Emit ( OpCodes . Call , rightType . FindNullableHasValueGetterMethod ( ) ) ;
44954495 il . Emit ( OpCodes . Brfalse , rightNoValueLabel ) ;
4496- il . Emit ( OpCodes . Call , rightType . FindNullableGetValueOrDefaultMethod ( ) ) ;
4496+ il . Emit ( OpCodes . Call , rightType . FindNullableGetValueOrDefaultMethod ( ) ) ;
44974497 }
44984498 else if ( ! TryEmit ( rightExpr , paramExprs , il , ref closure , setup , flags ) )
44994499 return false ;
@@ -4518,8 +4518,7 @@ private static bool TryEmitArithmetic(BinaryExpression expr, ExpressionType expr
45184518 if ( exprType . IsNullable ( ) )
45194519 {
45204520 var endL = il . DefineLabel ( ) ;
4521- var locIndex = InitValueTypeVariable ( il , exprType ) ;
4522- EmitLoadLocalVariable ( il , locIndex ) ;
4521+ EmitLoadLocalVariable ( il , InitValueTypeVariable ( il , exprType ) ) ;
45234522 il . Emit ( OpCodes . Br_S , endL ) ;
45244523 il . MarkLabel ( valueLabel ) ;
45254524 il . Emit ( OpCodes . Newobj , exprType . GetTypeInfo ( ) . DeclaredConstructors . GetFirst ( ) ) ;
@@ -4566,14 +4565,14 @@ private static bool TryEmitArithmeticOperation(BinaryExpression expr, Expression
45664565 else
45674566 {
45684567 var methodName
4569- = exprNodeType == ExpressionType . Add ? "op_Addition"
4570- : exprNodeType == ExpressionType . AddChecked ? "op_Addition"
4571- : exprNodeType == ExpressionType . Subtract ? "op_Subtraction"
4568+ = exprNodeType == ExpressionType . Add ? "op_Addition"
4569+ : exprNodeType == ExpressionType . AddChecked ? "op_Addition"
4570+ : exprNodeType == ExpressionType . Subtract ? "op_Subtraction"
45724571 : exprNodeType == ExpressionType . SubtractChecked ? "op_Subtraction"
4573- : exprNodeType == ExpressionType . Multiply ? "op_Multiply"
4572+ : exprNodeType == ExpressionType . Multiply ? "op_Multiply"
45744573 : exprNodeType == ExpressionType . MultiplyChecked ? "op_Multiply"
4575- : exprNodeType == ExpressionType . Divide ? "op_Division"
4576- : exprNodeType == ExpressionType . Modulo ? "op_Modulus"
4574+ : exprNodeType == ExpressionType . Divide ? "op_Division"
4575+ : exprNodeType == ExpressionType . Modulo ? "op_Modulus"
45774576 : null ;
45784577
45794578 if ( methodName != null )
@@ -4590,7 +4589,6 @@ var methodName
45904589
45914590 if ( method == null )
45924591 return false ;
4593-
45944592 il . Emit ( method . IsVirtual ? OpCodes . Callvirt : OpCodes . Call , method ) ;
45954593 return true ;
45964594 }
@@ -5016,7 +5014,6 @@ internal static MethodInfo FindMethod(this Type type, string methodName)
50165014 for ( var i = 0 ; i < methods . Length ; i ++ )
50175015 if ( methods [ i ] . Name == methodName )
50185016 return methods [ i ] ;
5019-
50205017 return type . BaseType ? . FindMethod ( methodName ) ;
50215018 }
50225019
0 commit comments