From 7f286887bfccef5131f5976d74b60fe42c33b95f Mon Sep 17 00:00:00 2001 From: Dustin Campbell Date: Fri, 20 Feb 2015 12:43:20 -0800 Subject: [PATCH] Use ObjectPool rather than thread local storage --- ...ParenthesizedExpressionSyntaxExtensions.cs | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/Workspaces/CSharp/Portable/Extensions/ParenthesizedExpressionSyntaxExtensions.cs b/src/Workspaces/CSharp/Portable/Extensions/ParenthesizedExpressionSyntaxExtensions.cs index 452f73c2afb..91679707c28 100644 --- a/src/Workspaces/CSharp/Portable/Extensions/ParenthesizedExpressionSyntaxExtensions.cs +++ b/src/Workspaces/CSharp/Portable/Extensions/ParenthesizedExpressionSyntaxExtensions.cs @@ -123,8 +123,7 @@ public static bool CanRemoveParentheses(this ParenthesizedExpressionSyntax node) : false; } - [ThreadStatic] - private static Stack s_nodeStack; + private static readonly ObjectPool> s_nodeStackPool = new ObjectPool>(() => new Stack()); private static bool RemovalMayIntroduceInterpolationAmbiguity(ParenthesizedExpressionSyntax node) { @@ -148,38 +147,37 @@ private static bool RemovalMayIntroduceInterpolationAmbiguity(ParenthesizedExpre return false; } - if (s_nodeStack == null) + var stack = s_nodeStackPool.AllocateAndClear(); + try { - s_nodeStack = new Stack(); - } - else - { - s_nodeStack.Clear(); - } - - s_nodeStack.Push(node.Expression); - while (s_nodeStack.Count > 0) - { - var expression = s_nodeStack.Pop(); + stack.Push(node.Expression); - foreach (var nodeOrToken in expression.ChildNodesAndTokens()) + while (stack.Count > 0) { - // Note: There's no need drill into other parenthesized expressions, since any colons in them would be unambiguous. - if (nodeOrToken.IsNode && !nodeOrToken.IsKind(SyntaxKind.ParenthesizedExpression)) - { - s_nodeStack.Push(nodeOrToken.AsNode()); - } - else if (nodeOrToken.IsToken) + var expression = stack.Pop(); + + foreach (var nodeOrToken in expression.ChildNodesAndTokens()) { - if (nodeOrToken.IsKind(SyntaxKind.ColonToken) || nodeOrToken.IsKind(SyntaxKind.ColonColonToken)) + // Note: There's no need drill into other parenthesized expressions, since any colons in them would be unambiguous. + if (nodeOrToken.IsNode && !nodeOrToken.IsKind(SyntaxKind.ParenthesizedExpression)) { - s_nodeStack.Clear(); - return true; + stack.Push(nodeOrToken.AsNode()); + } + else if (nodeOrToken.IsToken) + { + if (nodeOrToken.IsKind(SyntaxKind.ColonToken) || nodeOrToken.IsKind(SyntaxKind.ColonColonToken)) + { + return true; + } } } } } + finally + { + s_nodeStackPool.ClearAndFree(stack); + } return false; } -- GitLab