From 817603e87350f96b2cf1fd57158fe59da8de4be3 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Fri, 17 Jan 2020 14:50:31 -0800 Subject: [PATCH] Remove capturing lambda from binding hot path (#41055) Capturing lambdas should be avoided in core compiler code as they generate excess allocations Fixes #41054 --- .../Portable/Binder/Binder_Expressions.cs | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs index ce1bc9413ca..fdd8adeffd4 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs @@ -274,15 +274,22 @@ internal BoundExpression BindToNaturalType(BoundExpression expression, Diagnosti } break; case BoundTupleLiteral sourceTuple: - result = new BoundConvertedTupleLiteral( - sourceTuple.Syntax, - sourceTuple, - wasTargetTyped: false, - sourceTuple.Arguments.SelectAsArray(e => BindToNaturalType(e, diagnostics, reportDefaultMissingType)), - sourceTuple.ArgumentNamesOpt, - sourceTuple.InferredNamesOpt, - sourceTuple.Type, // same type to keep original element names - sourceTuple.HasErrors).WithSuppression(sourceTuple.IsSuppressed); + { + var boundArgs = ArrayBuilder.GetInstance(sourceTuple.Arguments.Length); + foreach (var arg in sourceTuple.Arguments) + { + boundArgs.Add(BindToNaturalType(arg, diagnostics, reportDefaultMissingType)); + } + result = new BoundConvertedTupleLiteral( + sourceTuple.Syntax, + sourceTuple, + wasTargetTyped: false, + boundArgs.ToImmutableAndFree(), + sourceTuple.ArgumentNamesOpt, + sourceTuple.InferredNamesOpt, + sourceTuple.Type, // same type to keep original element names + sourceTuple.HasErrors).WithSuppression(sourceTuple.IsSuppressed); + } break; case BoundDefaultLiteral defaultExpr: { -- GitLab