提交 3cd9be71 编写于 作者: V VSadov

CR feedback on the boxing reducing change.

Couple more places where boxing can be avoided (changeset 1211849)
上级 355d6958
......@@ -4,6 +4,7 @@
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using System.Collections.Immutable;
namespace Microsoft.CodeAnalysis.CSharp.Emit
{
......@@ -23,14 +24,16 @@ public sealed override void Dispatch(Microsoft.Cci.MetadataVisitor visitor)
visitor.Visit((Microsoft.Cci.IGenericTypeInstanceReference)this);
}
IEnumerable<Microsoft.Cci.ITypeReference> Microsoft.Cci.IGenericTypeInstanceReference.GetGenericArguments(Microsoft.CodeAnalysis.Emit.Context context)
ImmutableArray<Microsoft.Cci.ITypeReference> Microsoft.Cci.IGenericTypeInstanceReference.GetGenericArguments(Microsoft.CodeAnalysis.Emit.Context context)
{
PEModuleBuilder moduleBeingBuilt = (PEModuleBuilder)context.Module;
var builder = ArrayBuilder<Microsoft.Cci.ITypeReference>.GetInstance();
foreach (TypeSymbol type in UnderlyingNamedType.TypeArgumentsNoUseSiteDiagnostics)
{
yield return moduleBeingBuilt.Translate(type, syntaxNodeOpt: (CSharpSyntaxNode)context.SyntaxNodeOpt, diagnostics: context.Diagnostics);
builder.Add(moduleBeingBuilt.Translate(type, syntaxNodeOpt: (CSharpSyntaxNode)context.SyntaxNodeOpt, diagnostics: context.Diagnostics));
}
return builder.ToImmutableAndFree();
}
Microsoft.Cci.INamedTypeReference Microsoft.Cci.IGenericTypeInstanceReference.GenericType
......
......@@ -877,17 +877,18 @@ Cci.TypeMemberVisibility Cci.ITypeDefinitionMember.Visibility
}
}
IEnumerable<Cci.ITypeReference> Cci.IGenericTypeInstanceReference.GetGenericArguments(Microsoft.CodeAnalysis.Emit.Context context)
ImmutableArray<Cci.ITypeReference> Cci.IGenericTypeInstanceReference.GetGenericArguments(Microsoft.CodeAnalysis.Emit.Context context)
{
PEModuleBuilder moduleBeingBuilt = (PEModuleBuilder)context.Module;
var builder = ArrayBuilder<Microsoft.Cci.ITypeReference>.GetInstance();
Debug.Assert(((Cci.ITypeReference)this).AsGenericTypeInstanceReference != null);
foreach (TypeSymbol type in this.TypeArgumentsNoUseSiteDiagnostics)
{
yield return moduleBeingBuilt.Translate(type,
syntaxNodeOpt: (CSharpSyntaxNode)context.SyntaxNodeOpt,
diagnostics: context.Diagnostics);
builder.Add(moduleBeingBuilt.Translate(type, syntaxNodeOpt: (CSharpSyntaxNode)context.SyntaxNodeOpt, diagnostics: context.Diagnostics));
}
return builder.ToImmutableAndFree();
}
Cci.INamedTypeReference Cci.IGenericTypeInstanceReference.GenericType
......
......@@ -1185,7 +1185,12 @@ private static bool MustBeWrapped(ParameterSymbol param)
private ImmutableArray<Cci.IParameterTypeInformation> TranslateAll(ImmutableArray<ParameterSymbol> @params)
{
return @params.SelectAsArray(param => CreateParameterTypeInformationWrapper(param));
var builder = ArrayBuilder<Cci.IParameterTypeInformation>.GetInstance();
foreach(var param in @params)
{
builder.Add(CreateParameterTypeInformationWrapper(param));
}
return builder.ToImmutableAndFree();
}
private Cci.IParameterTypeInformation CreateParameterTypeInformationWrapper(ParameterSymbol param)
......
......@@ -4,6 +4,7 @@
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using System.Collections.Immutable;
namespace Microsoft.CodeAnalysis.CSharp.Emit
{
......@@ -25,14 +26,17 @@ public sealed override void Dispatch(Microsoft.Cci.MetadataVisitor visitor)
visitor.Visit((Microsoft.Cci.IGenericTypeInstanceReference)this);
}
IEnumerable<Microsoft.Cci.ITypeReference> Microsoft.Cci.IGenericTypeInstanceReference.GetGenericArguments(Microsoft.CodeAnalysis.Emit.Context context)
ImmutableArray<Microsoft.Cci.ITypeReference> Microsoft.Cci.IGenericTypeInstanceReference.GetGenericArguments(Microsoft.CodeAnalysis.Emit.Context context)
{
PEModuleBuilder moduleBeingBuilt = (PEModuleBuilder)context.Module;
var builder = ArrayBuilder<Microsoft.Cci.ITypeReference>.GetInstance();
foreach (TypeSymbol type in UnderlyingNamedType.TypeArgumentsNoUseSiteDiagnostics)
{
yield return moduleBeingBuilt.Translate(type, syntaxNodeOpt: (CSharpSyntaxNode)context.SyntaxNodeOpt, diagnostics: context.Diagnostics);
builder.Add(moduleBeingBuilt.Translate(type, syntaxNodeOpt: (CSharpSyntaxNode)context.SyntaxNodeOpt, diagnostics: context.Diagnostics));
}
return builder.ToImmutableAndFree();
}
Microsoft.Cci.INamedTypeReference Microsoft.Cci.IGenericTypeInstanceReference.GenericType
......
......@@ -1108,21 +1108,22 @@ private void CreateIndicesFor(ITypeDefinition typeDef, Queue<ITypeDefinition> ne
return result;
}
protected IEnumerable<IParameterDefinition> GetParametersToEmit(IMethodDefinition methodDef)
protected ImmutableArray<IParameterDefinition> GetParametersToEmit(IMethodDefinition methodDef)
{
if (methodDef.ParameterCount == 0 && !(methodDef.ReturnValueIsMarshalledExplicitly || IteratorHelper.EnumerableIsNotEmpty(methodDef.ReturnValueAttributes)))
{
return SpecializedCollections.EmptyEnumerable<IParameterDefinition>();
return ImmutableArray<IParameterDefinition>.Empty;
}
return GetParametersToEmitCore(methodDef);
}
private IEnumerable<IParameterDefinition> GetParametersToEmitCore(IMethodDefinition methodDef)
private ImmutableArray<IParameterDefinition> GetParametersToEmitCore(IMethodDefinition methodDef)
{
var builder = ArrayBuilder<IParameterDefinition>.GetInstance();
if (methodDef.ReturnValueIsMarshalledExplicitly || IteratorHelper.EnumerableIsNotEmpty(methodDef.ReturnValueAttributes))
{
yield return new ReturnValueParameter(methodDef);
builder.Add(new ReturnValueParameter(methodDef));
}
foreach (IParameterDefinition parDef in methodDef.Parameters)
......@@ -1133,9 +1134,11 @@ private IEnumerable<IParameterDefinition> GetParametersToEmitCore(IMethodDefinit
parDef.Name != String.Empty ||
IteratorHelper.EnumerableIsNotEmpty(parDef.GetAttributes(Context)))
{
yield return parDef;
builder.Add(parDef);
}
}
return builder.ToImmutableAndFree();
}
private void CreateInitialAssemblyRefIndex()
......
......@@ -237,7 +237,7 @@ internal interface IGenericTypeInstanceReference : ITypeReference
/// <summary>
/// The type arguments that were used to instantiate this.GenericType in order to create this type.
/// </summary>
IEnumerable<ITypeReference> GetGenericArguments(Microsoft.CodeAnalysis.Emit.Context context);
ImmutableArray<ITypeReference> GetGenericArguments(Microsoft.CodeAnalysis.Emit.Context context);
// ^ ensures result.GetEnumerator().MoveNext(); // The collection is always non empty.
/// <summary>
......
......@@ -2,8 +2,10 @@
Imports System
Imports System.Collections.Generic
Imports System.Collections.Immutable
Imports System.Linq
Imports System.Text
Imports Microsoft.Cci
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
......@@ -26,11 +28,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Emit
visitor.Visit(DirectCast(Me, Microsoft.Cci.IGenericTypeInstanceReference))
End Sub
Private Function IGenericTypeInstanceReferenceGetGenericArguments(context As Microsoft.CodeAnalysis.Emit.Context) As IEnumerable(Of Microsoft.Cci.ITypeReference) Implements Microsoft.Cci.IGenericTypeInstanceReference.GetGenericArguments
Private Function IGenericTypeInstanceReferenceGetGenericArguments(context As Microsoft.CodeAnalysis.Emit.Context) As ImmutableArray(Of Microsoft.Cci.ITypeReference) Implements Microsoft.Cci.IGenericTypeInstanceReference.GetGenericArguments
Dim moduleBeingBuilt As PEModuleBuilder = DirectCast(context.Module, PEModuleBuilder)
Return From type In m_UnderlyingNamedType.TypeArgumentsNoUseSiteDiagnostics
Select moduleBeingBuilt.Translate(type, syntaxNodeOpt:=DirectCast(context.SyntaxNodeOpt, VisualBasicSyntaxNode), diagnostics:=context.Diagnostics)
Dim builder = ArrayBuilder(Of ITypeReference).GetInstance()
For Each t In m_UnderlyingNamedType.TypeArgumentsNoUseSiteDiagnostics
builder.Add(moduleBeingBuilt.Translate(t, syntaxNodeOpt:=DirectCast(context.SyntaxNodeOpt, VisualBasicSyntaxNode), diagnostics:=context.Diagnostics))
Next
Return builder.ToImmutableAndFree
End Function
Private ReadOnly Property IGenericTypeInstanceReferenceGenericType As Microsoft.Cci.INamedTypeReference Implements Microsoft.Cci.IGenericTypeInstanceReference.GenericType
......
......@@ -855,12 +855,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols
End Get
End Property
Private Function IGenericTypeInstanceReferenceGetGenericArguments(context As Microsoft.CodeAnalysis.Emit.Context) As IEnumerable(Of ITypeReference) Implements IGenericTypeInstanceReference.GetGenericArguments
Private Function IGenericTypeInstanceReferenceGetGenericArguments(context As Microsoft.CodeAnalysis.Emit.Context) As ImmutableArray(Of ITypeReference) Implements IGenericTypeInstanceReference.GetGenericArguments
Dim moduleBeingBuilt As PEModuleBuilder = DirectCast(context.Module, PEModuleBuilder)
Debug.Assert((DirectCast(Me, ITypeReference)).AsGenericTypeInstanceReference IsNot Nothing)
Return From type In Me.TypeArgumentsNoUseSiteDiagnostics
Select moduleBeingBuilt.Translate(type, syntaxNodeOpt:=DirectCast(context.SyntaxNodeOpt, VisualBasicSyntaxNode), diagnostics:=context.Diagnostics)
Dim builder = ArrayBuilder(Of ITypeReference).GetInstance()
For Each t In Me.TypeArgumentsNoUseSiteDiagnostics
builder.Add(moduleBeingBuilt.Translate(t, syntaxNodeOpt:=DirectCast(context.SyntaxNodeOpt, VisualBasicSyntaxNode), diagnostics:=context.Diagnostics))
Next
Return builder.ToImmutableAndFree
End Function
Private ReadOnly Property IGenericTypeInstanceReferenceGenericType As INamedTypeReference Implements IGenericTypeInstanceReference.GenericType
......
......@@ -2,8 +2,10 @@
Imports System
Imports System.Collections.Generic
Imports System.Collections.Immutable
Imports System.Linq
Imports System.Text
Imports Microsoft.Cci
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
......@@ -28,11 +30,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Emit
visitor.Visit(DirectCast(Me, Microsoft.Cci.IGenericTypeInstanceReference))
End Sub
Private Function IGenericTypeInstanceReferenceGetGenericArguments(context As Microsoft.CodeAnalysis.Emit.Context) As IEnumerable(Of Microsoft.Cci.ITypeReference) Implements Microsoft.Cci.IGenericTypeInstanceReference.GetGenericArguments
Private Function IGenericTypeInstanceReferenceGetGenericArguments(context As Microsoft.CodeAnalysis.Emit.Context) As ImmutableArray(Of Microsoft.Cci.ITypeReference) Implements Microsoft.Cci.IGenericTypeInstanceReference.GetGenericArguments
Dim moduleBeingBuilt As PEModuleBuilder = DirectCast(context.Module, PEModuleBuilder)
Return From type In m_UnderlyingNamedType.TypeArgumentsNoUseSiteDiagnostics
Select moduleBeingBuilt.Translate(type, syntaxNodeOpt:=DirectCast(context.SyntaxNodeOpt, VisualBasicSyntaxNode), diagnostics:=context.Diagnostics)
Dim builder = ArrayBuilder(Of ITypeReference).GetInstance()
For Each t In m_UnderlyingNamedType.TypeArgumentsNoUseSiteDiagnostics
builder.Add(moduleBeingBuilt.Translate(t, syntaxNodeOpt:=DirectCast(context.SyntaxNodeOpt, VisualBasicSyntaxNode), diagnostics:=context.Diagnostics))
Next
Return builder.ToImmutableAndFree
End Function
Private ReadOnly Property IGenericTypeInstanceReferenceGenericType As Microsoft.Cci.INamedTypeReference Implements Microsoft.Cci.IGenericTypeInstanceReference.GenericType
......
......@@ -433,7 +433,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Emit
End Function
Private Function TranslateAll(params As ImmutableArray(Of ParameterSymbol)) As ImmutableArray(Of Microsoft.Cci.IParameterTypeInformation)
Return params.SelectAsArray(Function(param) CreateParameterTypeInformationWrapper(param))
Dim builder = ArrayBuilder(Of Microsoft.Cci.IParameterTypeInformation).GetInstance()
For Each param In params
builder.Add(CreateParameterTypeInformationWrapper(param))
Next
Return builder.ToImmutableAndFree
End Function
Private Function CreateParameterTypeInformationWrapper(param As ParameterSymbol) As Cci.IParameterTypeInformation
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册