39 lines
4.0 KiB
C#
39 lines
4.0 KiB
C#
using System.Collections.Immutable;
|
|
using Microsoft.CodeAnalysis.CodeGen;
|
|
|
|
namespace Microsoft.CodeAnalysis.CSharp.Symbols;
|
|
|
|
internal sealed class SynthesizedSpanSwitchHashMethod : SynthesizedGlobalMethodSymbol
|
|
{
|
|
private readonly bool _isReadOnlySpan;
|
|
|
|
internal override void GenerateMethodBody(TypeCompilationState compilationState, BindingDiagnosticBag diagnostics)
|
|
{
|
|
SyntheticBoundNodeFactory syntheticBoundNodeFactory = new SyntheticBoundNodeFactory(this, (SyntaxNode)(object)this.GetNonNullSyntaxNode(), compilationState, diagnostics);
|
|
syntheticBoundNodeFactory.CurrentFunction = this;
|
|
try
|
|
{
|
|
ParameterSymbol p = Parameters[0];
|
|
NamedTypeSymbol newOwner = syntheticBoundNodeFactory.WellKnownType((WellKnownType)(_isReadOnlySpan ? 276 : 275)).Construct(syntheticBoundNodeFactory.SpecialType((SpecialType)8));
|
|
LocalSymbol localSymbol = syntheticBoundNodeFactory.SynthesizedLocal(syntheticBoundNodeFactory.SpecialType((SpecialType)13), null, isPinned: false, isKnownToReferToTempIfReferenceType: false, (RefKind)0, (SynthesizedLocalKind)(-2));
|
|
LocalSymbol localSymbol2 = syntheticBoundNodeFactory.SynthesizedLocal(syntheticBoundNodeFactory.SpecialType((SpecialType)14), null, isPinned: false, isKnownToReferToTempIfReferenceType: false, (RefKind)0, (SynthesizedLocalKind)(-2));
|
|
LabelSymbol label = syntheticBoundNodeFactory.GenerateLabel("again");
|
|
LabelSymbol label2 = syntheticBoundNodeFactory.GenerateLabel("start");
|
|
BoundBlock body = syntheticBoundNodeFactory.Block(ImmutableArray.Create(localSymbol2, localSymbol), syntheticBoundNodeFactory.Assignment(syntheticBoundNodeFactory.Local(localSymbol2), syntheticBoundNodeFactory.Literal(2166136261u)), syntheticBoundNodeFactory.Assignment(syntheticBoundNodeFactory.Local(localSymbol), syntheticBoundNodeFactory.Literal(0)), syntheticBoundNodeFactory.Goto(label2), syntheticBoundNodeFactory.Label(label), syntheticBoundNodeFactory.Assignment(syntheticBoundNodeFactory.Local(localSymbol2), syntheticBoundNodeFactory.Binary(BinaryOperatorKind.Multiplication, localSymbol2.Type, syntheticBoundNodeFactory.Binary(BinaryOperatorKind.Xor, localSymbol2.Type, syntheticBoundNodeFactory.Convert(localSymbol2.Type, syntheticBoundNodeFactory.Call(syntheticBoundNodeFactory.Parameter(p), syntheticBoundNodeFactory.WellKnownMethod((WellKnownMember)(_isReadOnlySpan ? 406 : 400)).AsMember(newOwner), syntheticBoundNodeFactory.Local(localSymbol)), Conversion.ImplicitNumeric), syntheticBoundNodeFactory.Local(localSymbol2)), syntheticBoundNodeFactory.Literal(16777619))), syntheticBoundNodeFactory.Assignment(syntheticBoundNodeFactory.Local(localSymbol), syntheticBoundNodeFactory.Binary(BinaryOperatorKind.Addition, localSymbol.Type, syntheticBoundNodeFactory.Local(localSymbol), syntheticBoundNodeFactory.Literal(1))), syntheticBoundNodeFactory.Label(label2), syntheticBoundNodeFactory.If(syntheticBoundNodeFactory.Binary(BinaryOperatorKind.LessThan, syntheticBoundNodeFactory.SpecialType((SpecialType)7), syntheticBoundNodeFactory.Local(localSymbol), syntheticBoundNodeFactory.Call(syntheticBoundNodeFactory.Parameter(p), syntheticBoundNodeFactory.WellKnownMethod((WellKnownMember)(_isReadOnlySpan ? 407 : 401)).AsMember(newOwner))), syntheticBoundNodeFactory.Goto(label)), syntheticBoundNodeFactory.Return(syntheticBoundNodeFactory.Local(localSymbol2)));
|
|
syntheticBoundNodeFactory.CloseMethod(body);
|
|
}
|
|
catch (SyntheticBoundNodeFactory.MissingPredefinedMember missingPredefinedMember)
|
|
{
|
|
((BindingDiagnosticBag)diagnostics).Add(missingPredefinedMember.Diagnostic);
|
|
syntheticBoundNodeFactory.CloseMethod(syntheticBoundNodeFactory.ThrowNull());
|
|
}
|
|
}
|
|
|
|
internal SynthesizedSpanSwitchHashMethod(SourceModuleSymbol containingModule, PrivateImplementationDetails privateImplType, TypeSymbol returnType, TypeSymbol paramType, bool isReadOnlySpan)
|
|
: base(containingModule, privateImplType, returnType, isReadOnlySpan ? "ComputeReadOnlySpanHash" : "ComputeSpanHash")
|
|
{
|
|
_isReadOnlySpan = isReadOnlySpan;
|
|
SetParameters(ImmutableArray.Create(SynthesizedParameterSymbol.Create(this, TypeWithAnnotations.Create(paramType), 0, (RefKind)0, "s", (ScopedKind)0)));
|
|
}
|
|
}
|