提交 68ff1979 编写于 作者: A Andy Gocke 提交者: GitHub

Respond to PR comments (#21595)

上级 5d5d044e
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
//#define CHECK_LOCALS // define CHECK_LOCALS to help debug some rewriting problems that would otherwise cause code-gen failures //#define CHECK_LOCALS // define CHECK_LOCALS to help debug some rewriting problems that would otherwise cause code-gen failures
#endif #endif
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
...@@ -13,8 +14,6 @@ ...@@ -13,8 +14,6 @@
using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.PooledObjects;
using Roslyn.Utilities; using Roslyn.Utilities;
using System.Linq;
using Microsoft.CodeAnalysis.Collections;
namespace Microsoft.CodeAnalysis.CSharp namespace Microsoft.CodeAnalysis.CSharp
{ {
...@@ -395,8 +394,6 @@ private void SynthesizeLoweredFunctionMethods() ...@@ -395,8 +394,6 @@ private void SynthesizeLoweredFunctionMethods()
{ {
var originalMethod = closure.OriginalMethodSymbol; var originalMethod = closure.OriginalMethodSymbol;
var syntax = originalMethod.DeclaringSyntaxReferences[0].GetSyntax(); var syntax = originalMethod.DeclaringSyntaxReferences[0].GetSyntax();
var structClosures = closure.CapturedEnvironments
.Where(env => env.IsStruct).Select(env => env.SynthesizedEnvironment).AsImmutable();
int closureOrdinal; int closureOrdinal;
ClosureKind closureKind; ClosureKind closureKind;
...@@ -404,6 +401,7 @@ private void SynthesizeLoweredFunctionMethods() ...@@ -404,6 +401,7 @@ private void SynthesizeLoweredFunctionMethods()
SynthesizedClosureEnvironment containerAsFrame; SynthesizedClosureEnvironment containerAsFrame;
DebugId topLevelMethodId; DebugId topLevelMethodId;
DebugId lambdaId; DebugId lambdaId;
if (closure.ContainingEnvironmentOpt != null) if (closure.ContainingEnvironmentOpt != null)
{ {
containerAsFrame = closure.ContainingEnvironmentOpt?.SynthesizedEnvironment; containerAsFrame = closure.ContainingEnvironmentOpt?.SynthesizedEnvironment;
...@@ -419,28 +417,19 @@ private void SynthesizeLoweredFunctionMethods() ...@@ -419,28 +417,19 @@ private void SynthesizeLoweredFunctionMethods()
closureKind = ClosureKind.ThisOnly; closureKind = ClosureKind.ThisOnly;
closureOrdinal = LambdaDebugInfo.ThisOnlyClosureOrdinal; closureOrdinal = LambdaDebugInfo.ThisOnlyClosureOrdinal;
} }
else if (closure.CapturedEnvironments.Count == 0) else if (closure.CapturedEnvironments.Count == 0 &&
_analysis.MethodsConvertedToDelegates.Contains(originalMethod))
{ {
if (_analysis.MethodsConvertedToDelegates.Contains(originalMethod)) translatedLambdaContainer = containerAsFrame = GetStaticFrame(Diagnostics, syntax);
{ closureKind = ClosureKind.Singleton;
translatedLambdaContainer = containerAsFrame = GetStaticFrame(Diagnostics, syntax); closureOrdinal = LambdaDebugInfo.StaticClosureOrdinal;
closureKind = ClosureKind.Singleton;
closureOrdinal = LambdaDebugInfo.StaticClosureOrdinal;
}
else
{
containerAsFrame = null;
translatedLambdaContainer = _topLevelMethod.ContainingType;
closureKind = ClosureKind.Static;
closureOrdinal = LambdaDebugInfo.StaticClosureOrdinal;
}
} }
else else
{ {
// Lower directly onto the containing type // Lower directly onto the containing type
containerAsFrame = null;
closureKind = ClosureKind.Static; // not exactly... but we've rewritten the receiver to be a by-ref parameter
translatedLambdaContainer = _topLevelMethod.ContainingType; translatedLambdaContainer = _topLevelMethod.ContainingType;
containerAsFrame = null;
closureKind = ClosureKind.Static;
closureOrdinal = LambdaDebugInfo.StaticClosureOrdinal; closureOrdinal = LambdaDebugInfo.StaticClosureOrdinal;
} }
...@@ -450,7 +439,7 @@ private void SynthesizeLoweredFunctionMethods() ...@@ -450,7 +439,7 @@ private void SynthesizeLoweredFunctionMethods()
var synthesizedMethod = new SynthesizedClosureMethod( var synthesizedMethod = new SynthesizedClosureMethod(
translatedLambdaContainer, translatedLambdaContainer,
structClosures, GetStructClosures(closure),
closureKind, closureKind,
_topLevelMethod, _topLevelMethod,
topLevelMethodId, topLevelMethodId,
...@@ -459,6 +448,21 @@ private void SynthesizeLoweredFunctionMethods() ...@@ -459,6 +448,21 @@ private void SynthesizeLoweredFunctionMethods()
lambdaId); lambdaId);
closure.SynthesizedLoweredMethod = synthesizedMethod; closure.SynthesizedLoweredMethod = synthesizedMethod;
}); });
ImmutableArray<SynthesizedClosureEnvironment> GetStructClosures(Analysis.Closure closure)
{
var closuresBuilder = ArrayBuilder<SynthesizedClosureEnvironment>.GetInstance();
foreach (var env in closure.CapturedEnvironments)
{
if (env.IsStruct)
{
closuresBuilder.Add(env.SynthesizedEnvironment);
}
}
return closuresBuilder.ToImmutableAndFree();
}
} }
/// <summary> /// <summary>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册