Files
2026-08-27 10:56:38 -06:00

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)));
}
}