diff --git a/src/coreclr/System.Private.CoreLib/src/Internal/VersionResilientHashCode.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/Internal/VersionResilientHashCode.CoreCLR.cs
index 5ecf25c5bc7a64..226deaa7a75a10 100644
--- a/src/coreclr/System.Private.CoreLib/src/Internal/VersionResilientHashCode.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/Internal/VersionResilientHashCode.CoreCLR.cs
@@ -19,6 +19,9 @@ internal static partial class VersionResilientHashCode
public static int TypeHashCode(RuntimeType type)
=> TypeHashCode(new QCallTypeHandle(ref type));
+ private static int NameHashCode(string s1, string s2)
+ => NameHashCode(System.Text.Encoding.UTF8.GetBytes(s1), System.Text.Encoding.UTF8.GetBytes(s2));
+
///
/// CoreCLR 1-parameter GetVersionResilientTypeHashCode
///
diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/MethodNameAndSignature.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/MethodNameAndSignature.cs
index 04884e5ac54506..fd125110cf748f 100644
--- a/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/MethodNameAndSignature.cs
+++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/MethodNameAndSignature.cs
@@ -26,6 +26,15 @@ public string GetName()
return Reader.GetString(method.Name);
}
+ public ReadOnlySpan Name
+ {
+ get
+ {
+ Method method = Reader.GetMethod(Handle);
+ return Reader.ReadStringAsBytes(method.Name);
+ }
+ }
+
public override bool Equals(object? compare)
{
if (compare == null)
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.ConstructedGenericMethodsLookup.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.ConstructedGenericMethodsLookup.cs
index fe1c59215b9be0..e8e406c8afe825 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.ConstructedGenericMethodsLookup.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.ConstructedGenericMethodsLookup.cs
@@ -28,7 +28,7 @@ public override int GetHashCode()
{
if (!_hashCode.HasValue)
{
- _hashCode = _declaringTypeHandle.GetHashCode() ^ TypeHashingAlgorithms.ComputeGenericInstanceHashCode(TypeHashingAlgorithms.ComputeNameHashCode(_methodNameAndSignature.GetName()), _genericMethodArgumentHandles);
+ _hashCode = _declaringTypeHandle.GetHashCode() ^ VersionResilientHashCode.GenericInstanceHashCode(VersionResilientHashCode.NameHashCode(_methodNameAndSignature.Name), _genericMethodArgumentHandles);
}
return _hashCode.Value;
}
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.ConstructedGenericTypesLookup.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.ConstructedGenericTypesLookup.cs
index 0c9adf60c80337..78b6e4c6382488 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.ConstructedGenericTypesLookup.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.ConstructedGenericTypesLookup.cs
@@ -30,7 +30,7 @@ public override int GetHashCode()
{
if (!_hashCode.HasValue)
{
- _hashCode = TypeHashingAlgorithms.ComputeGenericInstanceHashCode(_genericTypeDefinitionHandle.GetHashCode(), _genericTypeArgumentHandles);
+ _hashCode = VersionResilientHashCode.GenericInstanceHashCode(_genericTypeDefinitionHandle.GetHashCode(), _genericTypeArgumentHandles);
}
return _hashCode.Value;
}
@@ -114,7 +114,7 @@ internal GenericTypeLookupData(RuntimeTypeHandle genericTypeDefinitionHandle, Ru
internal int LookupHashCode()
{
- return _typeToLookup != null ? _typeToLookup.GetHashCode() : TypeHashingAlgorithms.ComputeGenericInstanceHashCode(_genericTypeDefinitionHandle.GetHashCode(), _genericTypeArgumentHandles);
+ return _typeToLookup != null ? _typeToLookup.GetHashCode() : VersionResilientHashCode.GenericInstanceHashCode(_genericTypeDefinitionHandle.GetHashCode(), _genericTypeArgumentHandles);
}
internal bool MatchParsedEntry(RuntimeTypeHandle tentativeType)
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.cs
index 1b6d16fa3ffd1c..c1485184aa0391 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.cs
@@ -106,7 +106,7 @@ internal static InstantiatedMethod GVMLookupForSlotWorker(DefType targetType, In
sb.AppendLine();
sb.AppendLine("Declaring type: " + GetTypeNameDebug(slotMethod.OwningType));
sb.AppendLine("Target type: " + GetTypeNameDebug(targetType));
- sb.AppendLine("Method name: " + slotMethod.Name);
+ sb.AppendLine("Method name: " + slotMethod.GetName());
sb.AppendLine("Instantiation:");
for (int i = 0; i < slotMethod.Instantiation.Length; i++)
{
@@ -134,7 +134,7 @@ internal unsafe IntPtr ResolveGenericVirtualMethodTarget(RuntimeTypeHandle type,
sb.AppendLine("Failed to create generic virtual method implementation");
sb.AppendLine();
sb.AppendLine("Declaring type: " + GetTypeNameDebug(result.OwningType));
- sb.AppendLine("Method name: " + result.Name);
+ sb.AppendLine("Method name: " + result.GetName());
sb.AppendLine("Instantiation:");
for (int i = 0; i < result.Instantiation.Length; i++)
{
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.cs
index f28b55e5b0d6dc..da1f944b2fa99b 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.cs
@@ -102,7 +102,7 @@ public bool Equals(RuntimeMethodHandleKey other)
public override int GetHashCode()
=> _handle.GetHashCode() ^ (_genericArgs == null
? _declaringType.GetHashCode()
- : TypeHashingAlgorithms.ComputeGenericInstanceHashCode(_declaringType.GetHashCode(), _genericArgs));
+ : VersionResilientHashCode.GenericInstanceHashCode(_declaringType.GetHashCode(), _genericArgs));
}
private LowLevelDictionary _runtimeFieldHandles = new LowLevelDictionary();
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.cs
index 0545b31ada272c..e65b6230d845fa 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.cs
@@ -202,7 +202,7 @@ public static unsafe bool TryGetArrayTypeForNonDynamicElementType(RuntimeTypeHan
arrayTypeHandle = default(RuntimeTypeHandle);
Debug.Assert(isMdArray || rank == -1);
- int arrayHashcode = TypeHashingAlgorithms.ComputeArrayTypeHashCode(elementTypeHandle.GetHashCode(), rank);
+ int arrayHashcode = VersionResilientHashCode.ArrayTypeHashCode(elementTypeHandle.GetHashCode(), rank == -1 ? 1 : rank);
// Note: ReflectionMapBlob.ArrayMap may not exist in the module that contains the element type.
// So we must enumerate all loaded modules in order to find ArrayMap and the array type for
@@ -239,13 +239,13 @@ public static unsafe bool TryGetArrayTypeForNonDynamicElementType(RuntimeTypeHan
public static unsafe bool TryGetByRefTypeForNonDynamicElementType(RuntimeTypeHandle elementTypeHandle, out RuntimeTypeHandle pointerTypeHandle)
{
- int byRefHashcode = TypeHashingAlgorithms.ComputeByrefTypeHashCode(elementTypeHandle.GetHashCode());
+ int byRefHashcode = VersionResilientHashCode.ByrefTypeHashCode(elementTypeHandle.GetHashCode());
return TryGetParameterizedTypeForNonDynamicElementType(elementTypeHandle, byRefHashcode, ReflectionMapBlob.ByRefTypeMap, out pointerTypeHandle);
}
public static unsafe bool TryGetPointerTypeForNonDynamicElementType(RuntimeTypeHandle elementTypeHandle, out RuntimeTypeHandle pointerTypeHandle)
{
- int pointerHashcode = TypeHashingAlgorithms.ComputePointerTypeHashCode(elementTypeHandle.GetHashCode());
+ int pointerHashcode = VersionResilientHashCode.PointerTypeHashCode(elementTypeHandle.GetHashCode());
return TryGetParameterizedTypeForNonDynamicElementType(elementTypeHandle, pointerHashcode, ReflectionMapBlob.PointerTypeMap, out pointerTypeHandle);
}
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/ExceptionTypeNameFormatter.Runtime.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/ExceptionTypeNameFormatter.Runtime.cs
index d9398074cd9d0a..bec841f6dcd692 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/ExceptionTypeNameFormatter.Runtime.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/ExceptionTypeNameFormatter.Runtime.cs
@@ -10,7 +10,7 @@ private static string GetTypeName(DefType type)
if (type is NoMetadata.NoMetadataType)
return ((NoMetadata.NoMetadataType)type).NameForDiagnostics;
- return type.Name;
+ return type.GetName();
}
private static string GetTypeNamespace(DefType type)
@@ -18,7 +18,7 @@ private static string GetTypeNamespace(DefType type)
if (type is NoMetadata.NoMetadataType)
return ((NoMetadata.NoMetadataType)type).NamespaceForDiagnostics;
- return type.Namespace;
+ return type.GetNamespace();
}
}
}
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/MethodForInstantiatedType.Runtime.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/MethodForInstantiatedType.Runtime.cs
index 2d3e9c99281cf3..d66289fbbc3354 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/MethodForInstantiatedType.Runtime.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/MethodForInstantiatedType.Runtime.cs
@@ -21,7 +21,7 @@ public override MethodNameAndSignature NameAndSignature
#if DEBUG
public override string ToString()
{
- return OwningType.ToString() + "." + Name;
+ return OwningType.ToString() + "." + GetName();
}
#endif
}
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/RuntimeMethodDesc.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/RuntimeMethodDesc.cs
index e07a286b1bb23a..3018e7c274dfe8 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/RuntimeMethodDesc.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/RuntimeMethodDesc.cs
@@ -89,11 +89,11 @@ public override MethodNameAndSignature NameAndSignature
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return NameAndSignature.GetName();
+ return NameAndSignature.Name;
}
}
@@ -163,7 +163,7 @@ public override bool HasCustomAttribute(string attributeNamespace, string attrib
public override string ToString()
{
- string result = OwningType.ToString() + ".Method(" + Name + ")";
+ string result = OwningType.ToString() + ".Method(" + GetName() + ")";
return result;
}
#endif
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/TypeSystemContext.Runtime.cs b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/TypeSystemContext.Runtime.cs
index 2cc527b21f4d31..41182e02068c4e 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/TypeSystemContext.Runtime.cs
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/TypeSystem/TypeSystemContext.Runtime.cs
@@ -287,7 +287,7 @@ public GenericTypeInstanceKey(DefType typeDefinition, Instantiation instantiatio
_typeDefinition = typeDefinition;
_instantiation = instantiation;
- _hashCode = instantiation.ComputeGenericInstanceHashCode(typeDefinition.GetHashCode());
+ _hashCode = VersionResilientHashCode.GenericInstanceHashCode(typeDefinition.GetHashCode(), _instantiation);
}
public bool Equals(GenericTypeInstanceKey other)
@@ -331,7 +331,7 @@ public RuntimeMethodKey(bool unboxingStub, DefType owningType, MethodNameAndSign
_owningType = owningType;
_methodNameAndSignature = nameAndSignature;
- _hashCode = TypeHashingAlgorithms.ComputeMethodHashCode(owningType.GetHashCode(), TypeHashingAlgorithms.ComputeNameHashCode(nameAndSignature.GetName()));
+ _hashCode = owningType.GetHashCode() ^ VersionResilientHashCode.NameHashCode(nameAndSignature.Name);
}
public class RuntimeMethodKeyHashtable : LockFreeReaderHashtable
diff --git a/src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj b/src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj
index b14c69d765daf6..67540af5894b7c 100644
--- a/src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj
+++ b/src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csproj
@@ -23,6 +23,9 @@
MethodTable.cs
+
+ TypeSystem\Common\VersionResilientHashCode.cs
+
MethodTable.Constants.cs
@@ -201,6 +204,9 @@
TypeNameFormatter.cs
+
+ TypeSystem\Common\VersionResilientHashCode.TypeSystem.cs
+
Internal\TypeSystem\VirtualMethodAlgorithm.cs
diff --git a/src/coreclr/tools/Common/Compiler/Dataflow/MethodProxy.cs b/src/coreclr/tools/Common/Compiler/Dataflow/MethodProxy.cs
index e0883f5eca8efc..d73e62dec788d2 100644
--- a/src/coreclr/tools/Common/Compiler/Dataflow/MethodProxy.cs
+++ b/src/coreclr/tools/Common/Compiler/Dataflow/MethodProxy.cs
@@ -19,7 +19,7 @@ namespace ILLink.Shared.TypeSystemProxy
public readonly MethodDesc Method;
- public string Name { get => Method.Name; }
+ public string Name { get => Method.GetName(); }
public string GetDisplayName() => Method.GetDisplayName();
diff --git a/src/coreclr/tools/Common/Compiler/Dataflow/TypeExtensions.cs b/src/coreclr/tools/Common/Compiler/Dataflow/TypeExtensions.cs
index db0a6384ac78a2..a4f66b891f7c4d 100644
--- a/src/coreclr/tools/Common/Compiler/Dataflow/TypeExtensions.cs
+++ b/src/coreclr/tools/Common/Compiler/Dataflow/TypeExtensions.cs
@@ -16,7 +16,7 @@ internal static class TypeExtensions
{
public static bool IsTypeOf(this TypeDesc type, string ns, string name)
{
- return type is MetadataType mdType && mdType.Name == name && mdType.Namespace == ns;
+ return type is MetadataType mdType && mdType.Name.StringEquals(name) && mdType.Namespace.StringEquals(ns);
}
public static bool IsTypeOf(this TypeDesc type, string fullTypeName)
@@ -24,17 +24,19 @@ public static bool IsTypeOf(this TypeDesc type, string fullTypeName)
if (type is not MetadataType metadataType)
return false;
+ string metadataTypeName = metadataType.GetName();
+
var name = fullTypeName.AsSpan();
- if (metadataType.Name.Length + 1 > name.Length)
+ if (metadataTypeName.Length + 1 > name.Length)
return false;
- if (!name.Slice(name.Length - metadataType.Name.Length).Equals(metadataType.Name.AsSpan(), StringComparison.Ordinal))
+ if (!name.Slice(name.Length - metadataTypeName.Length).Equals(metadataTypeName.AsSpan(), StringComparison.Ordinal))
return false;
- if (name[name.Length - metadataType.Name.Length - 1] != '.')
+ if (name[name.Length - metadataTypeName.Length - 1] != '.')
return false;
- return name.Slice(0, name.Length - metadataType.Name.Length - 1).Equals(metadataType.Namespace, StringComparison.Ordinal);
+ return name.Slice(0, name.Length - metadataTypeName.Length - 1).Equals(metadataType.GetNamespace(), StringComparison.Ordinal);
}
public static bool IsTypeOf(this TypeDesc type, ILLinkSharedWellKnownType wellKnownType) =>
@@ -43,12 +45,31 @@ public static bool IsTypeOf(this TypeDesc type, ILLinkSharedWellKnownType wellKn
ILLinkSharedWellKnownType.System_String => type.IsWellKnownType(TypeSystemWellKnownType.String),
ILLinkSharedWellKnownType.System_Object => type.IsWellKnownType(TypeSystemWellKnownType.Object),
ILLinkSharedWellKnownType.System_Void => type.IsWellKnownType(TypeSystemWellKnownType.Void),
- _ => wellKnownType == WellKnownTypeExtensions.GetWellKnownType((type as MetadataType)?.Namespace ?? string.Empty, ((type as MetadataType)?.Name) ?? string.Empty)
+ _ => wellKnownType == WellKnownTypeExtensions.GetWellKnownType((type as MetadataType)?.GetNamespace() ?? string.Empty, ((type as MetadataType)?.GetName()) ?? string.Empty)
};
public static bool IsDeclaredOnType(this MethodDesc method, string fullTypeName)
{
return method.OwningType.IsTypeOf(fullTypeName);
}
+
+ public static bool StringEquals(this ReadOnlySpan utf8bytes, string value)
+ {
+ if (utf8bytes.Length < value.Length)
+ return false;
+
+ for (int i = 0; i < value.Length; i++)
+ {
+ int ch = utf8bytes[i];
+ if (ch > 0x7F)
+ return System.Text.Encoding.UTF8.GetString(utf8bytes) == value;
+
+ // We are assuming here that valid UTF8 encoded byte > 0x7F cannot map to a character with code point <= 0x7F
+ if (ch != value[i])
+ return false;
+ }
+
+ return utf8bytes.Length == value.Length; // All char ANSI, all matching
+ }
}
}
diff --git a/src/coreclr/tools/Common/Compiler/Dataflow/TypeProxy.cs b/src/coreclr/tools/Common/Compiler/Dataflow/TypeProxy.cs
index 35943c4c58c434..9fb5b6b576a9c1 100644
--- a/src/coreclr/tools/Common/Compiler/Dataflow/TypeProxy.cs
+++ b/src/coreclr/tools/Common/Compiler/Dataflow/TypeProxy.cs
@@ -34,9 +34,9 @@ internal partial ImmutableArray GetGenericParameters()
public TypeDesc Type { get; }
- public string Name { get => Type is MetadataType metadataType ? metadataType.Name : string.Empty; }
+ public string Name { get => Type is MetadataType metadataType ? metadataType.GetName() : string.Empty; }
- public string? Namespace { get => Type is MetadataType metadataType ? metadataType.Namespace : null; }
+ public string? Namespace { get => Type is MetadataType metadataType ? metadataType.GetNamespace() : null; }
public bool IsTypeOf(string @namespace, string name) => Type.IsTypeOf(@namespace, name);
diff --git a/src/coreclr/tools/Common/Compiler/DisplayNameHelpers.cs b/src/coreclr/tools/Common/Compiler/DisplayNameHelpers.cs
index 3dac7c151b6fe6..7b5e9a027252cd 100644
--- a/src/coreclr/tools/Common/Compiler/DisplayNameHelpers.cs
+++ b/src/coreclr/tools/Common/Compiler/DisplayNameHelpers.cs
@@ -35,7 +35,7 @@ public static string GetDisplayName(this MethodDesc method)
if (method.IsConstructor && method.OwningType is DefType defType)
{
- sb.Append(defType.Name);
+ sb.Append(defType.GetName());
}
#if !READYTORUN
else if (method.GetPropertyForAccessor() is PropertyPseudoDesc property)
@@ -70,7 +70,7 @@ public static string GetDisplayName(this MethodDesc method)
#endif
else
{
- sb.Append(method.Name);
+ sb.Append(method.GetName());
}
if (method.HasInstantiation)
@@ -119,7 +119,7 @@ public static string GetDisplayName(this FieldDesc field)
{
return new StringBuilder(field.OwningType.GetDisplayName())
.Append('.')
- .Append(field.Name).ToString();
+ .Append(field.GetName()).ToString();
}
#if !READYTORUN
@@ -234,7 +234,7 @@ protected override Unit AppendNameForInstantiatedType(StringBuilder sb, DefType
protected override Unit AppendNameForNamespaceType(StringBuilder sb, DefType type, FormatOptions options)
{
NamespaceQualify(sb, type, options);
- sb.Append(type.Name);
+ sb.Append(type.GetName());
return default;
}
@@ -242,7 +242,7 @@ protected override Unit AppendNameForNestedType(StringBuilder sb, DefType nested
{
AppendName(sb, containingType, options);
sb.Append('.');
- sb.Append(nestedType.Name);
+ sb.Append(nestedType.GetName());
return default;
}
@@ -251,7 +251,7 @@ private static void NamespaceQualify(StringBuilder sb, DefType type, FormatOptio
{
if ((options & FormatOptions.NamespaceQualify) != 0)
{
- string ns = type.Namespace;
+ string ns = type.GetNamespace();
if (!string.IsNullOrEmpty(ns))
{
sb.Append(ns);
diff --git a/src/coreclr/tools/Common/Compiler/HardwareIntrinsicHelpers.cs b/src/coreclr/tools/Common/Compiler/HardwareIntrinsicHelpers.cs
index 5280bd5b0d1578..f668798cb8595b 100644
--- a/src/coreclr/tools/Common/Compiler/HardwareIntrinsicHelpers.cs
+++ b/src/coreclr/tools/Common/Compiler/HardwareIntrinsicHelpers.cs
@@ -23,9 +23,9 @@ public static bool IsHardwareIntrinsic(MethodDesc method)
{
var owningMdType = (MetadataType)owningType;
DefType containingType = owningMdType.ContainingType;
- string ns = containingType?.ContainingType?.Namespace ??
- containingType?.Namespace ??
- owningMdType.Namespace;
+ string ns = containingType?.ContainingType?.GetNamespace() ??
+ containingType?.GetNamespace() ??
+ owningMdType.GetNamespace();
return method.Context.Target.Architecture switch
{
TargetArchitecture.ARM64 => ns == "System.Runtime.Intrinsics.Arm",
diff --git a/src/coreclr/tools/Common/Compiler/InstructionSetSupport.cs b/src/coreclr/tools/Common/Compiler/InstructionSetSupport.cs
index 0c41654a3bdad5..db31a5880f8a12 100644
--- a/src/coreclr/tools/Common/Compiler/InstructionSetSupport.cs
+++ b/src/coreclr/tools/Common/Compiler/InstructionSetSupport.cs
@@ -61,7 +61,7 @@ public static string GetHardwareIntrinsicId(TargetArchitecture architecture, Typ
return "";
// 64-bit ISA variants are not included in the mapping dictionary, so we use the containing type instead
- if (potentialType.Name is "X64" or "Arm64")
+ if (potentialType.Name.SequenceEqual("X64"u8) || potentialType.Name.SequenceEqual("Arm64"u8))
{
if (architecture is TargetArchitecture.X64 or TargetArchitecture.ARM64)
potentialType = (MetadataType)potentialType.ContainingType;
@@ -73,18 +73,18 @@ public static string GetHardwareIntrinsicId(TargetArchitecture architecture, Typ
string suffix = "";
while (potentialType.ContainingType is MetadataType containingType)
{
- suffix = $"_{potentialType.Name}{suffix}";
+ suffix = $"_{potentialType.GetName()}{suffix}";
potentialType = containingType;
}
if (architecture is TargetArchitecture.X64 or TargetArchitecture.X86)
{
- if (potentialType.Namespace != "System.Runtime.Intrinsics.X86")
+ if (!potentialType.Namespace.SequenceEqual("System.Runtime.Intrinsics.X86"u8))
return "";
}
else if (architecture is TargetArchitecture.ARM64 or TargetArchitecture.ARM)
{
- if (potentialType.Namespace != "System.Runtime.Intrinsics.Arm")
+ if (!potentialType.Namespace.SequenceEqual("System.Runtime.Intrinsics.Arm"u8))
return "";
}
else if (architecture is TargetArchitecture.LoongArch64)
@@ -100,7 +100,7 @@ public static string GetHardwareIntrinsicId(TargetArchitecture architecture, Typ
throw new InternalCompilerErrorException($"Unknown architecture '{architecture}'");
}
- return potentialType.Name + suffix;
+ return potentialType.GetName() + suffix;
}
public SimdVectorLength GetVectorTSimdVector()
diff --git a/src/coreclr/tools/Common/Compiler/Int128FieldLayoutAlgorithm.cs b/src/coreclr/tools/Common/Compiler/Int128FieldLayoutAlgorithm.cs
index a78446d5967ae4..97153023558b76 100644
--- a/src/coreclr/tools/Common/Compiler/Int128FieldLayoutAlgorithm.cs
+++ b/src/coreclr/tools/Common/Compiler/Int128FieldLayoutAlgorithm.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -23,7 +25,7 @@ public override ComputedInstanceFieldLayout ComputeInstanceLayout(DefType defTyp
{
Debug.Assert(IsIntegerType(defType));
- string name = defType.Name;
+ string name = defType.GetName();
Debug.Assert((name == "Int128") || (name == "UInt128"));
ComputedInstanceFieldLayout layoutFromMetadata = _fallbackAlgorithm.ComputeInstanceLayout(defType, layoutKind);
@@ -82,8 +84,8 @@ public override ValueTypeShapeCharacteristics ComputeValueTypeShapeCharacteristi
public static bool IsIntegerType(DefType type)
{
return type.IsIntrinsic
- && type.Namespace == "System"
- && ((type.Name == "Int128") || (type.Name == "UInt128"));
+ && type.Namespace.SequenceEqual("System"u8)
+ && (type.Name.SequenceEqual("Int128"u8) || type.Name.SequenceEqual("UInt128"u8));
}
}
}
diff --git a/src/coreclr/tools/Common/Compiler/NativeAotNameMangler.cs b/src/coreclr/tools/Common/Compiler/NativeAotNameMangler.cs
index 66f9e02a54f64b..e37407e35fe66e 100644
--- a/src/coreclr/tools/Common/Compiler/NativeAotNameMangler.cs
+++ b/src/coreclr/tools/Common/Compiler/NativeAotNameMangler.cs
@@ -421,7 +421,7 @@ private Utf8String ComputeUnqualifiedMangledMethodName(MethodDesc method)
{
foreach (var m in method.OwningType.GetMethods())
{
- string name = SanitizeName(m.Name);
+ string name = SanitizeName(m.GetName());
name = DisambiguateName(name, deduplicator);
deduplicator.Add(name);
@@ -480,7 +480,7 @@ private Utf8String ComputeUnqualifiedMangledMethodName(MethodDesc method)
else
{
// Assume that Name is unique for all other methods
- utf8MangledName = new Utf8String(SanitizeName(method.Name));
+ utf8MangledName = new Utf8String(SanitizeName(method.GetName()));
}
}
@@ -517,7 +517,7 @@ private Utf8String ComputeMangledFieldName(FieldDesc field)
{
foreach (var f in field.OwningType.GetFields())
{
- string name = SanitizeName(f.Name);
+ string name = SanitizeName(f.GetName());
name = DisambiguateName(name, deduplicator);
deduplicator.Add(name);
@@ -533,7 +533,7 @@ private Utf8String ComputeMangledFieldName(FieldDesc field)
}
- string mangledName = SanitizeName(field.Name);
+ string mangledName = SanitizeName(field.GetName());
if (prependTypeName != null)
mangledName = prependTypeName + "__" + mangledName;
diff --git a/src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs b/src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs
index 9290e23086dedf..f28632acf8db4b 100644
--- a/src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs
+++ b/src/coreclr/tools/Common/Compiler/ProcessLinkerXmlBase.cs
@@ -301,7 +301,7 @@ protected virtual void ProcessField(TypeDesc type, XPathNavigator nav)
bool foundMatch = false;
foreach (FieldDesc field in type.GetFields())
{
- if (field.Name == name)
+ if (field.Name.StringEquals(name))
{
foundMatch = true;
ProcessField(type, field, nav);
@@ -325,7 +325,7 @@ protected virtual void ProcessField(TypeDesc type, XPathNavigator nav)
{
sb.Clear();
CecilTypeNameFormatter.Instance.AppendName(sb, field.FieldType);
- if (signature == sb.ToString() + " " + field.Name)
+ if (signature == sb.ToString() + " " + field.GetName())
return field;
}
@@ -367,7 +367,7 @@ protected virtual void ProcessMethod(TypeDesc type, XPathNavigator nav, object?
bool foundMatch = false;
foreach (MethodDesc method in type.GetAllMethods())
{
- if (name == method.Name)
+ if (method.Name.StringEquals(name))
{
foundMatch = true;
ProcessMethod(type, method, nav, customData);
@@ -532,7 +532,7 @@ public static string GetMethodSignature(MethodDesc meth, bool includeGenericPara
StringBuilder sb = new StringBuilder();
CecilTypeNameFormatter.Instance.AppendName(sb, meth.Signature.ReturnType);
sb.Append(' ');
- sb.Append(meth.Name);
+ sb.Append(meth.GetName());
if (includeGenericParameters && meth.HasInstantiation)
{
sb.Append('`');
@@ -642,20 +642,20 @@ protected override void AppendNameForInstantiatedType(StringBuilder sb, DefType
}
protected override void AppendNameForNamespaceType(StringBuilder sb, DefType type)
{
- if (!string.IsNullOrEmpty(type.Namespace))
+ if (!type.Namespace.IsEmpty)
{
- sb.Append(type.Namespace);
+ sb.Append(type.GetNamespace());
sb.Append('.');
}
- sb.Append(type.Name);
+ sb.Append(type.GetName());
}
protected override void AppendNameForNestedType(StringBuilder sb, DefType nestedType, DefType containingType)
{
AppendName(sb, containingType);
sb.Append('/');
- sb.Append(nestedType.Name);
+ sb.Append(nestedType.GetName());
}
#if false
@@ -771,7 +771,7 @@ public class CecilCompatibleTypeParser
string @namespace, name;
SplitFullName(fullName, out @namespace, out name);
- return assembly.GetType(@namespace, name, throwIfNotFound: false);
+ return assembly.GetType(Encoding.UTF8.GetBytes(@namespace), Encoding.UTF8.GetBytes(name), throwIfNotFound: false);
}
private static MetadataType? GetNestedType(ModuleDesc assembly, string fullName)
diff --git a/src/coreclr/tools/Common/Compiler/VectorFieldLayoutAlgorithm.cs b/src/coreclr/tools/Common/Compiler/VectorFieldLayoutAlgorithm.cs
index 15d22e79fe8f3b..d375651f64cdc0 100644
--- a/src/coreclr/tools/Common/Compiler/VectorFieldLayoutAlgorithm.cs
+++ b/src/coreclr/tools/Common/Compiler/VectorFieldLayoutAlgorithm.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -27,12 +29,11 @@ public override ComputedInstanceFieldLayout ComputeInstanceLayout(DefType defTyp
LayoutInt alignment;
- string name = defType.Name;
- if (name == "Vector64`1")
+ if (defType.Name.SequenceEqual("Vector64`1"u8))
{
alignment = new LayoutInt(8);
}
- else if (name == "Vector128`1")
+ else if (defType.Name.SequenceEqual("Vector128`1"u8))
{
if (defType.Context.Target.Architecture == TargetArchitecture.ARM)
{
@@ -44,7 +45,7 @@ public override ComputedInstanceFieldLayout ComputeInstanceLayout(DefType defTyp
alignment = new LayoutInt(16);
}
}
- else if (name == "Vector256`1")
+ else if (defType.Name.SequenceEqual("Vector256`1"u8))
{
if (defType.Context.Target.Architecture == TargetArchitecture.ARM)
{
@@ -77,7 +78,7 @@ public override ComputedInstanceFieldLayout ComputeInstanceLayout(DefType defTyp
}
else
{
- Debug.Assert(name == "Vector512`1");
+ Debug.Assert(defType.Name.SequenceEqual("Vector512`1"u8));
if (defType.Context.Target.Architecture == TargetArchitecture.ARM)
{
@@ -165,11 +166,11 @@ public override ValueTypeShapeCharacteristics ComputeValueTypeShapeCharacteristi
public static bool IsVectorType(DefType type)
{
return type.IsIntrinsic &&
- type.Namespace == "System.Runtime.Intrinsics" &&
- ((type.Name == "Vector64`1") ||
- (type.Name == "Vector128`1") ||
- (type.Name == "Vector256`1") ||
- (type.Name == "Vector512`1"));
+ type.Namespace.SequenceEqual("System.Runtime.Intrinsics"u8) &&
+ (type.Name.SequenceEqual("Vector64`1"u8) ||
+ type.Name.SequenceEqual("Vector128`1"u8) ||
+ type.Name.SequenceEqual("Vector256`1"u8) ||
+ type.Name.SequenceEqual("Vector512`1"u8));
}
}
}
diff --git a/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/MetadataTypeHashingAlgorithms.cs b/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/MetadataTypeHashingAlgorithms.cs
index 9c114859e2498c..f3aadf30039222 100644
--- a/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/MetadataTypeHashingAlgorithms.cs
+++ b/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/MetadataTypeHashingAlgorithms.cs
@@ -3,7 +3,7 @@
using System;
using Debug = System.Diagnostics.Debug;
-using HashCodeBuilder = Internal.NativeFormat.TypeHashingAlgorithms.HashCodeBuilder;
+using HashCodeBuilder = Internal.VersionResilientHashCode.HashCodeBuilder;
using TypeAttributes = System.Reflection.TypeAttributes;
using TypeHashingAlgorithms = Internal.NativeFormat.TypeHashingAlgorithms;
@@ -11,7 +11,7 @@ namespace Internal.Metadata.NativeFormat
{
internal static class MetadataTypeHashingAlgorithms
{
- private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, NamespaceDefinitionHandle namespaceDefHandle, MetadataReader reader)
+ private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, NamespaceDefinitionHandle namespaceDefHandle, MetadataReader reader, bool appendDot)
{
NamespaceDefinition namespaceDefinition = reader.GetNamespaceDefinition(namespaceDefHandle);
@@ -19,10 +19,11 @@ private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, Namespa
HandleType parentHandleType = parentHandle.HandleType;
if (parentHandleType == HandleType.NamespaceDefinition)
{
- AppendNamespaceHashCode(ref builder, parentHandle.ToNamespaceDefinitionHandle(reader), reader);
- string namespaceNamePart = reader.GetString(namespaceDefinition.Name);
+ AppendNamespaceHashCode(ref builder, parentHandle.ToNamespaceDefinitionHandle(reader), reader, appendDot: true);
+ ReadOnlySpan namespaceNamePart = reader.ReadStringAsBytes(namespaceDefinition.Name);
builder.Append(namespaceNamePart);
- builder.Append(".");
+ if (appendDot)
+ builder.Append("."u8);
}
else
{
@@ -31,7 +32,7 @@ private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, Namespa
}
}
- private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, NamespaceReferenceHandle namespaceRefHandle, MetadataReader reader)
+ private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, NamespaceReferenceHandle namespaceRefHandle, MetadataReader reader, bool appendDot)
{
NamespaceReference namespaceReference = reader.GetNamespaceReference(namespaceRefHandle);
@@ -39,10 +40,11 @@ private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, Namespa
HandleType parentHandleType = parentHandle.HandleType;
if (parentHandleType == HandleType.NamespaceReference)
{
- AppendNamespaceHashCode(ref builder, parentHandle.ToNamespaceReferenceHandle(reader), reader);
- string namespaceNamePart = reader.GetString(namespaceReference.Name);
+ AppendNamespaceHashCode(ref builder, parentHandle.ToNamespaceReferenceHandle(reader), reader, appendDot: true);
+ ReadOnlySpan namespaceNamePart = reader.ReadStringAsBytes(namespaceReference.Name);
builder.Append(namespaceNamePart);
- builder.Append(".");
+ if (appendDot)
+ builder.Append("."u8);
}
else
{
@@ -53,50 +55,43 @@ private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, Namespa
public static int ComputeHashCode(this TypeDefinitionHandle typeDefHandle, MetadataReader reader)
{
- HashCodeBuilder builder = new HashCodeBuilder("");
-
TypeDefinition typeDef = reader.GetTypeDefinition(typeDefHandle);
- bool isNested = typeDef.Flags.IsNested();
- if (!isNested)
- {
- AppendNamespaceHashCode(ref builder, typeDef.NamespaceDefinition, reader);
- }
- string typeName = reader.GetString(typeDef.Name);
- builder.Append(typeName);
+ HashCodeBuilder builder = new HashCodeBuilder(""u8);
+
+ if (!typeDef.Flags.IsNested())
+ AppendNamespaceHashCode(ref builder, typeDef.NamespaceDefinition, reader, appendDot: false);
+
+ int nameHashCode = VersionResilientHashCode.NameHashCode(reader.ReadStringAsBytes(typeDef.Name));
- if (isNested)
+ int hashCode = VersionResilientHashCode.NameHashCode(builder.ToHashCode(), nameHashCode);
+
+ if (typeDef.Flags.IsNested())
{
int enclosingTypeHashCode = typeDef.EnclosingType.ComputeHashCode(reader);
- return TypeHashingAlgorithms.ComputeNestedTypeHashCode(enclosingTypeHashCode, builder.ToHashCode());
+ return VersionResilientHashCode.NestedTypeHashCode(enclosingTypeHashCode, hashCode);
}
- return builder.ToHashCode();
+ return hashCode;
}
public static int ComputeHashCode(this TypeReferenceHandle typeRefHandle, MetadataReader reader)
{
- HashCodeBuilder builder = new HashCodeBuilder("");
-
TypeReference typeRef = reader.GetTypeReference(typeRefHandle);
- HandleType parentHandleType = typeRef.ParentNamespaceOrType.HandleType;
- bool isNested = parentHandleType == HandleType.TypeReference;
- if (!isNested)
- {
- Debug.Assert(parentHandleType == HandleType.NamespaceReference);
- AppendNamespaceHashCode(ref builder, typeRef.ParentNamespaceOrType.ToNamespaceReferenceHandle(reader), reader);
- }
- string typeName = reader.GetString(typeRef.TypeName);
- builder.Append(typeName);
+ HashCodeBuilder builder = new HashCodeBuilder(""u8);
+ AppendNamespaceHashCode(ref builder, typeRef.ParentNamespaceOrType.ToNamespaceReferenceHandle(reader), reader, appendDot: false);
+ int nameHashCode = VersionResilientHashCode.NameHashCode(reader.ReadStringAsBytes(typeRef.TypeName));
+
+ int hashCode = VersionResilientHashCode.NameHashCode(builder.ToHashCode(), nameHashCode);
- if (isNested)
+ if (typeRef.ParentNamespaceOrType.HandleType == HandleType.TypeReference)
{
int enclosingTypeHashCode = typeRef.ParentNamespaceOrType.ToTypeReferenceHandle(reader).ComputeHashCode(reader);
- return TypeHashingAlgorithms.ComputeNestedTypeHashCode(enclosingTypeHashCode, builder.ToHashCode());
+ return VersionResilientHashCode.NestedTypeHashCode(enclosingTypeHashCode, hashCode);
}
- return builder.ToHashCode();
+ return hashCode;
}
// This mask is the fastest way to check if a type is nested from its flags,
diff --git a/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeMetadataReader.cs b/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeMetadataReader.cs
index 53bb71d1c7d5d6..18fd50faac631d 100644
--- a/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeMetadataReader.cs
+++ b/src/coreclr/tools/Common/Internal/Metadata/NativeFormat/NativeMetadataReader.cs
@@ -221,7 +221,7 @@ internal bool StringEquals(ConstantStringValueHandle handle, string value)
return _streamReader.StringEquals((uint)handle.Offset, value);
}
- internal ReadOnlySpan ReadStringAsBytes(ConstantStringValueHandle handle)
+ public ReadOnlySpan ReadStringAsBytes(ConstantStringValueHandle handle)
{
if (handle.IsNil)
{
diff --git a/src/coreclr/tools/Common/Internal/Runtime/EETypeBuilderHelpers.cs b/src/coreclr/tools/Common/Internal/Runtime/EETypeBuilderHelpers.cs
index fc082980fefbec..1454df291cc4ae 100644
--- a/src/coreclr/tools/Common/Internal/Runtime/EETypeBuilderHelpers.cs
+++ b/src/coreclr/tools/Common/Internal/Runtime/EETypeBuilderHelpers.cs
@@ -187,8 +187,8 @@ public static ushort ComputeFlagsEx(TypeDesc type)
if (type is MetadataType mdType &&
mdType.Module == mdType.Context.SystemModule &&
- mdType.Name is "WeakReference" or "WeakReference`1" &&
- mdType.Namespace == "System")
+ (mdType.Name.SequenceEqual("WeakReference"u8) || mdType.Name.SequenceEqual("WeakReference`1"u8)) &&
+ mdType.Namespace.SequenceEqual("System"u8))
{
flagsEx |= (ushort)EETypeFlagsEx.HasEagerFinalizerFlag;
}
@@ -244,7 +244,7 @@ mdType.Name is "WeakReference" or "WeakReference`1" &&
if (type.IsNullable)
{
- FieldDesc field = type.GetField("value");
+ FieldDesc field = type.GetField("value"u8);
int nullableValueOffset = field.Offset.AsInt;
@@ -273,8 +273,8 @@ private static bool HasCriticalFinalizer(TypeDesc type)
if (type is MetadataType mdType &&
mdType.Module == mdType.Context.SystemModule &&
- mdType.Name == "CriticalFinalizerObject" &&
- mdType.Namespace == "System.Runtime.ConstrainedExecution")
+ mdType.Name.SequenceEqual("CriticalFinalizerObject"u8) &&
+ mdType.Namespace.SequenceEqual("System.Runtime.ConstrainedExecution"u8))
return true;
type = type.BaseType;
diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
index 9fadae8547620f..c0bd2516d730bf 100644
--- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
+++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
@@ -1127,7 +1127,7 @@ private uint getMethodAttribsInternal(MethodDesc method)
result |= CorInfoFlag.CORINFO_FLG_FORCEINLINE;
}
- if (method.OwningType.IsDelegate && method.Name == "Invoke")
+ if (method.OwningType.IsDelegate && method.Name.SequenceEqual("Invoke"u8))
{
// This is now used to emit efficient invoke code for any delegate invoke,
// including multicast.
@@ -1553,7 +1553,7 @@ static CORINFO_RESOLVED_TOKEN CreateResolvedTokenFromMethod(CorInfoImpl jitInter
private CORINFO_CLASS_STRUCT_* getSZArrayHelperEnumeratorClass(CORINFO_CLASS_STRUCT_* elemType)
{
TypeDesc elementType = HandleToObject(elemType);
- MetadataType placeholderType = _compilation.TypeSystemContext.SystemModule.GetType("System", "SZGenericArrayEnumerator`1", throwIfNotFound: false);
+ MetadataType placeholderType = _compilation.TypeSystemContext.SystemModule.GetType("System"u8, "SZGenericArrayEnumerator`1"u8, throwIfNotFound: false);
if (placeholderType == null)
{
return null;
@@ -1724,7 +1724,7 @@ private static object ResolveTokenInScope(MethodILScope methodIL, object typeOrM
Debug.Assert((methodContext.HasInstantiation && !owningMethod.HasInstantiation) ||
(!methodContext.HasInstantiation && !owningMethod.HasInstantiation) ||
methodContext.GetTypicalMethodDefinition() == owningMethod.GetTypicalMethodDefinition() ||
- (owningMethod.Name == "CreateDefaultInstance" && methodContext.Name == "CreateInstance"));
+ (owningMethod.Name.SequenceEqual("CreateDefaultInstance"u8) && methodContext.Name.SequenceEqual("CreateInstance"u8)));
Debug.Assert(methodContext.OwningType.HasSameTypeDefinition(owningMethod.OwningType));
typeInst = methodContext.OwningType.Instantiation;
methodInst = methodContext.Instantiation;
@@ -1856,7 +1856,7 @@ private void resolveToken(ref CORINFO_RESOLVED_TOKEN pResolvedToken)
// References to literal fields from IL body should never resolve.
// The CLR would throw a MissingFieldException while jitting and so should we.
if (field.IsLiteral)
- ThrowHelper.ThrowMissingFieldException(field.OwningType, field.Name);
+ ThrowHelper.ThrowMissingFieldException(field.OwningType, field.GetName());
pResolvedToken.hField = ObjectToHandle(field);
@@ -2021,8 +2021,8 @@ private CorInfoType asCorInfoType(CORINFO_CLASS_STRUCT_* cls)
else if (type is MetadataType mdType)
{
if (namespaceName != null)
- *namespaceName = (byte*)GetPin(StringToUTF8(mdType.Namespace));
- return (byte*)GetPin(StringToUTF8(mdType.Name));
+ *namespaceName = (byte*)GetPin(SpanToPinnableBytes(mdType.Namespace));
+ return (byte*)GetPin(SpanToPinnableBytes(mdType.Name));
}
if (namespaceName != null)
@@ -2503,8 +2503,8 @@ private GetTypeLayoutResult GetTypeLayoutHelper(MetadataType type, uint parentIn
// not care about since they are considered primitives by the JIT.
if (type.IsIntrinsic)
{
- string ns = type.Namespace;
- if (ns == "System.Runtime.Intrinsics" || ns == "System.Numerics")
+ ReadOnlySpan ns = type.Namespace;
+ if (ns.SequenceEqual("System.Runtime.Intrinsics"u8) || ns.SequenceEqual("System.Numerics"u8))
{
parNode->simdTypeHnd = ObjectToHandle(type);
if (parentIndex != uint.MaxValue)
@@ -2803,7 +2803,7 @@ private CorInfoInitClassResult initClass(CORINFO_FIELD_STRUCT_* field, CORINFO_M
return ObjectToHandle(_compilation.TypeSystemContext.GetWellKnownType(WellKnownType.String));
case CorInfoClassId.CLASSID_RUNTIME_TYPE:
- return ObjectToHandle(_compilation.TypeSystemContext.SystemModule.GetKnownType("System", "RuntimeType"));
+ return ObjectToHandle(_compilation.TypeSystemContext.SystemModule.GetKnownType("System"u8, "RuntimeType"u8));
default:
throw new NotImplementedException();
@@ -3107,7 +3107,7 @@ private CorInfoIsAccessAllowedResult canAccessClass(ref CORINFO_RESOLVED_TOKEN p
private nuint printFieldName(CORINFO_FIELD_STRUCT_* fld, byte* buffer, nuint bufferSize, nuint* requiredBufferSize)
{
FieldDesc field = HandleToObject(fld);
- return PrintFromUtf16(field.Name, buffer, bufferSize, requiredBufferSize);
+ return PrintFromUtf16(field.GetName(), buffer, bufferSize, requiredBufferSize);
}
#pragma warning disable CA1822 // Mark members as static
@@ -3166,16 +3166,16 @@ private static CORINFO_FIELD_ACCESSOR getFieldIntrinsic(FieldDesc field)
var owningType = field.OwningType;
if ((owningType.IsWellKnownType(WellKnownType.IntPtr) ||
owningType.IsWellKnownType(WellKnownType.UIntPtr)) &&
- field.Name == "Zero")
+ field.Name.SequenceEqual("Zero"u8))
{
return CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INTRINSIC_ZERO;
}
- else if (owningType.IsString && field.Name == "Empty")
+ else if (owningType.IsString && field.Name.SequenceEqual("Empty"u8))
{
return CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INTRINSIC_EMPTY_STRING;
}
- else if (owningType.Name == "BitConverter" && owningType.Namespace == "System" &&
- field.Name == "IsLittleEndian")
+ else if (owningType.Name.SequenceEqual("BitConverter"u8) && owningType.Namespace.SequenceEqual("System"u8) &&
+ field.Name.SequenceEqual("IsLittleEndian"u8))
{
return CORINFO_FIELD_ACCESSOR.CORINFO_FIELD_INTRINSIC_ISLITTLEENDIAN;
}
@@ -3391,10 +3391,17 @@ private static byte[] StringToUTF8(string s)
return bytes;
}
+ private static byte[] SpanToPinnableBytes(ReadOnlySpan s)
+ {
+ byte[] bytes = new byte[s.Length + 1];
+ s.CopyTo(bytes);
+ return bytes;
+ }
+
private nuint printMethodName(CORINFO_METHOD_STRUCT_* ftn, byte* buffer, nuint bufferSize, nuint* requiredBufferSize)
{
MethodDesc method = HandleToObject(ftn);
- return PrintFromUtf16(method.Name, buffer, bufferSize, requiredBufferSize);
+ return PrintFromUtf16(method.GetName(), buffer, bufferSize, requiredBufferSize);
}
private static string getMethodNameFromMetadataImpl(MethodDesc method, out string className, out string namespaceName, string[] enclosingClassName)
@@ -3402,13 +3409,13 @@ private static string getMethodNameFromMetadataImpl(MethodDesc method, out strin
className = null;
namespaceName = null;
- string result = method.Name;
+ string result = method.GetName();
MetadataType owningType = method.OwningType as MetadataType;
if (owningType != null)
{
- className = owningType.Name;
- namespaceName = owningType.Namespace;
+ className = owningType.GetName();
+ namespaceName = owningType.GetNamespace();
// Query enclosingClassName when the method is in a nested class
// and get the namespace of enclosing classes (nested class's namespace is empty)
@@ -3419,8 +3426,8 @@ private static string getMethodNameFromMetadataImpl(MethodDesc method, out strin
if (containingType == null)
break;
- enclosingClassName[i] = containingType.Name;
- namespaceName = containingType.Namespace;
+ enclosingClassName[i] = containingType.GetName();
+ namespaceName = containingType.GetNamespace();
}
}
@@ -4443,7 +4450,7 @@ private bool notifyInstructionSetUsage(InstructionSet instructionSet, bool suppo
// We want explicitly implemented ISimdVector APIs to still be expanded where possible
// but, they all prefix the qualified name of the interface first, so we'll check for that and
// skip the prefix before trying to resolve the method.
- ReadOnlySpan methodName = MethodBeingCompiled.Name.AsSpan();
+ ReadOnlySpan methodName = MethodBeingCompiled.GetName().AsSpan();
if (methodName.StartsWith("System.Runtime.Intrinsics.ISimdVector 0)
{
sb.Append(ns);
sb.Append('.');
}
- sb.Append(type.Name);
+ sb.Append(type.GetName());
}
protected override void AppendNameForNestedType(StringBuilder sb, DefType nestedType, DefType containingType)
{
AppendName(sb, containingType);
sb.Append('+');
- sb.Append(nestedType.Name);
+ sb.Append(nestedType.GetName());
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.Diagnostic.cs b/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.Diagnostic.cs
index 2a6843397b6022..e8a22139765f68 100644
--- a/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.Diagnostic.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.Diagnostic.cs
@@ -9,14 +9,14 @@ public override string DiagnosticName
{
get
{
- return _Name;
+ return GetName();
}
}
public override string DiagnosticNamespace
{
get
{
- return _Namespace;
+ return GetNamespace();
}
}
}
@@ -27,14 +27,14 @@ public override string DiagnosticName
{
get
{
- return _Name;
+ return GetName();
}
}
public override string DiagnosticNamespace
{
get
{
- return _Namespace;
+ return GetNamespace();
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.Metadata.cs b/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.Metadata.cs
index 64e0b308c66276..5e468a1353432c 100644
--- a/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.Metadata.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.Metadata.cs
@@ -37,7 +37,7 @@ protected override MethodImplRecord[] ComputeVirtualMethodImplsForType()
public override bool IsModuleType => false;
- public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string name)
+ public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(ReadOnlySpan name)
{
return null;
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.cs b/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.cs
index ebf78f60e69d76..722978648f68b0 100644
--- a/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Canon/CanonTypes.cs
@@ -59,25 +59,21 @@ public sealed override TypeSystemContext Context
///
internal sealed partial class CanonType : CanonBaseType
{
- private const string _Namespace = "System";
- private const string _Name = "__Canon";
- public const string FullName = _Namespace + "." + _Name;
-
private int _hashcode;
- public override string Namespace
+ public override ReadOnlySpan Namespace
{
get
{
- return _Namespace;
+ return "System"u8;
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return _Name;
+ return "__Canon"u8;
}
}
@@ -135,7 +131,7 @@ public override int GetHashCode()
{
if (_hashcode == 0)
{
- _hashcode = TypeHashingAlgorithms.ComputeNameHashCode(FullName);
+ _hashcode = VersionResilientHashCode.NameHashCode(Namespace, Name);
}
return _hashcode;
@@ -147,25 +143,21 @@ public override int GetHashCode()
///
internal sealed partial class UniversalCanonType : CanonBaseType
{
- private const string _Namespace = "System";
- private const string _Name = "__UniversalCanon";
- public const string FullName = _Namespace + "." + _Name;
-
private int _hashcode;
- public override string Namespace
+ public override ReadOnlySpan Namespace
{
get
{
- return _Namespace;
+ return "System"u8;
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return _Name;
+ return "__UniversalCanon"u8;
}
}
@@ -221,7 +213,7 @@ public override int GetHashCode()
{
if (_hashcode == 0)
{
- _hashcode = TypeHashingAlgorithms.ComputeNameHashCode(FullName);
+ _hashcode = VersionResilientHashCode.NameHashCode(Namespace, Name);
}
return _hashcode;
diff --git a/src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemContext.Canon.cs b/src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemContext.Canon.cs
index 7292e6c06a1895..61ec2a730d4bdf 100644
--- a/src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemContext.Canon.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Canon/TypeSystemContext.Canon.cs
@@ -97,9 +97,9 @@ public DefType GetCanonType(string name)
{
switch (name)
{
- case TypeSystem.CanonType.FullName:
+ case "System.__Canon":
return CanonType;
- case TypeSystem.UniversalCanonType.FullName:
+ case "System.__UniversalCanon":
return UniversalCanonType;
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/ArrayMethod.Diagnostic.cs b/src/coreclr/tools/Common/TypeSystem/Common/ArrayMethod.Diagnostic.cs
index 571c6cecb8a1bf..7988c2a005611d 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/ArrayMethod.Diagnostic.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/ArrayMethod.Diagnostic.cs
@@ -10,7 +10,7 @@ public override string DiagnosticName
get
{
// The ArrayMethod.Name property is guaranteed to not throw
- return Name;
+ return GetName();
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/ArrayType.cs b/src/coreclr/tools/Common/TypeSystem/Common/ArrayType.cs
index 768f5f7eaa4ff5..b861f3b1135af5 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/ArrayType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/ArrayType.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using System.Threading;
@@ -22,8 +23,7 @@ internal ArrayType(TypeDesc elementType, int rank)
public override int GetHashCode()
{
- // ComputeArrayTypeHashCode expects -1 for an SzArray
- return Internal.NativeFormat.TypeHashingAlgorithms.ComputeArrayTypeHashCode(this.ElementType.GetHashCode(), _rank);
+ return VersionResilientHashCode.ArrayTypeHashCode(this.ElementType.GetHashCode(), Rank);
}
public override DefType BaseType
@@ -299,21 +299,21 @@ public override MethodSignature Signature
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
switch (_kind)
{
case ArrayMethodKind.Get:
- return "Get";
+ return "Get"u8;
case ArrayMethodKind.Set:
- return "Set";
+ return "Set"u8;
case ArrayMethodKind.Address:
case ArrayMethodKind.AddressWithHiddenArg:
- return "Address";
+ return "Address"u8;
default:
- return ".ctor";
+ return ".ctor"u8;
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/ByRefType.cs b/src/coreclr/tools/Common/TypeSystem/Common/ByRefType.cs
index 4bb3e351a0168e..0f6c8a8527d8df 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/ByRefType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/ByRefType.cs
@@ -15,7 +15,7 @@ internal ByRefType(TypeDesc parameter)
public override int GetHashCode()
{
- return Internal.NativeFormat.TypeHashingAlgorithms.ComputeByrefTypeHashCode(this.ParameterType.GetHashCode());
+ return VersionResilientHashCode.ByrefTypeHashCode(this.ParameterType.GetHashCode());
}
public override TypeDesc InstantiateSignature(Instantiation typeInstantiation, Instantiation methodInstantiation)
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.TypeEquivalence.cs b/src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.TypeEquivalence.cs
index a757df953fea38..bfc730f96f2b85 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.TypeEquivalence.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/CastingHelper.TypeEquivalence.cs
@@ -1,10 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Debug = System.Diagnostics.Debug;
+using System;
using System.Collections.Generic;
+
using Internal.TypeSystem.Ecma;
+using Debug = System.Diagnostics.Debug;
+
namespace Internal.TypeSystem
{
public static partial class CastingHelper
@@ -125,10 +128,10 @@ static bool IsEquivalentTo_TypeDefinition(MetadataType type1, MetadataType type2
if (!data1.Equals(data2))
return false;
- if (type1.Name != type2.Name)
+ if (!type1.Name.SequenceEqual(type2.Name))
return false;
- if (type1.Namespace != type2.Namespace)
+ if (!type1.Namespace.SequenceEqual(type2.Namespace))
return false;
var containingType1 = (MetadataType)type1.ContainingType;
@@ -176,8 +179,8 @@ static bool IsEquivalentTo_TypeDefinition(MetadataType type1, MetadataType type2
static bool CompareDelegatesForEquivalence(MetadataType type1, MetadataType type2, StackOverflowProtect visited)
{
- var invoke1 = type1.GetMethod("Invoke", null);
- var invoke2 = type2.GetMethod("Invoke", null);
+ var invoke1 = type1.GetMethod("Invoke"u8, null);
+ var invoke2 = type2.GetMethod("Invoke"u8, null);
if (invoke1 == null)
return false;
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/DefType.Dummy.Diagnostic.cs b/src/coreclr/tools/Common/TypeSystem/Common/DefType.Dummy.Diagnostic.cs
index 1acdbd8731b6a0..5da904f76e1688 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/DefType.Dummy.Diagnostic.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/DefType.Dummy.Diagnostic.cs
@@ -9,11 +9,11 @@ public abstract partial class DefType
///
/// Gets the Name of a type. This must not throw
///
- public string DiagnosticName => Name;
+ public string DiagnosticName => GetName();
///
/// Gets the Namespace of a type. This must not throw
///
- public string DiagnosticNamespace => Namespace;
+ public string DiagnosticNamespace => GetNamespace();
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/DefType.cs b/src/coreclr/tools/Common/TypeSystem/Common/DefType.cs
index 06ee99e9d74e2e..71032d5409cab8 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/DefType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/DefType.cs
@@ -1,6 +1,10 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
namespace Internal.TypeSystem
{
///
@@ -12,12 +16,24 @@ public abstract partial class DefType : TypeDesc
///
/// Gets the namespace of the type.
///
- public virtual string Namespace => null;
+ public virtual ReadOnlySpan Namespace => [];
+
+ public string GetNamespace() => System.Text.Encoding.UTF8.GetString(Namespace
+#if NETSTANDARD
+ .ToArray()
+#endif
+ );
///
/// Gets the name of the type as represented in the metadata.
///
- public virtual string Name => null;
+ public virtual ReadOnlySpan Name => [];
+
+ public string GetName() => System.Text.Encoding.UTF8.GetString(Name
+#if NETSTANDARD
+ .ToArray()
+#endif
+ );
///
/// Gets the containing type of this type or null if the type is not nested.
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/FieldDesc.ToString.cs b/src/coreclr/tools/Common/TypeSystem/Common/FieldDesc.ToString.cs
index 6d52f349f24c0e..78d22dcc0b98d4 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/FieldDesc.ToString.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/FieldDesc.ToString.cs
@@ -7,7 +7,7 @@ public partial class FieldDesc
{
public override string ToString()
{
- return $"{OwningType}.{Name}";
+ return $"{OwningType}.{GetName()}";
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/FieldDesc.cs b/src/coreclr/tools/Common/TypeSystem/Common/FieldDesc.cs
index 1047c075c2f623..72eda70638052f 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/FieldDesc.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/FieldDesc.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Runtime.CompilerServices;
using Debug = System.Diagnostics.Debug;
@@ -26,14 +27,24 @@ public override bool Equals(object o)
return ReferenceEquals(this, o);
}
- public virtual string Name
+ public virtual ReadOnlySpan Name
{
get
{
- return null;
+ return [];
}
}
+ public string GetName()
+ {
+ return System.Text.Encoding.UTF8.GetString(
+ Name
+#if NETSTANDARD
+ .ToArray()
+#endif
+ );
+ }
+
public abstract DefType OwningType
{
get;
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/FieldForInstantiatedType.cs b/src/coreclr/tools/Common/TypeSystem/Common/FieldForInstantiatedType.cs
index 04e403356ba472..ce1440710a97a1 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/FieldForInstantiatedType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/FieldForInstantiatedType.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Debug = System.Diagnostics.Debug;
namespace Internal.TypeSystem
@@ -33,7 +34,7 @@ public override DefType OwningType
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs b/src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs
index c64e7e3808651a..4487411019e56f 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/IAssemblyDesc.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Reflection.Metadata;
namespace Internal.TypeSystem
@@ -14,5 +15,10 @@ public interface IAssemblyDesc
/// Gets the assembly name.
///
AssemblyNameInfo GetName();
+
+ ///
+ /// Gets the simple assembly name
+ ///
+ ReadOnlySpan Name { get; }
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/ImpliedRepeatedFieldDesc.cs b/src/coreclr/tools/Common/TypeSystem/Common/ImpliedRepeatedFieldDesc.cs
index 93829636916d31..ff263d1a6a25b6 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/ImpliedRepeatedFieldDesc.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/ImpliedRepeatedFieldDesc.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
namespace Internal.TypeSystem
{
public sealed partial class ImpliedRepeatedFieldDesc : FieldDesc
@@ -40,6 +42,6 @@ public ImpliedRepeatedFieldDesc(DefType owningType, FieldDesc underlyingFieldDes
public override MarshalAsDescriptor GetMarshalAsDescriptor() => _underlyingFieldDesc.GetMarshalAsDescriptor();
- public override string Name => $"{_underlyingFieldDesc.Name}[{FieldIndex}]";
+ public override ReadOnlySpan Name => System.Text.Encoding.UTF8.GetBytes($"{_underlyingFieldDesc.GetName()}[{FieldIndex}]");
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedMethod.cs b/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedMethod.cs
index e215752719dca9..0fd68eef059f82 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedMethod.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedMethod.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Diagnostics;
using Internal.NativeFormat;
@@ -33,7 +34,7 @@ internal InstantiatedMethod(MethodDesc methodDef, Instantiation instantiation, i
protected override int ComputeHashCode()
{
- return TypeHashingAlgorithms.ComputeMethodHashCode(OwningType.GetHashCode(), Instantiation.ComputeGenericInstanceHashCode(TypeHashingAlgorithms.ComputeNameHashCode(Name)));
+ return OwningType.GetHashCode() ^ VersionResilientHashCode.GenericInstanceHashCode(VersionResilientHashCode.NameHashCode(Name), Instantiation);
}
public override TypeSystemContext Context
@@ -156,7 +157,7 @@ public override MethodDesc GetTypicalMethodDefinition()
return _methodDef.GetTypicalMethodDefinition();
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedType.MethodImpls.cs b/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedType.MethodImpls.cs
index c8d4f91ad5d4ca..eddc665f515de5 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedType.MethodImpls.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedType.MethodImpls.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
namespace Internal.TypeSystem
{
// Implementation of MethodImpl api surface implemented without metadata access.
@@ -45,7 +47,7 @@ protected override MethodImplRecord[] ComputeVirtualMethodImplsForType()
return InstantiateMethodImpls(uninstMethodImpls);
}
- public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string name)
+ public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(ReadOnlySpan name)
{
MethodImplRecord[] uninstMethodImpls = _typeDef.FindMethodsImplWithMatchingDeclName(name);
return InstantiateMethodImpls(uninstMethodImpls);
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedType.cs b/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedType.cs
index 25ed6d214731c9..c5ad763b438f07 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/InstantiatedType.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -28,11 +29,19 @@ internal InstantiatedType(MetadataType typeDef, Instantiation instantiation)
private int _hashCode;
+ private int InitializeHashCode()
+ {
+ return _hashCode = VersionResilientHashCode.GenericInstanceHashCode(_typeDef.GetHashCode(), Instantiation);
+ }
+
public override int GetHashCode()
{
- if (_hashCode == 0)
- _hashCode = _instantiation.ComputeGenericInstanceHashCode(_typeDef.GetHashCode());
- return _hashCode;
+ if (_hashCode != 0)
+ {
+ return _hashCode;
+ }
+
+ return InitializeHashCode();
}
public override TypeSystemContext Context
@@ -118,7 +127,7 @@ protected override TypeFlags ComputeTypeFlags(TypeFlags mask)
return flags;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
@@ -126,7 +135,7 @@ public override string Name
}
}
- public override string Namespace
+ public override ReadOnlySpan Namespace
{
get
{
@@ -151,7 +160,7 @@ public override IEnumerable GetVirtualMethods()
}
// TODO: Substitutions, generics, modopts, ...
- public override MethodDesc GetMethod(string name, MethodSignature signature, Instantiation substitution)
+ public override MethodDesc GetMethod(ReadOnlySpan name, MethodSignature signature, Instantiation substitution)
{
MethodDesc typicalMethodDef = _typeDef.GetMethod(name, signature, substitution);
if (typicalMethodDef == null)
@@ -159,7 +168,7 @@ public override MethodDesc GetMethod(string name, MethodSignature signature, Ins
return _typeDef.Context.GetMethodForInstantiatedType(typicalMethodDef, this);
}
- public override MethodDesc GetMethodWithEquivalentSignature(string name, MethodSignature signature, Instantiation substitution)
+ public override MethodDesc GetMethodWithEquivalentSignature(ReadOnlySpan name, MethodSignature signature, Instantiation substitution)
{
MethodDesc typicalMethodDef = _typeDef.GetMethodWithEquivalentSignature(name, signature, substitution);
if (typicalMethodDef == null)
@@ -221,7 +230,7 @@ public override IEnumerable GetFields()
}
// TODO: Substitutions, generics, modopts, ...
- public override FieldDesc GetField(string name)
+ public override FieldDesc GetField(ReadOnlySpan name)
{
FieldDesc fieldDef = _typeDef.GetField(name);
if (fieldDef == null)
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/Instantiation.cs b/src/coreclr/tools/Common/TypeSystem/Common/Instantiation.cs
index d3b0fdd5686e99..7d798253f59192 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/Instantiation.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/Instantiation.cs
@@ -50,15 +50,6 @@ public bool IsNull
}
}
- ///
- /// Combines the given generic definition's hash code with the hashes
- /// of the generic parameters in this instantiation
- ///
- public int ComputeGenericInstanceHashCode(int genericDefinitionHashCode)
- {
- return Internal.NativeFormat.TypeHashingAlgorithms.ComputeGenericInstanceHashCode(genericDefinitionHashCode, _genericParameters);
- }
-
public static readonly Instantiation Empty = new Instantiation(TypeDesc.EmptyTypes);
public Enumerator GetEnumerator()
@@ -132,6 +123,6 @@ public override bool Equals(object o)
return Equals(inst);
return false;
}
- public override int GetHashCode() => ComputeGenericInstanceHashCode(1);
+ public override int GetHashCode() => VersionResilientHashCode.GenericInstanceHashCode(1, this);
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MetadataType.MethodImpls.cs b/src/coreclr/tools/Common/TypeSystem/Common/MetadataType.MethodImpls.cs
index 17871fee717515..466bb801f42c50 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MetadataType.MethodImpls.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MetadataType.MethodImpls.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
namespace Internal.TypeSystem
{
public struct MethodImplRecord
@@ -44,6 +46,6 @@ public MethodImplRecord[] VirtualMethodImplsForType
///
///
///
- public abstract MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string name);
+ public abstract MethodImplRecord[] FindMethodsImplWithMatchingDeclName(ReadOnlySpan name);
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MetadataType.cs b/src/coreclr/tools/Common/TypeSystem/Common/MetadataType.cs
index f1e2d388ebb9f3..2d690eec8c91c6 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MetadataType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MetadataType.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -12,9 +13,9 @@ namespace Internal.TypeSystem
///
public abstract partial class MetadataType : DefType
{
- public abstract override string Name { get; }
+ public abstract override ReadOnlySpan Name { get; }
- public abstract override string Namespace { get; }
+ public abstract override ReadOnlySpan Namespace { get; }
///
/// Gets metadata that controls instance layout of this type.
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MetadataTypeSystemContext.cs b/src/coreclr/tools/Common/TypeSystem/Common/MetadataTypeSystemContext.cs
index 2e04cfb85c8edf..bc6cff8b7a4f6c 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MetadataTypeSystemContext.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MetadataTypeSystemContext.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using Debug = System.Diagnostics.Debug;
@@ -71,7 +72,7 @@ public virtual void SetSystemModule(ModuleDesc systemModule)
{
// Require System.Object to be present as a minimal sanity check.
// The set of required well-known types is not strictly defined since different .NET profiles implement different subsets.
- MetadataType type = systemModule.GetType("System", s_wellKnownTypeNames[typeIndex], throwIfNotFound: typeIndex == (int)WellKnownType.Object);
+ MetadataType type = systemModule.GetType("System"u8, System.Text.Encoding.UTF8.GetBytes(s_wellKnownTypeNames[typeIndex]), throwIfNotFound: typeIndex == (int)WellKnownType.Object);
if (type != null)
{
type.SetWellKnownType((WellKnownType)(typeIndex + 1));
@@ -105,8 +106,8 @@ protected internal sealed override bool IsIDynamicInterfaceCastableInterface(Def
{
MetadataType t = (MetadataType)type;
return t.Module == SystemModule
- && t.Name == "IDynamicInterfaceCastable"
- && t.Namespace == "System.Runtime.InteropServices";
+ && t.Name.SequenceEqual("IDynamicInterfaceCastable"u8)
+ && t.Namespace.SequenceEqual("System.Runtime.InteropServices"u8);
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MetadataVirtualMethodAlgorithm.cs b/src/coreclr/tools/Common/TypeSystem/Common/MetadataVirtualMethodAlgorithm.cs
index f0eae5441d0c28..3f0773c6b22a54 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MetadataVirtualMethodAlgorithm.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MetadataVirtualMethodAlgorithm.cs
@@ -377,14 +377,14 @@ private static bool IsInterfaceExplicitlyImplementedOnType(MetadataType type, Me
///
private static MethodDesc FindMatchingVirtualMethodOnTypeByNameAndSig(MethodDesc targetMethod, DefType currentType, bool reverseMethodSearch, Func nameSigMatchMethodIsValidCandidate)
{
- string name = targetMethod.Name;
+ ReadOnlySpan name = targetMethod.Name;
MethodSignature sig = targetMethod.Signature;
MethodDesc implMethod = null;
MethodDesc implMethodEquivalent = null;
foreach (MethodDesc candidate in currentType.GetAllVirtualMethods())
{
- if (candidate.Name == name)
+ if (candidate.Name.SequenceEqual(name))
{
if (candidate.Signature.EquivalentTo(sig))
{
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MethodDelegator.cs b/src/coreclr/tools/Common/TypeSystem/Common/MethodDelegator.cs
index 74f218a6fec733..918bb5e62a88a8 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MethodDelegator.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MethodDelegator.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
namespace Internal.TypeSystem
{
///
@@ -26,7 +28,7 @@ public MethodDelegator(MethodDesc wrappedMethod)
public override bool IsDefaultConstructor => _wrappedMethod.IsDefaultConstructor;
public override bool IsStaticConstructor => _wrappedMethod.IsStaticConstructor;
- public override string Name => _wrappedMethod.Name;
+ public override ReadOnlySpan Name => _wrappedMethod.Name;
public override bool IsVirtual => _wrappedMethod.IsVirtual;
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.Dummy.Diagnostic.cs b/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.Dummy.Diagnostic.cs
index 8e7b7b84de4655..b33b07f62093a8 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.Dummy.Diagnostic.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.Dummy.Diagnostic.cs
@@ -6,6 +6,6 @@ namespace Internal.TypeSystem
// Dummy implementation of diagnostic names that just forwards to Name
public partial class MethodDesc
{
- public string DiagnosticName => Name;
+ public string DiagnosticName => GetName();
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs b/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs
index 93b12af20f141e..2075c60ea21713 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MethodDesc.cs
@@ -496,7 +496,7 @@ private int AcquireHashCode()
///
protected virtual int ComputeHashCode()
{
- return TypeHashingAlgorithms.ComputeMethodHashCode(OwningType.GetHashCode(), TypeHashingAlgorithms.ComputeNameHashCode(Name));
+ return OwningType.GetHashCode() ^ VersionResilientHashCode.NameHashCode(Name);
}
public override bool Equals(object o)
@@ -557,7 +557,7 @@ public bool IsConstructor
{
// TODO: Precise check
// TODO: Cache?
- return this.Name == ".ctor";
+ return this.Name.SequenceEqual(".ctor"u8);
}
}
@@ -587,14 +587,23 @@ public virtual bool IsStaticConstructor
///
/// Gets the name of the method as specified in the metadata.
///
- public virtual string Name
+ public virtual ReadOnlySpan Name
{
get
{
- return null;
+ return [];
}
}
+ public string GetName()
+ {
+ return System.Text.Encoding.UTF8.GetString(Name
+#if NETSTANDARD
+ .ToArray()
+#endif
+ );
+ }
+
///
/// Gets a value indicating whether the method is virtual.
///
@@ -710,7 +719,7 @@ public bool IsFinalizer
get
{
TypeDesc owningType = OwningType;
- return (owningType.IsObject && Name == "Finalize") || (owningType.HasFinalizer && owningType.GetFinalizer() == this);
+ return (owningType.IsObject && Name.SequenceEqual("Finalize"u8)) || (owningType.HasFinalizer && owningType.GetFinalizer() == this);
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/MethodForInstantiatedType.cs b/src/coreclr/tools/Common/TypeSystem/Common/MethodForInstantiatedType.cs
index db3df985b59d8b..4a1cf836e17466 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/MethodForInstantiatedType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/MethodForInstantiatedType.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
using Debug = System.Diagnostics.Debug;
namespace Internal.TypeSystem
@@ -143,7 +145,7 @@ public override bool IsStaticConstructor
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/ModuleDesc.cs b/src/coreclr/tools/Common/TypeSystem/Common/ModuleDesc.cs
index d76420e73f2be2..200c26c0bb034d 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/ModuleDesc.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/ModuleDesc.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
#if TYPE_LOADER_IMPLEMENTATION
@@ -33,7 +34,7 @@ public ModuleDesc(TypeSystemContext context, IAssemblyDesc assembly)
///
/// Gets a type in this module or null.
///
- public MetadataType GetType(string nameSpace, string name, bool throwIfNotFound = true)
+ public MetadataType GetType(ReadOnlySpan nameSpace, ReadOnlySpan name, bool throwIfNotFound = true)
{
return (MetadataType)GetType(nameSpace, name, throwIfNotFound ? NotFoundBehavior.Throw : NotFoundBehavior.ReturnNull);
}
@@ -41,7 +42,7 @@ public MetadataType GetType(string nameSpace, string name, bool throwIfNotFound
///
/// Gets a type in this module with the specified name, a resolution failure object, or null.
///
- public abstract object GetType(string nameSpace, string name, NotFoundBehavior notFoundBehavior);
+ public abstract object GetType(ReadOnlySpan nameSpace, ReadOnlySpan name, NotFoundBehavior notFoundBehavior);
///
/// Gets the global <Module> type.
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/PointerType.cs b/src/coreclr/tools/Common/TypeSystem/Common/PointerType.cs
index 28c3cf31ea00a6..ad71497c3a655b 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/PointerType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/PointerType.cs
@@ -15,7 +15,7 @@ internal PointerType(TypeDesc parameterType)
public override int GetHashCode()
{
- return Internal.NativeFormat.TypeHashingAlgorithms.ComputePointerTypeHashCode(this.ParameterType.GetHashCode());
+ return VersionResilientHashCode.PointerTypeHashCode(this.ParameterType.GetHashCode());
}
public override TypeDesc InstantiateSignature(Instantiation typeInstantiation, Instantiation methodInstantiation)
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/SimpleArrayOfTRuntimeInterfacesAlgorithm.cs b/src/coreclr/tools/Common/TypeSystem/Common/SimpleArrayOfTRuntimeInterfacesAlgorithm.cs
index 166f09fc7deb41..bf169d55d5c971 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/SimpleArrayOfTRuntimeInterfacesAlgorithm.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/SimpleArrayOfTRuntimeInterfacesAlgorithm.cs
@@ -26,14 +26,14 @@ public SimpleArrayOfTRuntimeInterfacesAlgorithm(ModuleDesc systemModule)
_systemModule = systemModule;
// initialize interfaces
- _arrayRuntimeInterfaces = _systemModule.GetType("System", "Array")?.RuntimeInterfaces
+ _arrayRuntimeInterfaces = _systemModule.GetType("System"u8, "Array"u8)?.RuntimeInterfaces
?? Array.Empty();
_genericRuntimeInterfaces = new MetadataType[s_genericRuntimeInterfacesNames.Length];
int count = 0;
for (int i = 0; i < s_genericRuntimeInterfacesNames.Length; ++i)
{
- MetadataType runtimeInterface =_systemModule.GetType("System.Collections.Generic", s_genericRuntimeInterfacesNames[i], throwIfNotFound: false);
+ MetadataType runtimeInterface =_systemModule.GetType("System.Collections.Generic"u8, System.Text.Encoding.UTF8.GetBytes(s_genericRuntimeInterfacesNames[i]), throwIfNotFound: false);
if (runtimeInterface != null)
_genericRuntimeInterfaces[count++] = runtimeInterface;
};
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/ThrowHelper.Common.cs b/src/coreclr/tools/Common/TypeSystem/Common/ThrowHelper.Common.cs
index 62a6382bb592ec..6c4b08b6b10608 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/ThrowHelper.Common.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/ThrowHelper.Common.cs
@@ -91,7 +91,7 @@ public static string Field(TypeDesc owningType, string fieldName)
public static string Method(MethodDesc method)
{
- return Method(method.OwningType, method.Name, method.Signature);
+ return Method(method.OwningType, method.GetName(), method.Signature);
}
public static string Method(TypeDesc owningType, string methodName, MethodSignature signature)
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/TypeDesc.cs b/src/coreclr/tools/Common/TypeSystem/Common/TypeDesc.cs
index c390e9eba5bb11..c77106cac6ecb5 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/TypeDesc.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/TypeDesc.cs
@@ -520,7 +520,7 @@ public virtual IEnumerable GetVirtualMethods()
/// If signature is not specified and there are multiple matches, the first one
/// is returned. Returns null if method not found.
///
- public MethodDesc GetMethod(string name, MethodSignature signature)
+ public MethodDesc GetMethod(ReadOnlySpan name, MethodSignature signature)
{
return GetMethod(name, signature, default(Instantiation));
}
@@ -532,11 +532,11 @@ public MethodDesc GetMethod(string name, MethodSignature signature)
/// is returned. If substitution is not null, then substitution will be applied to
/// possible target methods before signature comparison. Returns null if method not found.
///
- public virtual MethodDesc GetMethod(string name, MethodSignature signature, Instantiation substitution)
+ public virtual MethodDesc GetMethod(ReadOnlySpan name, MethodSignature signature, Instantiation substitution)
{
foreach (var method in GetMethods())
{
- if (method.Name == name)
+ if (method.Name.SequenceEqual(name))
{
if (signature == null || signature.Equals(method.Signature.ApplySubstitution(substitution)))
return method;
@@ -545,11 +545,11 @@ public virtual MethodDesc GetMethod(string name, MethodSignature signature, Inst
return null;
}
- public virtual MethodDesc GetMethodWithEquivalentSignature(string name, MethodSignature signature, Instantiation substitution)
+ public virtual MethodDesc GetMethodWithEquivalentSignature(ReadOnlySpan name, MethodSignature signature, Instantiation substitution)
{
foreach (var method in GetMethods())
{
- if (method.Name == name)
+ if (method.Name.SequenceEqual(name))
{
if (signature == null || signature.EquivalentTo(method.Signature.ApplySubstitution(substitution)))
return method;
@@ -589,11 +589,11 @@ public virtual IEnumerable GetFields()
///
// TODO: Substitutions, generics, modopts, ...
// TODO: field signature
- public virtual FieldDesc GetField(string name)
+ public virtual FieldDesc GetField(ReadOnlySpan name)
{
foreach (var field in GetFields())
{
- if (field.Name == name)
+ if (field.Name.SequenceEqual(name))
return field;
}
return null;
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/TypeHashingAlgorithms.cs b/src/coreclr/tools/Common/TypeSystem/Common/TypeHashingAlgorithms.cs
index 04d2857a2b0014..3a544439b2c408 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/TypeHashingAlgorithms.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/TypeHashingAlgorithms.cs
@@ -17,52 +17,6 @@ namespace Internal.NativeFormat
#endif
public static class TypeHashingAlgorithms
{
- public struct HashCodeBuilder
- {
- private int _hash1;
- private int _hash2;
- private int _numCharactersHashed;
-
- public HashCodeBuilder(string seed)
- {
- _hash1 = 0x6DA3B944;
- _hash2 = 0;
- _numCharactersHashed = 0;
-
- Append(seed);
- }
-
- public void Append(string src)
- {
- if (src.Length == 0)
- return;
-
- int startIndex = 0;
- if ((_numCharactersHashed & 1) == 1)
- {
- _hash2 = (_hash2 + _rotl(_hash2, 5)) ^ src[0];
- startIndex = 1;
- }
-
- for (int i = startIndex; i < src.Length; i += 2)
- {
- _hash1 = (_hash1 + _rotl(_hash1, 5)) ^ src[i];
- if ((i + 1) < src.Length)
- _hash2 = (_hash2 + _rotl(_hash2, 5)) ^ src[i + 1];
- }
-
- _numCharactersHashed += src.Length;
- }
-
- public int ToHashCode()
- {
- int hash1 = _hash1 + _rotl(_hash1, 8);
- int hash2 = _hash2 + _rotl(_hash2, 8);
-
- return hash1 ^ hash2;
- }
- }
-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int _rotl(int value, int shift)
{
@@ -117,99 +71,6 @@ public static unsafe int ComputeASCIINameHashCode(byte* data, int length, out bo
return hash1 ^ hash2;
}
- // This function may be needed in a portion of the codebase which is too low level to use
- // globalization, ergo, we cannot call ToString on the integer.
- private static string IntToString(int arg)
- {
- // This IntToString function is only expected to be used for MDArrayRanks, and therefore is only for positive numbers
- Debug.Assert(arg > 0);
- StringBuilder sb = new StringBuilder(1);
-
- while (arg != 0)
- {
- sb.Append((char)('0' + (arg % 10)));
- arg /= 10;
- }
-
- // Reverse the string
- int sbLen = sb.Length;
- int pivot = sbLen / 2;
- for (int i = 0; i < pivot; i++)
- {
- int iToSwapWith = sbLen - i - 1;
- char temp = sb[i];
- sb[i] = sb[iToSwapWith];
- sb[iToSwapWith] = temp;
- }
-
- return sb.ToString();
- }
-
- public static int ComputeArrayTypeHashCode(int elementTypeHashCode, int rank)
- {
- // Arrays are treated as generic types in some parts of our system. The array hashcodes are
- // carefully crafted to be the same as the hashcodes of their implementation generic types.
-
- int hashCode;
- if (rank == -1)
- {
- hashCode = unchecked((int)0xd5313557u);
- Debug.Assert(hashCode == ComputeNameHashCode("System.Array`1"));
- }
- else
- {
- hashCode = ComputeNameHashCode("System.MDArrayRank" + IntToString(rank) + "`1");
- }
-
- hashCode = (hashCode + _rotl(hashCode, 13)) ^ elementTypeHashCode;
- return (hashCode + _rotl(hashCode, 15));
- }
-
- public static int ComputeArrayTypeHashCode(T elementType, int rank)
- {
- return ComputeArrayTypeHashCode(elementType.GetHashCode(), rank);
- }
-
-
- public static int ComputePointerTypeHashCode(int pointeeTypeHashCode)
- {
- return (pointeeTypeHashCode + _rotl(pointeeTypeHashCode, 5)) ^ 0x12D0;
- }
-
- public static int ComputePointerTypeHashCode(T pointeeType)
- {
- return ComputePointerTypeHashCode(pointeeType.GetHashCode());
- }
-
-
- public static int ComputeByrefTypeHashCode(int parameterTypeHashCode)
- {
- return (parameterTypeHashCode + _rotl(parameterTypeHashCode, 7)) ^ 0x4C85;
- }
-
- public static int ComputeByrefTypeHashCode(T parameterType)
- {
- return ComputeByrefTypeHashCode(parameterType.GetHashCode());
- }
-
-
- public static int ComputeNestedTypeHashCode(int enclosingTypeHashCode, int nestedTypeNameHash)
- {
- return (enclosingTypeHashCode + _rotl(enclosingTypeHashCode, 11)) ^ nestedTypeNameHash;
- }
-
-
- public static int ComputeGenericInstanceHashCode(int genericDefinitionHashCode, ARG[] genericTypeArguments)
- {
- int hashcode = genericDefinitionHashCode;
- for (int i = 0; i < genericTypeArguments.Length; i++)
- {
- int argumentHashCode = genericTypeArguments[i].GetHashCode();
- hashcode = (hashcode + _rotl(hashcode, 13)) ^ argumentHashCode;
- }
- return (hashcode + _rotl(hashcode, 15));
- }
-
public static int ComputeMethodSignatureHashCode(int returnTypeHashCode, ARG[] parameters)
{
// We're not taking calling conventions into consideration here mostly because there's no
@@ -224,19 +85,6 @@ public static int ComputeMethodSignatureHashCode(int returnTypeHashCode, AR
return (hashcode + _rotl(hashcode, 15));
}
- ///
- /// Produce a hashcode for a specific method
- ///
- /// HashCode of the type that owns the method
- /// HashCode of either the name of the method (for non-generic methods) or the GenericInstanceHashCode of the name+generic arguments of the method.
- ///
- public static int ComputeMethodHashCode(int typeHashCode, int nameOrNameAndGenericArgumentsHashCode)
- {
- // TODO! This hash combining function isn't good, but it matches logic used in the past
- // consider changing to a better combining function once all uses use this function
- return typeHashCode ^ nameOrNameAndGenericArgumentsHashCode;
- }
-
///
/// Produce a hashcode for a generic signature variable
///
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.cs b/src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.cs
index d423574901cab8..2beffd0a47fca0 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/TypeSystemContext.cs
@@ -93,12 +93,12 @@ public sealed class ArrayTypeKeyHashtable : LockFreeReaderHashtable
public static string GetFullName(this DefType metadataType)
{
- string ns = metadataType.Namespace;
- return ns.Length > 0 ? string.Concat(ns, ".", metadataType.Name) : metadataType.Name;
+ string ns = metadataType.GetNamespace();
+ return ns.Length > 0 ? string.Concat(ns, ".", metadataType.GetName()) : metadataType.GetName();
}
///
@@ -439,5 +439,41 @@ public static bool RequiresAlign8(this TypeDesc type)
return false;
}
+
+ public static ReadOnlySpan Append(this ReadOnlySpan s1, ReadOnlySpan s2)
+ {
+ Span buffer = new T[s1.Length + s2.Length];
+
+ s1.CopyTo(buffer);
+ s2.CopyTo(buffer.Slice(s1.Length));
+
+ return buffer;
+ }
+
+ public static ReadOnlySpan Append(this ReadOnlySpan s1, ReadOnlySpan s2, ReadOnlySpan s3)
+ {
+ Span buffer = new T[s1.Length + s2.Length + s3.Length];
+
+ s1.CopyTo(buffer);
+ s2.CopyTo(buffer.Slice(s1.Length));
+ s3.CopyTo(buffer.Slice(s1.Length + s2.Length));
+
+ return buffer;
+ }
+
+ public static ReadOnlySpan Append(this ReadOnlySpan s1, ReadOnlySpan s2, ReadOnlySpan s3, uint i)
+ {
+ Span s4 = stackalloc byte[16];
+ System.Buffers.Text.Utf8Formatter.TryFormat(i, s4, out int s4length);
+
+ Span buffer = new byte[s1.Length + s2.Length + s3.Length + s4length];
+
+ s1.CopyTo(buffer);
+ s2.CopyTo(buffer.Slice(s1.Length));
+ s3.CopyTo(buffer.Slice(s1.Length + s2.Length));
+ s4.Slice(0, s4length).CopyTo(buffer.Slice(s1.Length + s2.Length + s3.Length));
+
+ return buffer;
+ }
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/TypeWithRepeatedFields.cs b/src/coreclr/tools/Common/TypeSystem/Common/TypeWithRepeatedFields.cs
index 7f5be414774bad..6db81bceeb7257 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/TypeWithRepeatedFields.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/TypeWithRepeatedFields.cs
@@ -85,15 +85,15 @@ public override IEnumerable GetFields()
public override bool HasCustomAttribute(string attributeNamespace, string attributeName) => MetadataType.HasCustomAttribute(attributeNamespace, attributeName);
public override IEnumerable GetNestedTypes() => (IEnumerable)EmptyTypes;
public override MetadataType GetNestedType(string name) => null;
- public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string name) => MetadataType.FindMethodsImplWithMatchingDeclName(name);
+ public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(ReadOnlySpan name) => MetadataType.FindMethodsImplWithMatchingDeclName(name);
public override int GetHashCode() => MetadataType.GetHashCode();
protected override MethodImplRecord[] ComputeVirtualMethodImplsForType() => Array.Empty();
protected override TypeFlags ComputeTypeFlags(TypeFlags mask) => MetadataType.GetTypeFlags(mask);
- public override string Namespace => MetadataType.Namespace;
+ public override ReadOnlySpan Namespace => MetadataType.Namespace;
- public override string Name => MetadataType.Name;
+ public override ReadOnlySpan Name => MetadataType.Name;
public override DefType[] ExplicitlyImplementedInterfaces => Array.Empty();
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameFormatter.cs b/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameFormatter.cs
index 67ee949b835402..423709c4c10678 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameFormatter.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameFormatter.cs
@@ -129,13 +129,13 @@ protected override IAssemblyDesc AppendNameForInstantiatedType(StringBuilder sb,
protected override IAssemblyDesc AppendNameForNamespaceType(StringBuilder sb, DefType type, bool assemblyQualify)
{
- string ns = type.Namespace;
+ string ns = type.GetNamespace();
if (ns.Length > 0)
{
AppendEscapedIdentifier(sb, ns);
sb.Append('.');
}
- AppendEscapedIdentifier(sb, type.Name);
+ AppendEscapedIdentifier(sb, type.GetName());
if (type is MetadataType mdType)
{
@@ -156,7 +156,7 @@ protected override IAssemblyDesc AppendNameForNestedType(StringBuilder sb, DefTy
sb.Append('+');
- AppendEscapedIdentifier(sb, nestedType.Name);
+ AppendEscapedIdentifier(sb, nestedType.GetName());
if (assemblyQualify)
AppendAssemblyName(sb, homeAssembly);
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs b/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs
index 8f2eda81f66068..f43f41eeb86bd1 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/Utilities/CustomAttributeTypeNameParser.cs
@@ -190,7 +190,9 @@ private TypeDesc GetSimpleTypeFromModule(TypeName typeName, ModuleDesc module)
return canonType;
}
- return module.GetType(TypeName.Unescape(typeName.Namespace), TypeName.Unescape(typeName.Name), throwIfNotFound: false);
+ return module.GetType(
+ System.Text.Encoding.UTF8.GetBytes(TypeName.Unescape(typeName.Namespace)),
+ System.Text.Encoding.UTF8.GetBytes(TypeName.Unescape(typeName.Name)), throwIfNotFound: false);
}
private TypeDesc GetGenericType(TypeName typeName)
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/Utilities/ExceptionTypeNameFormatter.Metadata.cs b/src/coreclr/tools/Common/TypeSystem/Common/Utilities/ExceptionTypeNameFormatter.Metadata.cs
index 79a6da8f59a456..893bc6a1e96cec 100644
--- a/src/coreclr/tools/Common/TypeSystem/Common/Utilities/ExceptionTypeNameFormatter.Metadata.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Common/Utilities/ExceptionTypeNameFormatter.Metadata.cs
@@ -8,12 +8,12 @@ public partial class ExceptionTypeNameFormatter
{
private static string GetTypeName(DefType type)
{
- return type.Name;
+ return type.GetName();
}
private static string GetTypeNamespace(DefType type)
{
- return type.Namespace;
+ return type.GetNamespace();
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Common/VersionResilientHashCode.TypeSystem.cs b/src/coreclr/tools/Common/TypeSystem/Common/VersionResilientHashCode.TypeSystem.cs
new file mode 100644
index 00000000000000..259e3ee9b765d5
--- /dev/null
+++ b/src/coreclr/tools/Common/TypeSystem/Common/VersionResilientHashCode.TypeSystem.cs
@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Diagnostics;
+using System.Numerics;
+using System.Text;
+using Internal.TypeSystem;
+
+namespace Internal
+{
+ internal static partial class VersionResilientHashCode
+ {
+ ///
+ /// CoreCLR ComputeGenericInstanceHashCode
+ ///
+ /// Base hash code
+ /// Instantiation to include in the hash
+ public static int GenericInstanceHashCode(int hashcode, Instantiation instantiation)
+ {
+ for (int i = 0; i < instantiation.Length; i++)
+ {
+ int argumentHashCode = instantiation[i].GetHashCode();
+ hashcode = unchecked(hashcode + RotateLeft(hashcode, 13)) ^ argumentHashCode;
+ }
+ return unchecked(hashcode + RotateLeft(hashcode, 15));
+ }
+
+ public static int GenericInstanceHashCode(int hashcode, T[] instantiation)
+ {
+ for (int i = 0; i < instantiation.Length; i++)
+ {
+ int argumentHashCode = instantiation[i].GetHashCode();
+ hashcode = unchecked(hashcode + RotateLeft(hashcode, 13)) ^ argumentHashCode;
+ }
+ return unchecked(hashcode + RotateLeft(hashcode, 15));
+ }
+ }
+}
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/CustomAttributeTypeProvider.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/CustomAttributeTypeProvider.cs
index 0b1390765a7dcc..45a7a6944484be 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/CustomAttributeTypeProvider.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/CustomAttributeTypeProvider.cs
@@ -24,7 +24,7 @@ public TypeDesc GetPrimitiveType(PrimitiveTypeCode typeCode)
public TypeDesc GetSystemType()
{
- MetadataType systemType = _module.Context.SystemModule.GetType("System", "Type");
+ MetadataType systemType = _module.Context.SystemModule.GetType("System"u8, "Type"u8);
return systemType;
}
@@ -88,9 +88,9 @@ public bool IsSystemType(TypeDesc type)
{
var metadataType = type as MetadataType;
return metadataType != null
- && metadataType.Name == "Type"
+ && metadataType.Name.SequenceEqual("Type"u8)
&& metadataType.Module == _module.Context.SystemModule
- && metadataType.Namespace == "System";
+ && metadataType.Namespace.SequenceEqual("System"u8);
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs
index c59d2b5fee5556..c85861b5916818 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaAssembly.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
@@ -61,6 +62,14 @@ public AssemblyNameInfo GetName()
return _assemblyName;
}
+ public ReadOnlySpan Name
+ {
+ get
+ {
+ return MetadataReader.GetStringBytes(_assemblyDefinition.Name);
+ }
+ }
+
public override string ToString()
{
return GetName().Name;
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaField.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaField.cs
index 8812678f72ae17..79a35f033d2011 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaField.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaField.cs
@@ -5,7 +5,9 @@
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
using System.Runtime.CompilerServices;
+using System.Threading;
namespace Internal.TypeSystem.Ecma
{
@@ -31,19 +33,15 @@ private static class FieldFlags
private FieldDefinitionHandle _handle;
// Cached values
+ private unsafe volatile byte* _namePointer;
+ private int _nameLength;
private ThreadSafeFlags _fieldFlags;
private TypeDesc _fieldType;
- private string _name;
internal EcmaField(EcmaType type, FieldDefinitionHandle handle)
{
_type = type;
_handle = handle;
-
-#if DEBUG
- // Initialize name eagerly in debug builds for convenience
- InitializeName();
-#endif
}
EntityHandle EcmaModule.IEntityHandleObject.Handle
@@ -261,20 +259,24 @@ public FieldAttributes Attributes
}
}
- private string InitializeName()
+ public unsafe ReadOnlySpan InitializeName()
{
- var metadataReader = MetadataReader;
- var name = metadataReader.GetString(metadataReader.GetFieldDefinition(_handle).Name);
- return (_name = name);
+ StringHandle handle = MetadataReader.GetFieldDefinition(_handle).Name;
+ _nameLength = MetadataReader.GetStringBytes(handle).Length;
+ _namePointer = MetadataReader.MetadataPointer + MetadataReader.GetHeapMetadataOffset(HeapIndex.String) + MetadataReader.GetHeapOffset(handle);
+ return new ReadOnlySpan(_namePointer, _nameLength);
}
- public override string Name
+ public override unsafe ReadOnlySpan Name
{
get
{
- if (_name == null)
- return InitializeName();
- return _name;
+ byte* namePointer = _namePointer;
+ if (namePointer != null)
+ {
+ return new ReadOnlySpan(namePointer, _nameLength);
+ }
+ return InitializeName();
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaGenericParameter.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaGenericParameter.cs
index 8ffa09bc12eb78..bd8473913443ec 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaGenericParameter.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaGenericParameter.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using System.Reflection.Metadata;
using System.Threading;
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaMethod.Diagnostic.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaMethod.Diagnostic.cs
index fbcb9b97db5b29..13021913c2a893 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaMethod.Diagnostic.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaMethod.Diagnostic.cs
@@ -13,7 +13,7 @@ public override string DiagnosticName
{
try
{
- return Name;
+ return GetName();
}
catch
{
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaMethod.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaMethod.cs
index 9a7edd11559165..0decf370cfe759 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaMethod.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaMethod.cs
@@ -1,10 +1,12 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Diagnostics;
-using System.Runtime.CompilerServices;
using System.Reflection;
using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
+using System.Runtime.CompilerServices;
using System.Threading;
namespace Internal.TypeSystem.Ecma
@@ -36,20 +38,16 @@ private static class MethodFlags
private MethodDefinitionHandle _handle;
// Cached values
+ private unsafe volatile byte* _namePointer;
+ private int _nameLength;
private ThreadSafeFlags _methodFlags;
private MethodSignature _signature;
- private string _name;
private TypeDesc[] _genericParameters; // TODO: Optional field?
internal EcmaMethod(EcmaType type, MethodDefinitionHandle handle)
{
_type = type;
_handle = handle;
-
-#if DEBUG
- // Initialize name eagerly in debug builds for convenience
- InitializeName();
-#endif
}
EntityHandle EcmaModule.IEntityHandleObject.Handle
@@ -348,7 +346,7 @@ public override bool IsDefaultConstructor
return attributes.IsRuntimeSpecialName()
&& attributes.IsPublic()
&& Signature.Length == 0
- && Name == ".ctor"
+ && Name.SequenceEqual(".ctor"u8)
&& !_type.IsAbstract;
}
}
@@ -365,7 +363,7 @@ public override bool IsStaticConstructor
{
get
{
- return Attributes.IsRuntimeSpecialName() && Name == ".cctor";
+ return Attributes.IsRuntimeSpecialName() && Name.SequenceEqual(".cctor"u8);
}
}
@@ -385,20 +383,24 @@ public MethodImplAttributes ImplAttributes
}
}
- private string InitializeName()
+ public unsafe ReadOnlySpan InitializeName()
{
- var metadataReader = MetadataReader;
- var name = metadataReader.GetString(metadataReader.GetMethodDefinition(_handle).Name);
- return (_name = name);
+ StringHandle handle = MetadataReader.GetMethodDefinition(_handle).Name;
+ _nameLength = MetadataReader.GetStringBytes(handle).Length;
+ _namePointer = MetadataReader.MetadataPointer + MetadataReader.GetHeapMetadataOffset(HeapIndex.String) + MetadataReader.GetHeapOffset(handle);
+ return new ReadOnlySpan(_namePointer, _nameLength);
}
- public override string Name
+ public override unsafe ReadOnlySpan Name
{
get
{
- if (_name == null)
- return InitializeName();
- return _name;
+ byte* namePointer = _namePointer;
+ if (namePointer != null)
+ {
+ return new ReadOnlySpan(namePointer, _nameLength);
+ }
+ return InitializeName();
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs
index cd87728b53e852..e8b1d352542ffc 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaModule.cs
@@ -7,6 +7,7 @@
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
+using System.Text;
using Debug = System.Diagnostics.Debug;
@@ -284,51 +285,124 @@ public bool IsPlatformNeutral
}
}
- private Dictionary<(string Name, string Namespace), EntityHandle> _nameLookupCache;
+ private TypeDefinitionHandle[] _typeDefinitionBuckets;
+ private volatile TypeDefinitionHandle[] _typeDefinitionBucketHeads;
- private Dictionary<(string Name, string Namespace), EntityHandle> CreateNameLookupCache()
+ private TypeDefinitionHandle[] InitializeTypeDefinitionBucketHeads()
{
- // TODO: it's not particularly efficient to materialize strings just to hash them and hold
- // onto them forever. We could instead hash the UTF-8 bytes and hold the TypeDefinitionHandle
- // so we can obtain the bytes again when needed.
- // E.g. see the scheme explored in the first commit of https://github.com/dotnet/runtime/pull/84285.
+ TypeDefinitionHandle[] buckets = new TypeDefinitionHandle[_metadataReader.TypeDefinitions.Count + 1];
+ TypeDefinitionHandle[] bucketHeads = new TypeDefinitionHandle[(buckets.Length / 8) + 1];
- var result = new Dictionary<(string Name, string Namespace), EntityHandle>();
-
- MetadataReader metadataReader = _metadataReader;
- foreach (TypeDefinitionHandle typeDefHandle in metadataReader.TypeDefinitions)
+ MetadataReader reader = _metadataReader;
+ foreach (TypeDefinitionHandle typeHandle in reader.TypeDefinitions)
{
- TypeDefinition typeDefinition = metadataReader.GetTypeDefinition(typeDefHandle);
- if (typeDefinition.Attributes.IsNested())
+ TypeDefinition typeDef = reader.GetTypeDefinition(typeHandle);
+ if (typeDef.Attributes.IsNested())
continue;
- result.Add((metadataReader.GetString(typeDefinition.Name), metadataReader.GetString(typeDefinition.Namespace)), typeDefHandle);
+ int hashCode = VersionResilientHashCode.NameHashCode(reader.GetStringBytes(typeDef.Namespace), reader.GetStringBytes(typeDef.Name));
+
+ ref TypeDefinitionHandle head = ref bucketHeads[(uint)hashCode % bucketHeads.Length];
+ ref TypeDefinitionHandle entry = ref buckets[MetadataTokens.GetRowNumber(typeHandle)];
+
+ entry = head;
+ head = typeHandle;
+ }
+
+ _typeDefinitionBuckets = buckets;
+ _typeDefinitionBucketHeads = bucketHeads;
+
+ return bucketHeads;
+ }
+
+ private TypeDefinitionHandle FindDefinedType(int hashCode, ReadOnlySpan nameSpace, ReadOnlySpan name)
+ {
+ MetadataReader reader = _metadataReader;
+
+ TypeDefinitionHandle[] bucketHeads = _typeDefinitionBucketHeads ?? InitializeTypeDefinitionBucketHeads();
+ TypeDefinitionHandle entry = bucketHeads[(uint)hashCode % bucketHeads.Length];
+ while (!entry.IsNil)
+ {
+ var typeDefinition = reader.GetTypeDefinition(entry);
+ if (reader.StringEquals(typeDefinition.Name, name) &&
+ reader.StringEquals(typeDefinition.Namespace, nameSpace))
+ {
+ return entry;
+ }
+
+ entry = _typeDefinitionBuckets[MetadataTokens.GetRowNumber(entry)];
}
- foreach (ExportedTypeHandle exportedTypeHandle in metadataReader.ExportedTypes)
+ return default;
+ }
+
+ private ExportedTypeHandle[] _exportedTypeBuckets;
+ private volatile ExportedTypeHandle[] _exportedTypeBucketHeads;
+
+ private ExportedTypeHandle[] InitializeExportedTypeBucketHeads()
+ {
+ ExportedTypeHandle[] buckets = new ExportedTypeHandle[_metadataReader.ExportedTypes.Count + 1];
+ ExportedTypeHandle[] bucketHeads = new ExportedTypeHandle[(buckets.Length / 8) + 1];
+
+ MetadataReader reader = _metadataReader;
+ foreach (ExportedTypeHandle typeHandle in reader.ExportedTypes)
{
- ExportedType exportedType = metadataReader.GetExportedType(exportedTypeHandle);
- if (exportedType.Implementation.Kind == HandleKind.ExportedType)
+ ExportedType exportDef = reader.GetExportedType(typeHandle);
+ if (exportDef.Implementation.Kind == HandleKind.ExportedType)
continue;
- result.Add((metadataReader.GetString(exportedType.Name), metadataReader.GetString(exportedType.Namespace)), exportedTypeHandle);
+ int hashCode = VersionResilientHashCode.NameHashCode(reader.GetStringBytes(exportDef.Namespace), reader.GetStringBytes(exportDef.Name));
+
+ ref ExportedTypeHandle head = ref bucketHeads[(uint)hashCode % bucketHeads.Length];
+ ref ExportedTypeHandle entry = ref buckets[MetadataTokens.GetRowNumber(typeHandle)];
+
+ entry = head;
+ head = typeHandle;
+ }
+
+ _exportedTypeBuckets = buckets;
+ _exportedTypeBucketHeads = bucketHeads;
+
+ return bucketHeads;
+ }
+
+ private ExportedTypeHandle FindExportedType(int hashCode, ReadOnlySpan nameSpace, ReadOnlySpan name)
+ {
+ MetadataReader reader = _metadataReader;
+
+ ExportedTypeHandle[] bucketHeads = _exportedTypeBucketHeads ?? InitializeExportedTypeBucketHeads();
+ ExportedTypeHandle entry = bucketHeads[(uint)hashCode % bucketHeads.Length];
+ while (!entry.IsNil)
+ {
+ var exportedType = reader.GetExportedType(entry);
+ if (reader.StringEquals(exportedType.Name, name) &&
+ reader.StringEquals(exportedType.Namespace, nameSpace))
+ {
+ return entry;
+ }
+
+ entry = _exportedTypeBuckets[MetadataTokens.GetRowNumber(entry)];
}
- return _nameLookupCache = result;
+ return default;
}
- public sealed override object GetType(string nameSpace, string name, NotFoundBehavior notFoundBehavior)
+ public sealed override object GetType(ReadOnlySpan nameSpace, ReadOnlySpan name, NotFoundBehavior notFoundBehavior)
{
+ int hashCode = VersionResilientHashCode.NameHashCode(nameSpace, name);
+
var currentModule = this;
// src/coreclr/vm/clsload.cpp use the same restriction to detect a loop in the type forwarding.
for (int typeForwardingChainSize = 0; typeForwardingChainSize <= 1024; typeForwardingChainSize++)
{
- if ((currentModule._nameLookupCache ?? currentModule.CreateNameLookupCache()).TryGetValue((name, nameSpace), out EntityHandle foundHandle))
- {
- if (foundHandle.Kind == HandleKind.TypeDefinition)
- return currentModule.GetType((TypeDefinitionHandle)foundHandle);
+ TypeDefinitionHandle typeDefHandle = currentModule.FindDefinedType(hashCode, nameSpace, name);
+ if (!typeDefHandle.IsNil)
+ return currentModule.GetType(typeDefHandle);
- ExportedType exportedType = currentModule._metadataReader.GetExportedType((ExportedTypeHandle)foundHandle);
+ ExportedTypeHandle exportedTypeHandle = currentModule.FindExportedType(hashCode, nameSpace, name);
+ if (!exportedTypeHandle.IsNil)
+ {
+ ExportedType exportedType = currentModule._metadataReader.GetExportedType(exportedTypeHandle);
if (exportedType.IsForwarder)
{
object implementation = currentModule.GetObject(exportedType.Implementation, notFoundBehavior);
@@ -366,7 +440,7 @@ public sealed override object GetType(string nameSpace, string name, NotFoundBeh
if (notFoundBehavior != NotFoundBehavior.ReturnNull)
{
- var failure = ResolutionFailure.GetTypeLoadResolutionFailure(nameSpace, name, this);
+ var failure = ResolutionFailure.GetTypeLoadResolutionFailure(Encoding.UTF8.GetString(nameSpace.ToArray()), Encoding.UTF8.GetString(name.ToArray()), this);
if (notFoundBehavior == NotFoundBehavior.Throw)
failure.Throw();
@@ -506,7 +580,7 @@ private object ResolveMemberReference(MemberReferenceHandle handle)
EcmaSignatureParser parser = new EcmaSignatureParser(this, signatureReader, NotFoundBehavior.ReturnResolutionFailure);
- string name = _metadataReader.GetString(memberReference.Name);
+ ReadOnlySpan name = _metadataReader.GetStringBytes(memberReference.Name);
if (parser.IsFieldSignature)
{
@@ -514,7 +588,7 @@ private object ResolveMemberReference(MemberReferenceHandle handle)
if (field != null)
return field;
- return ResolutionFailure.GetMissingFieldFailure(parentTypeDesc, name);
+ return ResolutionFailure.GetMissingFieldFailure(parentTypeDesc, System.Text.Encoding.UTF8.GetString(name.ToArray()));
}
else
{
@@ -566,7 +640,7 @@ private object ResolveMemberReference(MemberReferenceHandle handle)
typeDescToInspect = baseType;
} while (typeDescToInspect != null);
- return ResolutionFailure.GetMissingMethodFailure(parentTypeDesc, name, sig);
+ return ResolutionFailure.GetMissingMethodFailure(parentTypeDesc, System.Text.Encoding.UTF8.GetString(name.ToArray()), sig);
}
}
else if (parent is MethodDesc)
@@ -594,7 +668,7 @@ private object ResolveTypeReference(TypeReferenceHandle handle)
if (resolutionScope is ModuleDesc)
{
- return ((ModuleDesc)(resolutionScope)).GetType(_metadataReader.GetString(typeReference.Namespace), _metadataReader.GetString(typeReference.Name), NotFoundBehavior.ReturnResolutionFailure);
+ return ((ModuleDesc)(resolutionScope)).GetType(_metadataReader.GetStringBytes(typeReference.Namespace), _metadataReader.GetStringBytes(typeReference.Name), NotFoundBehavior.ReturnResolutionFailure);
}
else
if (resolutionScope is MetadataType)
@@ -640,8 +714,8 @@ private object ResolveExportedType(ExportedTypeHandle handle)
var implementation = GetObject(exportedType.Implementation, NotFoundBehavior.ReturnResolutionFailure);
if (implementation is ModuleDesc module)
{
- string nameSpace = _metadataReader.GetString(exportedType.Namespace);
- string name = _metadataReader.GetString(exportedType.Name);
+ ReadOnlySpan nameSpace = _metadataReader.GetStringBytes(exportedType.Namespace);
+ ReadOnlySpan name = _metadataReader.GetStringBytes(exportedType.Name);
return module.GetType(nameSpace, name, NotFoundBehavior.ReturnResolutionFailure);
}
else
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.Diagnostic.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.Diagnostic.cs
index d991a3f9b283d4..fa765d81a0ac2c 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.Diagnostic.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.Diagnostic.cs
@@ -17,7 +17,7 @@ public override string DiagnosticName
{
try
{
- return Name;
+ return GetName();
}
catch
{
@@ -31,7 +31,7 @@ public override string DiagnosticNamespace
{
try
{
- return Namespace;
+ return GetNamespace();
}
catch
{
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.MethodImpls.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.MethodImpls.cs
index e7e7ccb14b9c7f..9d29e54464846d 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.MethodImpls.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.MethodImpls.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using System.Reflection.Metadata;
using Debug = System.Diagnostics.Debug;
@@ -12,10 +13,9 @@ namespace Internal.TypeSystem.Ecma
public sealed partial class EcmaType : MetadataType
{
// Virtual function related functionality
- public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string declName)
+ public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(ReadOnlySpan declName)
{
MetadataReader metadataReader = _module.MetadataReader;
- var stringComparer = metadataReader.StringComparer;
ArrayBuilder foundRecords = default(ArrayBuilder);
foreach (var methodImplHandle in _typeDefinition.GetMethodImplementations())
@@ -33,30 +33,14 @@ public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string de
methodDeclHandleKind = methodDeclCheckHandle.Kind;
}
- bool foundRecord = false;
-
- switch (methodDeclHandleKind)
+ StringHandle foundDeclNameHandle = methodDeclHandleKind switch
{
- case HandleKind.MethodDefinition:
- if (stringComparer.Equals(metadataReader.GetMethodDefinition((MethodDefinitionHandle)methodDeclCheckHandle).Name, declName))
- {
- foundRecord = true;
- }
- break;
-
- case HandleKind.MemberReference:
- if (stringComparer.Equals(metadataReader.GetMemberReference((MemberReferenceHandle)methodDeclCheckHandle).Name, declName))
- {
- foundRecord = true;
- }
- break;
-
- default:
- Debug.Fail("unexpected methodDeclHandleKind");
- break;
- }
+ HandleKind.MethodDefinition => metadataReader.GetMethodDefinition((MethodDefinitionHandle)methodDeclCheckHandle).Name,
+ HandleKind.MemberReference => metadataReader.GetMemberReference((MemberReferenceHandle)methodDeclCheckHandle).Name,
+ _ => default
+ };
- if (foundRecord)
+ if (metadataReader.StringEquals(foundDeclNameHandle, declName))
{
MethodImplRecord newRecord = new MethodImplRecord(
(MethodDesc)_module.GetObject(methodImpl.MethodDeclaration),
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.TypeEquivalence.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.TypeEquivalence.cs
index b7fb3327a2655d..9a222bd8180456 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.TypeEquivalence.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.TypeEquivalence.cs
@@ -41,10 +41,10 @@ private TypeIdentifierData ComputeTypeIdentifierFromGuids()
return null;
string scope = (string)guidAttribute.Value.FixedArguments[0].Value;
- string name = this.Name;
+ string name = this.GetName();
- if (this.Namespace != null)
- name = this.Namespace + "." + name;
+ if (this.Namespace.Length > 0)
+ name = this.GetNamespace() + "." + name;
return new TypeIdentifierData(scope, name);
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.cs
index c7f188fe4a39c9..87a39108774b30 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/EcmaType.cs
@@ -25,8 +25,10 @@ public sealed partial class EcmaType : MetadataType, EcmaModule.IEntityHandleObj
private TypeDefinition _typeDefinition;
// Cached values
- private string _typeName;
- private string _typeNamespace;
+ private unsafe volatile byte* _namePointer;
+ private int _nameLength;
+ private unsafe volatile byte* _namespacePointer;
+ private int _namespaceLength;
private TypeDesc[] _genericParameters;
private MetadataType _baseType;
private int _hashcode;
@@ -39,12 +41,6 @@ internal EcmaType(EcmaModule module, TypeDefinitionHandle handle)
_typeDefinition = module.MetadataReader.GetTypeDefinition(handle);
_baseType = this; // Not yet initialized flag
-
-#if DEBUG
- // Initialize name eagerly in debug builds for convenience
- InitializeName();
- InitializeNamespace();
-#endif
}
public override int GetHashCode()
@@ -56,23 +52,15 @@ public override int GetHashCode()
private int InitializeHashCode()
{
+ int hashCode = VersionResilientHashCode.NameHashCode(Namespace, Name);
+
DefType containingType = ContainingType;
- if (containingType == null)
+ if (containingType != null)
{
- string ns = Namespace;
- var hashCodeBuilder = new TypeHashingAlgorithms.HashCodeBuilder(ns);
- if (ns.Length > 0)
- hashCodeBuilder.Append(".");
- hashCodeBuilder.Append(Name);
- _hashcode = hashCodeBuilder.ToHashCode();
- }
- else
- {
- _hashcode = TypeHashingAlgorithms.ComputeNestedTypeHashCode(
- containingType.GetHashCode(), TypeHashingAlgorithms.ComputeNameHashCode(Name));
+ hashCode = VersionResilientHashCode.NestedTypeHashCode(containingType.GetHashCode(), hashCode);
}
- return _hashcode;
+ return _hashcode = hashCode;
}
EntityHandle EcmaModule.IEntityHandleObject.Handle
@@ -166,7 +154,7 @@ private MetadataType InitializeBaseType()
if (type == null)
{
// PREFER: "new TypeSystemException.TypeLoadException(ExceptionStringID.ClassLoadBadFormat, this)" but the metadata is too broken
- ThrowHelper.ThrowTypeLoadException(Namespace, Name, Module);
+ ThrowHelper.ThrowTypeLoadException(GetNamespace(), GetName(), Module);
}
_baseType = type;
return type;
@@ -276,37 +264,45 @@ protected override TypeFlags ComputeTypeFlags(TypeFlags mask)
return flags;
}
- private string InitializeName()
+ private unsafe ReadOnlySpan InitializeName()
{
- var metadataReader = this.MetadataReader;
- _typeName = metadataReader.GetString(_typeDefinition.Name);
- return _typeName;
+ StringHandle handle = _typeDefinition.Name;
+ _nameLength = MetadataReader.GetStringBytes(handle).Length;
+ _namePointer = MetadataReader.MetadataPointer + MetadataReader.GetHeapMetadataOffset(HeapIndex.String) + MetadataReader.GetHeapOffset(handle);
+ return new ReadOnlySpan(_namePointer, _nameLength);
}
- public override string Name
+ public override unsafe ReadOnlySpan Name
{
get
{
- if (_typeName == null)
- return InitializeName();
- return _typeName;
+ byte* namePointer = _namePointer;
+ if (namePointer != null)
+ {
+ return new ReadOnlySpan(namePointer, _nameLength);
+ }
+ return InitializeName();
}
}
- private string InitializeNamespace()
+ private unsafe ReadOnlySpan InitializeNamespace()
{
- var metadataReader = this.MetadataReader;
- _typeNamespace = metadataReader.GetString(_typeDefinition.Namespace);
- return _typeNamespace;
+ StringHandle handle = _typeDefinition.Namespace;
+ _namespaceLength = MetadataReader.GetStringBytes(handle).Length;
+ _namespacePointer = MetadataReader.MetadataPointer + MetadataReader.GetHeapMetadataOffset(HeapIndex.String) + MetadataReader.GetHeapOffset(handle);
+ return new ReadOnlySpan(_namespacePointer, _namespaceLength);
}
- public override string Namespace
+ public override unsafe ReadOnlySpan Namespace
{
get
{
- if (_typeNamespace == null)
- return InitializeNamespace();
- return _typeNamespace;
+ byte* namespacePointer = _namespacePointer;
+ if (namespacePointer != null)
+ {
+ return new ReadOnlySpan(namespacePointer, _namespaceLength);
+ }
+ return InitializeNamespace();
}
}
@@ -329,14 +325,13 @@ public override IEnumerable GetVirtualMethods()
}
}
- public override MethodDesc GetMethod(string name, MethodSignature signature, Instantiation substitution)
+ public override MethodDesc GetMethod(ReadOnlySpan name, MethodSignature signature, Instantiation substitution)
{
var metadataReader = this.MetadataReader;
- var stringComparer = metadataReader.StringComparer;
foreach (var handle in _typeDefinition.GetMethods())
{
- if (stringComparer.Equals(metadataReader.GetMethodDefinition(handle).Name, name))
+ if (metadataReader.StringEquals(metadataReader.GetMethodDefinition(handle).Name, name))
{
var method = _module.GetMethod(handle, this);
if (signature == null || signature.Equals(method.Signature.ApplySubstitution(substitution)))
@@ -347,14 +342,13 @@ public override MethodDesc GetMethod(string name, MethodSignature signature, Ins
return null;
}
- public override MethodDesc GetMethodWithEquivalentSignature(string name, MethodSignature signature, Instantiation substitution)
+ public override MethodDesc GetMethodWithEquivalentSignature(ReadOnlySpan name, MethodSignature signature, Instantiation substitution)
{
var metadataReader = this.MetadataReader;
- var stringComparer = metadataReader.StringComparer;
foreach (var handle in _typeDefinition.GetMethods())
{
- if (stringComparer.Equals(metadataReader.GetMethodDefinition(handle).Name, name))
+ if (metadataReader.StringEquals(metadataReader.GetMethodDefinition(handle).Name, name))
{
var method = _module.GetMethod(handle, this);
if (signature == null || signature.EquivalentTo(method.Signature.ApplySubstitution(substitution)))
@@ -424,7 +418,7 @@ public override MethodDesc GetFinalizer()
return null;
TypeDesc objectType = Context.GetWellKnownType(WellKnownType.Object);
- MethodDesc decl = objectType.GetMethod("Finalize", null);
+ MethodDesc decl = objectType.GetMethod("Finalize"u8, null);
if (decl != null)
{
@@ -474,14 +468,13 @@ public override TypeDesc UnderlyingType
}
}
- public override FieldDesc GetField(string name)
+ public override FieldDesc GetField(ReadOnlySpan name)
{
var metadataReader = this.MetadataReader;
- var stringComparer = metadataReader.StringComparer;
foreach (var handle in _typeDefinition.GetFields())
{
- if (stringComparer.Equals(metadataReader.GetFieldDefinition(handle).Name, name))
+ if (metadataReader.StringEquals(metadataReader.GetFieldDefinition(handle).Name, name))
{
var field = _module.GetField(handle, this);
return field;
diff --git a/src/coreclr/tools/Common/TypeSystem/Ecma/MetadataExtensions.cs b/src/coreclr/tools/Common/TypeSystem/Ecma/MetadataExtensions.cs
index 54e58b3b696990..1a0dc816c7b34b 100644
--- a/src/coreclr/tools/Common/TypeSystem/Ecma/MetadataExtensions.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Ecma/MetadataExtensions.cs
@@ -1,9 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
+using System.Reflection.Metadata.Ecma335;
using System.Runtime.InteropServices;
namespace Internal.TypeSystem.Ecma
@@ -310,5 +312,34 @@ public static bool IsPublic(this MethodAttributes flags)
{
return reader.GetBlobReader(reader.GetMethodDefinition(handle).Name).CurrentPointer;
}
+
+ public static unsafe ReadOnlySpan GetStringBytes(this MetadataReader reader, StringHandle handle)
+ {
+ BlobReader blobReader = reader.GetBlobReader(handle);
+ return new ReadOnlySpan(blobReader.CurrentPointer, blobReader.Length);
+ }
+
+ public static unsafe bool StringEquals(this MetadataReader reader, StringHandle handle, ReadOnlySpan otherString)
+ {
+ int stringOffset = reader.GetHeapOffset(handle);
+
+ // Could the heap hold a string this big?
+ if (stringOffset + otherString.Length >= reader.GetHeapSize(HeapIndex.String))
+ return false;
+
+ // Check for null terminator at the expected location
+ byte* currentChar = reader.MetadataPointer + reader.GetHeapMetadataOffset(HeapIndex.String) + stringOffset;
+ if (*(currentChar + otherString.Length) != 0)
+ return false;
+
+ // Compare characters
+ for (int i = 0; i < otherString.Length; i++)
+ {
+ if (otherString[i] != *(currentChar++))
+ return false;
+ }
+
+ return true;
+ }
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/DelegateInfo.cs b/src/coreclr/tools/Common/TypeSystem/IL/DelegateInfo.cs
index 2c06b0f688e494..46f09d338c25d7 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/DelegateInfo.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/DelegateInfo.cs
@@ -79,7 +79,7 @@ public MethodDesc InvokeMethod
{
get
{
- _invokeMethod ??= _delegateType.GetKnownMethod("Invoke", null);
+ _invokeMethod ??= _delegateType.GetKnownMethod("Invoke"u8, null);
return _invokeMethod;
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/HelperExtensions.cs b/src/coreclr/tools/Common/TypeSystem/IL/HelperExtensions.cs
index a02c9bbf9da982..52aee2f56a5449 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/HelperExtensions.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/HelperExtensions.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Text;
using Internal.TypeSystem;
using Internal.IL.Stubs;
@@ -12,34 +13,34 @@ namespace Internal.IL
{
internal static class HelperExtensions
{
- private const string HelperTypesNamespace = "Internal.Runtime.CompilerHelpers";
+ private static ReadOnlySpan HelperTypesNamespace => "Internal.Runtime.CompilerHelpers"u8;
- public static MetadataType GetHelperType(this TypeSystemContext context, string name)
+ public static MetadataType GetHelperType(this TypeSystemContext context, ReadOnlySpan name)
{
MetadataType helperType = context.SystemModule.GetKnownType(HelperTypesNamespace, name);
return helperType;
}
- public static MetadataType GetOptionalHelperType(this TypeSystemContext context, string name)
+ public static MetadataType GetOptionalHelperType(this TypeSystemContext context, ReadOnlySpan name)
{
MetadataType helperType = context.SystemModule.GetType(HelperTypesNamespace, name, throwIfNotFound: false);
return helperType;
}
- public static MethodDesc GetHelperEntryPoint(this TypeSystemContext context, string typeName, string methodName)
+ public static MethodDesc GetHelperEntryPoint(this TypeSystemContext context, ReadOnlySpan typeName, ReadOnlySpan methodName)
{
MetadataType helperType = context.GetHelperType(typeName);
MethodDesc helperMethod = helperType.GetKnownMethod(methodName, null);
return helperMethod;
}
- public static MethodDesc GetCoreLibEntryPoint(this TypeSystemContext context, string namespaceName, string typeName, string methodName, MethodSignature signature)
+ public static MethodDesc GetCoreLibEntryPoint(this TypeSystemContext context, ReadOnlySpan namespaceName, ReadOnlySpan typeName, ReadOnlySpan methodName, MethodSignature signature)
{
MetadataType owningType = context.SystemModule.GetKnownType(namespaceName, typeName);
return owningType.GetKnownMethod(methodName, signature);
}
- public static MethodDesc GetOptionalHelperEntryPoint(this TypeSystemContext context, string typeName, string methodName)
+ public static MethodDesc GetOptionalHelperEntryPoint(this TypeSystemContext context, ReadOnlySpan typeName, ReadOnlySpan methodName)
{
MetadataType helperType = context.GetOptionalHelperType(typeName);
MethodDesc helperMethod = helperType?.GetMethod(methodName, null);
@@ -70,12 +71,12 @@ public static void EmitCallThrowHelper(this ILCodeStream codeStream, ILEmitter e
/// Retrieves a method on that is well known to the compiler.
/// Throws an exception if the method doesn't exist.
///
- public static MethodDesc GetKnownMethod(this TypeDesc type, string name, MethodSignature signature)
+ public static MethodDesc GetKnownMethod(this TypeDesc type, ReadOnlySpan name, MethodSignature signature)
{
MethodDesc method = type.GetMethod(name, signature);
if (method == null)
{
- throw new InvalidOperationException(string.Format("Expected method '{0}' not found on type '{1}'", name, type));
+ throw new InvalidOperationException(string.Format("Expected method '{0}' not found on type '{1}'", System.Text.Encoding.UTF8.GetString(name), type));
}
return method;
@@ -85,12 +86,12 @@ public static MethodDesc GetKnownMethod(this TypeDesc type, string name, MethodS
/// Retrieves a field on that is well known to the compiler.
/// Throws an exception if the field doesn't exist.
///
- public static FieldDesc GetKnownField(this TypeDesc type, string name)
+ public static FieldDesc GetKnownField(this TypeDesc type, ReadOnlySpan name)
{
FieldDesc field = type.GetField(name);
if (field == null)
{
- throw new InvalidOperationException(string.Format("Expected field '{0}' not found on type '{1}'", name, type));
+ throw new InvalidOperationException(string.Format("Expected field '{0}' not found on type '{1}'", System.Text.Encoding.UTF8.GetString(name), type));
}
return field;
@@ -115,14 +116,14 @@ public static MetadataType GetKnownNestedType(this MetadataType type, string nam
/// Retrieves a namespace type in that is well known to the compiler.
/// Throws an exception if the type doesn't exist.
///
- public static MetadataType GetKnownType(this ModuleDesc module, string @namespace, string name)
+ public static MetadataType GetKnownType(this ModuleDesc module, ReadOnlySpan @namespace, ReadOnlySpan name)
{
MetadataType type = module.GetType(@namespace, name, throwIfNotFound: false);
if (type == null)
{
throw new InvalidOperationException(
string.Format("Expected type '{0}' not found in module '{1}'",
- @namespace.Length > 0 ? string.Concat(@namespace, ".", name) : name,
+ @namespace.Length > 0 ? string.Concat(Encoding.UTF8.GetString(@namespace), ".", Encoding.UTF8.GetString(name)) : Encoding.UTF8.GetString(name),
module));
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/ILDisassembler.cs b/src/coreclr/tools/Common/TypeSystem/IL/ILDisassembler.cs
index cb71913d0232c3..99660b22c510c3 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/ILDisassembler.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/ILDisassembler.cs
@@ -87,7 +87,7 @@ private void AppendMethodSignature(StringBuilder sb, MethodDesc method)
sb.Append(' ');
AppendOwningType(sb, method.OwningType);
sb.Append("::");
- sb.Append(method.Name);
+ sb.Append(method.GetName());
if (method.HasInstantiation)
{
@@ -141,7 +141,7 @@ private void AppendFieldSignature(StringBuilder sb, FieldDesc field)
sb.Append(' ');
AppendOwningType(sb, field.OwningType);
sb.Append("::");
- sb.Append(field.Name);
+ sb.Append(field.GetName());
}
private static void AppendStringLiteral(StringBuilder sb, string s)
@@ -614,20 +614,20 @@ public void AppendNameForNamespaceTypeWithoutAliases(StringBuilder sb, DefType t
sb.Append(']');
}
- string ns = type.Namespace;
+ string ns = type.GetNamespace();
if (ns.Length > 0)
{
sb.Append(ns);
sb.Append('.');
}
- sb.Append(type.Name);
+ sb.Append(type.GetName());
}
protected override void AppendNameForNestedType(StringBuilder sb, DefType nestedType, DefType containingType)
{
AppendName(sb, containingType);
sb.Append('/');
- sb.Append(nestedType.Name);
+ sb.Append(nestedType.GetName());
}
}
#endregion
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/MethodILDebugView.cs b/src/coreclr/tools/Common/TypeSystem/IL/MethodILDebugView.cs
index 28b9818c3af1ef..79179d7a3c1460 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/MethodILDebugView.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/MethodILDebugView.cs
@@ -34,7 +34,7 @@ public string Disassembly
sb.Append("instance ");
disasm.AppendType(sb, owningMethod.Signature.ReturnType);
sb.Append(' ');
- sb.Append(owningMethod.Name);
+ sb.Append(owningMethod.GetName());
if (owningMethod.HasInstantiation)
{
sb.Append('<');
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/NativeAotILProvider.cs b/src/coreclr/tools/Common/TypeSystem/IL/NativeAotILProvider.cs
index b692bf826636fb..373b2abd826af7 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/NativeAotILProvider.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/NativeAotILProvider.cs
@@ -44,29 +44,29 @@ private static MethodIL TryGetIntrinsicMethodIL(MethodDesc method)
if (owningType == null)
return null;
- switch (owningType.Name)
+ switch (owningType.GetName())
{
case "Unsafe":
{
- if (owningType.Namespace == "System.Runtime.CompilerServices")
+ if (owningType.Namespace.SequenceEqual("System.Runtime.CompilerServices"u8))
return UnsafeIntrinsics.EmitIL(method);
}
break;
case "Debug":
{
- if (owningType.Namespace == "System.Diagnostics" && method.Name == "DebugBreak")
+ if (owningType.Namespace.SequenceEqual("System.Diagnostics"u8) && method.Name.SequenceEqual("DebugBreak"u8))
return new ILStubMethodIL(method, new byte[] { (byte)ILOpcode.break_, (byte)ILOpcode.ret }, Array.Empty(), null);
}
break;
case "RuntimeAugments":
{
- if (owningType.Namespace == "Internal.Runtime.Augments" && method.Name == "GetCanonType")
+ if (owningType.Namespace.SequenceEqual("Internal.Runtime.Augments"u8) && method.Name.SequenceEqual("GetCanonType"u8))
return GetCanonTypeIntrinsic.EmitIL(method);
}
break;
case "MethodTable":
{
- if (owningType.Namespace == "Internal.Runtime" && method.Name == "get_SupportsRelativePointers")
+ if (owningType.Namespace.SequenceEqual("Internal.Runtime"u8) && method.Name.SequenceEqual("get_SupportsRelativePointers"u8))
{
ILOpcode value = method.Context.Target.SupportsRelativePointers ?
ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0;
@@ -76,7 +76,7 @@ private static MethodIL TryGetIntrinsicMethodIL(MethodDesc method)
break;
case "Stream":
{
- if (owningType.Namespace == "System.IO")
+ if (owningType.Namespace.SequenceEqual("System.IO"u8))
return StreamIntrinsics.EmitIL(method);
}
break;
@@ -98,13 +98,13 @@ private static MethodIL TryGetPerInstantiationIntrinsicMethodIL(MethodDesc metho
if (owningType == null)
return null;
- string methodName = method.Name;
+ string methodName = method.GetName();
- switch (owningType.Name)
+ switch (owningType.GetName())
{
case "Interlocked":
{
- if (owningType.Namespace == "System.Threading")
+ if (owningType.Namespace.SequenceEqual("System.Threading"u8))
return InterlockedIntrinsics.EmitIL(method);
}
break;
@@ -132,25 +132,25 @@ private static MethodIL TryGetPerInstantiationIntrinsicMethodIL(MethodDesc metho
break;
case "RuntimeHelpers":
{
- if (owningType.Namespace == "System.Runtime.CompilerServices")
+ if (owningType.Namespace.SequenceEqual("System.Runtime.CompilerServices"u8))
return RuntimeHelpersIntrinsics.EmitIL(method);
}
break;
case "Comparer`1":
{
- if (methodName == "Create" && owningType.Namespace == "System.Collections.Generic")
+ if (methodName == "Create" && owningType.Namespace.SequenceEqual("System.Collections.Generic"u8))
return ComparerIntrinsics.EmitComparerCreate(method);
}
break;
case "EqualityComparer`1":
{
- if (methodName == "Create" && owningType.Namespace == "System.Collections.Generic")
+ if (methodName == "Create" && owningType.Namespace.SequenceEqual("System.Collections.Generic"u8))
return ComparerIntrinsics.EmitEqualityComparerCreate(method);
}
break;
case "ComparerHelpers":
{
- if (owningType.Namespace != "Internal.IntrinsicSupport")
+ if (!owningType.Namespace.SequenceEqual("Internal.IntrinsicSupport"u8))
return null;
if (methodName == "EnumOnlyCompare")
@@ -163,7 +163,7 @@ private static MethodIL TryGetPerInstantiationIntrinsicMethodIL(MethodDesc metho
TypeDesc underlyingType = elementType.UnderlyingType;
TypeDesc returnType = method.Context.GetWellKnownType(WellKnownType.Int32);
- MethodDesc underlyingCompareToMethod = underlyingType.GetKnownMethod("CompareTo",
+ MethodDesc underlyingCompareToMethod = underlyingType.GetKnownMethod("CompareTo"u8,
new MethodSignature(
MethodSignatureFlags.None,
genericParameterCount: 0,
@@ -184,7 +184,7 @@ private static MethodIL TryGetPerInstantiationIntrinsicMethodIL(MethodDesc metho
break;
case "EqualityComparerHelpers":
{
- if (owningType.Namespace != "Internal.IntrinsicSupport")
+ if (!owningType.Namespace.SequenceEqual("Internal.IntrinsicSupport"u8))
return null;
if (methodName == "EnumOnlyEquals")
@@ -261,17 +261,17 @@ private static MethodIL TryGetPerInstantiationIntrinsicMethodIL(MethodDesc metho
static MethodDesc GetMethodToCall(TypeDesc elementType)
{
TypeSystemContext context = elementType.Context;
- MetadataType helperType = context.SystemModule.GetKnownType("Internal.IntrinsicSupport", "EqualityComparerHelpers");
+ MetadataType helperType = context.SystemModule.GetKnownType("Internal.IntrinsicSupport"u8, "EqualityComparerHelpers"u8);
if (elementType.IsEnum)
- return helperType.GetKnownMethod("EnumOnlyEquals", null)
+ return helperType.GetKnownMethod("EnumOnlyEquals"u8, null)
.MakeInstantiatedMethod(elementType);
if (elementType.IsNullable)
{
bool? nullableOfEquatable = ComparerIntrinsics.ImplementsIEquatable(elementType.Instantiation[0]);
if (nullableOfEquatable.HasValue && nullableOfEquatable.Value)
- return helperType.GetKnownMethod("StructOnlyEqualsNullable", null)
+ return helperType.GetKnownMethod("StructOnlyEqualsNullable"u8, null)
.MakeInstantiatedMethod(elementType.Instantiation[0]);
return null; // Fallback to default implementation based on EqualityComparer
}
@@ -279,7 +279,7 @@ static MethodDesc GetMethodToCall(TypeDesc elementType)
bool? equatable = ComparerIntrinsics.ImplementsIEquatable(elementType);
if (!equatable.HasValue)
return null;
- return helperType.GetKnownMethod(equatable.Value ? "StructOnlyEqualsIEquatable" : "StructOnlyNormalEquals", null)
+ return helperType.GetKnownMethod(equatable.Value ? "StructOnlyEqualsIEquatable"u8 : "StructOnlyNormalEquals"u8, null)
.MakeInstantiatedMethod(elementType);
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ArrayMethodILEmitter.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ArrayMethodILEmitter.cs
index 69aec3abb713b6..b3f272f1e7e292 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ArrayMethodILEmitter.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ArrayMethodILEmitter.cs
@@ -31,7 +31,7 @@ private ArrayMethodILEmitter(ArrayMethod method)
// This helper field is needed to generate proper GC tracking. There is no direct way
// to create interior pointer.
- _helperFieldToken = _emitter.NewToken(_method.Context.GetWellKnownType(WellKnownType.Object).GetKnownField("m_pEEType"));
+ _helperFieldToken = _emitter.NewToken(_method.Context.GetWellKnownType(WellKnownType.Object).GetKnownField("m_pEEType"u8));
}
private void EmitLoadInteriorAddress(ILCodeStream codeStream, int offset)
@@ -94,7 +94,7 @@ private void EmitILForAccessor()
if (_method.Kind == ArrayMethodKind.Set)
{
MethodDesc checkArrayStore =
- context.SystemModule.GetKnownType("System.Runtime", "RuntimeImports").GetKnownMethod("RhCheckArrayStore", null);
+ context.SystemModule.GetKnownType("System.Runtime"u8, "RuntimeImports"u8).GetKnownMethod("RhCheckArrayStore"u8, null);
codeStream.EmitLdArg(0);
codeStream.EmitLdArg(_rank + argStartOffset);
@@ -104,7 +104,7 @@ private void EmitILForAccessor()
else if (_method.Kind == ArrayMethodKind.AddressWithHiddenArg)
{
TypeDesc objectType = context.GetWellKnownType(WellKnownType.Object);
- TypeDesc eetypeType = context.SystemModule.GetKnownType("Internal.Runtime", "MethodTable");
+ TypeDesc eetypeType = context.SystemModule.GetKnownType("Internal.Runtime"u8, "MethodTable"u8);
typeMismatchExceptionLabel = _emitter.NewCodeLabel();
@@ -119,14 +119,14 @@ private void EmitILForAccessor()
// MethodTable* actualElementType = this.m_pEEType->RelatedParameterType; // ArrayElementType
codeStream.EmitLdArg(0);
- codeStream.Emit(ILOpcode.ldfld, _emitter.NewToken(objectType.GetKnownField("m_pEEType")));
+ codeStream.Emit(ILOpcode.ldfld, _emitter.NewToken(objectType.GetKnownField("m_pEEType"u8)));
codeStream.Emit(ILOpcode.call,
- _emitter.NewToken(eetypeType.GetKnownMethod("get_RelatedParameterType", null)));
+ _emitter.NewToken(eetypeType.GetKnownMethod("get_RelatedParameterType"u8, null)));
// MethodTable* expectedElementType = hiddenArg->RelatedParameterType; // ArrayElementType
codeStream.EmitLdArg(hiddenArg);
codeStream.Emit(ILOpcode.call,
- _emitter.NewToken(eetypeType.GetKnownMethod("get_RelatedParameterType", null)));
+ _emitter.NewToken(eetypeType.GetKnownMethod("get_RelatedParameterType"u8, null)));
// if (expectedElementType != actualElementType)
// ThrowHelpers.ThrowArrayTypeMismatchException();
@@ -143,12 +143,12 @@ private void EmitILForAccessor()
if (_rank == 1)
{
TypeDesc objectType = context.GetWellKnownType(WellKnownType.Object);
- TypeDesc eetypeType = context.SystemModule.GetKnownType("Internal.Runtime", "MethodTable");
+ TypeDesc eetypeType = context.SystemModule.GetKnownType("Internal.Runtime"u8, "MethodTable"u8);
codeStream.EmitLdArg(0);
- codeStream.Emit(ILOpcode.ldfld, _emitter.NewToken(objectType.GetKnownField("m_pEEType")));
+ codeStream.Emit(ILOpcode.ldfld, _emitter.NewToken(objectType.GetKnownField("m_pEEType"u8)));
codeStream.Emit(ILOpcode.call,
- _emitter.NewToken(eetypeType.GetKnownMethod("get_IsSzArray", null)));
+ _emitter.NewToken(eetypeType.GetKnownMethod("get_IsSzArray"u8, null)));
ILCodeLabel notSzArrayLabel = _emitter.NewCodeLabel();
codeStream.Emit(ILOpcode.brfalse, notSzArrayLabel);
@@ -238,13 +238,13 @@ private void EmitILForAccessor()
codeStream.EmitLabel(rangeExceptionLabel); // Assumes that there is one "int" pushed on the stack
codeStream.Emit(ILOpcode.pop);
- MethodDesc throwHelper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowIndexOutOfRangeException");
+ MethodDesc throwHelper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowIndexOutOfRangeException"u8);
codeStream.EmitCallThrowHelper(_emitter, throwHelper);
if (typeMismatchExceptionLabel != null)
{
codeStream.EmitLabel(typeMismatchExceptionLabel);
- codeStream.EmitCallThrowHelper(_emitter, context.GetHelperEntryPoint("ThrowHelpers", "ThrowArrayTypeMismatchException"));
+ codeStream.EmitCallThrowHelper(_emitter, context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowArrayTypeMismatchException"u8));
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/AssemblyGetExecutingAssemblyMethodThunk.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/AssemblyGetExecutingAssemblyMethodThunk.cs
index 78386fbe55cb4f..e9542585b9ef90 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/AssemblyGetExecutingAssemblyMethodThunk.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/AssemblyGetExecutingAssemblyMethodThunk.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
namespace Internal.IL.Stubs
@@ -20,7 +21,7 @@ public AssemblyGetExecutingAssemblyMethodThunk(TypeDesc owningType, IAssemblyDes
TypeSystemContext context = owningType.Context;
Signature = new MethodSignature(MethodSignatureFlags.Static, 0,
- context.SystemModule.GetKnownType("System.Reflection", "Assembly"), TypeDesc.EmptyTypes);
+ context.SystemModule.GetKnownType("System.Reflection"u8, "Assembly"u8), TypeDesc.EmptyTypes);
}
public override TypeSystemContext Context
@@ -36,11 +37,11 @@ public IAssemblyDesc ExecutingAssembly
get;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return $"GetExecutingAssembly_{ExecutingAssembly.GetName().Name}";
+ return "GetExecutingAssembly_"u8.Append(ExecutingAssembly.Name);
}
}
@@ -67,7 +68,7 @@ public override MethodIL EmitIL()
ILEmitter emit = new ILEmitter();
ILCodeStream codeStream = emit.NewCodeStream();
- MethodDesc classlibHelper = Context.GetHelperEntryPoint("ReflectionHelpers", "GetExecutingAssembly");
+ MethodDesc classlibHelper = Context.GetHelperEntryPoint("ReflectionHelpers"u8, "GetExecutingAssembly"u8);
// Use the global module type as "a type from the assembly that has metadata"
// Our reflection policy always makes sure this has metadata.
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/CalliMarshallingMethodThunk.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/CalliMarshallingMethodThunk.cs
index 23721ea8e1c4c5..25cfcb4a96b02d 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/CalliMarshallingMethodThunk.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/CalliMarshallingMethodThunk.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
namespace Internal.IL.Stubs
@@ -69,11 +70,11 @@ public override MethodSignature Signature
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "CalliMarshallingMethodThunk";
+ return "CalliMarshallingMethodThunk"u8;
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ComparerIntrinsics.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ComparerIntrinsics.cs
index 3d2bedf4123e3a..eaa1d056a28e84 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ComparerIntrinsics.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ComparerIntrinsics.cs
@@ -90,19 +90,19 @@ private static TypeDesc GetComparerForType(TypeDesc type, string flavor, string
if (type.IsNullable)
{
- return context.SystemModule.GetKnownType("System.Collections.Generic", $"Nullable{flavor}`1")
+ return context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Nullable{flavor}`1")
.MakeInstantiatedType(type.Instantiation[0]);
}
if (type.IsString && flavor == "EqualityComparer")
{
- return context.SystemModule.GetKnownType("System.Collections.Generic", "StringEqualityComparer");
+ return context.SystemModule.GetKnownType("System.Collections.Generic"u8, "StringEqualityComparer"u8);
}
if (type.IsEnum)
{
// Enums have a specialized comparer that avoids boxing
- return context.SystemModule.GetKnownType("System.Collections.Generic", $"Enum{flavor}`1")
+ return context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Enum{flavor}`1")
.MakeInstantiatedType(type);
}
@@ -112,7 +112,7 @@ private static TypeDesc GetComparerForType(TypeDesc type, string flavor, string
return null;
}
- return context.SystemModule.GetKnownType("System.Collections.Generic", implementsInterfaceOfSelf.Value ? $"Generic{flavor}`1" : $"Object{flavor}`1")
+ return context.SystemModule.GetKnownType("System.Collections.Generic"u8, implementsInterfaceOfSelf.Value ? $"Generic{flavor}`1" : $"Object{flavor}`1")
.MakeInstantiatedType(type);
}
@@ -150,16 +150,16 @@ private static TypeDesc[] GetPotentialComparersForTypeCommon(TypeDesc type, stri
ArrayBuilder universalComparers = default(ArrayBuilder);
- universalComparers.Add(context.SystemModule.GetKnownType("System.Collections.Generic", $"Nullable{flavor}`1")
+ universalComparers.Add(context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Nullable{flavor}`1")
.MakeInstantiatedType(type));
- universalComparers.Add(context.SystemModule.GetKnownType("System.Collections.Generic", $"Enum{flavor}`1")
+ universalComparers.Add(context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Enum{flavor}`1")
.MakeInstantiatedType(type));
- universalComparers.Add(context.SystemModule.GetKnownType("System.Collections.Generic", $"Generic{flavor}`1")
+ universalComparers.Add(context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Generic{flavor}`1")
.MakeInstantiatedType(type));
- universalComparers.Add(context.SystemModule.GetKnownType("System.Collections.Generic", $"Object{flavor}`1")
+ universalComparers.Add(context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Object{flavor}`1")
.MakeInstantiatedType(type));
return universalComparers.ToArray();
@@ -179,18 +179,18 @@ private static TypeDesc[] GetPotentialComparersForTypeCommon(TypeDesc type, stri
return new TypeDesc[]
{
- context.SystemModule.GetKnownType("System.Collections.Generic", $"Nullable{flavor}`1")
+ context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Nullable{flavor}`1")
.MakeInstantiatedType(nullableType),
- context.SystemModule.GetKnownType("System.Collections.Generic", $"Object{flavor}`1")
+ context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Object{flavor}`1")
.MakeInstantiatedType(type),
};
}
return new TypeDesc[]
{
- context.SystemModule.GetKnownType("System.Collections.Generic", $"Generic{flavor}`1")
+ context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Generic{flavor}`1")
.MakeInstantiatedType(type),
- context.SystemModule.GetKnownType("System.Collections.Generic", $"Object{flavor}`1")
+ context.SystemModule.GetKnownType("System.Collections.Generic"u8, $"Object{flavor}`1")
.MakeInstantiatedType(type),
};
}
@@ -207,7 +207,7 @@ private static TypeDesc[] GetPotentialComparersForTypeCommon(TypeDesc type, stri
Instantiation interfaceInstantiation = implementedInterface.Instantiation;
if (interfaceInstantiation.Length == 1)
{
- interfaceType ??= interfaceType = type.Context.SystemModule.GetKnownType("System", interfaceName);
+ interfaceType ??= interfaceType = type.Context.SystemModule.GetKnownType("System"u8, interfaceName);
if (implementedInterface.GetTypeDefinition() == interfaceType)
{
@@ -361,6 +361,11 @@ public bool HasGapsBeforeOffset(int offset)
return false;
}
}
+ }
+ file static class Extensions
+ {
+ public static MetadataType GetKnownType(this ModuleDesc module, ReadOnlySpan @namespace, string name)
+ => module.GetKnownType(@namespace, System.Text.Encoding.UTF8.GetBytes(name));
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMarshallingMethodThunk.Mangling.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMarshallingMethodThunk.Mangling.cs
index 27dbb90c06c859..98efc7c0cc707d 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMarshallingMethodThunk.Mangling.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMarshallingMethodThunk.Mangling.cs
@@ -19,7 +19,7 @@ string IPrefixMangledType.Prefix
{
get
{
- return NamePrefix;
+ return System.Text.Encoding.UTF8.GetString(NamePrefix);
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMarshallingMethodThunk.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMarshallingMethodThunk.cs
index 368f19a79a74c2..834eb90e0eeae9 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMarshallingMethodThunk.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMarshallingMethodThunk.cs
@@ -64,7 +64,7 @@ public DelegateMarshallingMethodThunk(MetadataType delegateType, TypeDesc owning
{
_owningType = owningType;
_delegateType = delegateType;
- _invokeMethod = delegateType.GetMethod("Invoke", null);
+ _invokeMethod = delegateType.GetMethod("Invoke"u8, null);
_interopStateManager = interopStateManager;
Kind = kind;
}
@@ -218,30 +218,30 @@ public MethodSignature DelegateSignature
}
}
- private string NamePrefix
+ private ReadOnlySpan NamePrefix
{
get
{
switch (Kind)
{
case DelegateMarshallingMethodThunkKind.ReverseOpenStatic:
- return "ReverseOpenStaticDelegateStub";
+ return "ReverseOpenStaticDelegateStub"u8;
case DelegateMarshallingMethodThunkKind.ReverseClosed:
- return "ReverseDelegateStub";
+ return "ReverseDelegateStub"u8;
case DelegateMarshallingMethodThunkKind.ForwardNativeFunctionWrapper:
- return "ForwardNativeFunctionWrapper";
+ return "ForwardNativeFunctionWrapper"u8;
default:
Debug.Fail("Unexpected DelegateMarshallingMethodThunkKind.");
- return string.Empty;
+ return [];
}
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return NamePrefix + "__" + DelegateType.Name;
+ return NamePrefix.Append("__"u8, DelegateType.Name);
}
}
@@ -249,7 +249,7 @@ public override string DiagnosticName
{
get
{
- return NamePrefix + "__" + DelegateType.DiagnosticName;
+ return GetName();
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMethodILEmitter.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMethodILEmitter.cs
index 72b192214f4a63..4d926705fa0eea 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMethodILEmitter.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateMethodILEmitter.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -15,17 +17,17 @@ public static MethodIL EmitIL(MethodDesc method)
Debug.Assert(method.OwningType.IsTypeDefinition);
Debug.Assert(method.IsRuntimeImplemented);
- if (method.Name == "BeginInvoke" || method.Name == "EndInvoke")
+ if (method.Name.SequenceEqual("BeginInvoke"u8) || method.Name.SequenceEqual("EndInvoke"u8))
{
// BeginInvoke and EndInvoke are not supported on .NET Core
ILEmitter emit = new ILEmitter();
ILCodeStream codeStream = emit.NewCodeStream();
- MethodDesc notSupportedExceptionHelper = method.Context.GetHelperEntryPoint("ThrowHelpers", "ThrowPlatformNotSupportedException");
+ MethodDesc notSupportedExceptionHelper = method.Context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowPlatformNotSupportedException"u8);
codeStream.EmitCallThrowHelper(emit, notSupportedExceptionHelper);
return emit.Link(method);
}
- if (method.Name == ".ctor")
+ if (method.Name.SequenceEqual(".ctor"u8))
{
// We only support delegate creation if the IL follows the delegate creation verifiability requirements
// described in ECMA-335 III.4.21 (newobj - create a new object). The codegen is expected to
@@ -35,19 +37,19 @@ public static MethodIL EmitIL(MethodDesc method)
// but it remains to be proven that this is an actual customer scenario.
ILEmitter emit = new ILEmitter();
ILCodeStream codeStream = emit.NewCodeStream();
- MethodDesc notSupportedExceptionHelper = method.Context.GetHelperEntryPoint("ThrowHelpers", "ThrowPlatformNotSupportedException");
+ MethodDesc notSupportedExceptionHelper = method.Context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowPlatformNotSupportedException"u8);
codeStream.EmitCallThrowHelper(emit, notSupportedExceptionHelper);
return emit.Link(method);
}
- if (method.Name == "Invoke")
+ if (method.Name.SequenceEqual("Invoke"u8))
{
TypeSystemContext context = method.Context;
ILEmitter emit = new ILEmitter();
TypeDesc delegateType = context.GetWellKnownType(WellKnownType.MulticastDelegate).BaseType;
- FieldDesc firstParameterField = delegateType.GetKnownField("_firstParameter");
- FieldDesc functionPointerField = delegateType.GetKnownField("_functionPointer");
+ FieldDesc firstParameterField = delegateType.GetKnownField("_firstParameter"u8);
+ FieldDesc functionPointerField = delegateType.GetKnownField("_functionPointer"u8);
ILCodeStream codeStream = emit.NewCodeStream();
// Store the function pointer into local variable to avoid unnecessary register usage by JIT
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateThunks.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateThunks.cs
index 3ec8a9e22540b6..3b76ab4445c19a 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateThunks.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DelegateThunks.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -68,7 +69,7 @@ protected FieldDesc ExtraFunctionPointerOrDataField
{
get
{
- return SystemDelegateType.GetKnownField("_extraFunctionPointerOrData");
+ return SystemDelegateType.GetKnownField("_extraFunctionPointerOrData"u8);
}
}
@@ -76,7 +77,7 @@ protected FieldDesc HelperObjectField
{
get
{
- return SystemDelegateType.GetKnownField("_helperObject");
+ return SystemDelegateType.GetKnownField("_helperObject"u8);
}
}
@@ -84,7 +85,7 @@ public sealed override string DiagnosticName
{
get
{
- return Name;
+ return GetName();
}
}
}
@@ -127,11 +128,11 @@ public override MethodIL EmitIL()
return emitter.Link(this);
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "InvokeOpenStaticThunk";
+ return "InvokeOpenStaticThunk"u8;
}
}
}
@@ -157,7 +158,7 @@ public override MethodIL EmitIL(MethodDesc specializedMethod)
{
var emit = new ILEmitter();
ILCodeStream codeStream = emit.NewCodeStream();
- codeStream.EmitCallThrowHelper(emit, Context.GetHelperEntryPoint("ThrowHelpers", "ThrowNotSupportedException"));
+ codeStream.EmitCallThrowHelper(emit, Context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowNotSupportedException"u8));
return emit.Link(specializedMethod);
}
@@ -211,7 +212,7 @@ public override MethodIL EmitIL()
}
}
- codeStream.Emit(ILOpcode.call, emitter.NewToken(SystemDelegateType.GetKnownMethod("GetActualTargetFunctionPointer", null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(SystemDelegateType.GetKnownMethod("GetActualTargetFunctionPointer"u8, null)));
MethodSignature targetSignature = new MethodSignature(0, 0, Signature.ReturnType, parameters);
codeStream.Emit(ILOpcode.calli, emitter.NewToken(targetSignature));
@@ -220,11 +221,11 @@ public override MethodIL EmitIL()
return emitter.Link(this);
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "InvokeOpenInstanceThunk";
+ return "InvokeOpenInstanceThunk"u8;
}
}
}
@@ -280,11 +281,11 @@ public override MethodIL EmitIL()
return emitter.Link(this);
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "InvokeClosedStaticThunk";
+ return "InvokeClosedStaticThunk"u8;
}
}
}
@@ -365,7 +366,7 @@ public override MethodIL EmitIL()
codeStream.EmitLdLoc(delegateArrayLocal);
codeStream.EmitLdLoc(iteratorLocal);
codeStream.Emit(ILOpcode.ldelema, emitter.NewToken(delegateWrapperType));
- codeStream.Emit(ILOpcode.ldfld, emitter.NewToken(delegateWrapperType.GetKnownField("Value")));
+ codeStream.Emit(ILOpcode.ldfld, emitter.NewToken(delegateWrapperType.GetKnownField("Value"u8)));
// Call the delegate
// delegateArrayLocal[iteratorLocal].Value(...)
@@ -415,11 +416,11 @@ public override MethodIL EmitIL()
return emitter.Link(this);
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "InvokeMulticastThunk";
+ return "InvokeMulticastThunk"u8;
}
}
}
@@ -463,11 +464,11 @@ public override MethodIL EmitIL()
return emitter.Link(this);
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "InvokeInstanceClosedOverGenericMethodThunk";
+ return "InvokeInstanceClosedOverGenericMethodThunk"u8;
}
}
}
@@ -492,7 +493,7 @@ public override MethodIL EmitIL(MethodDesc specializedMethod)
{
var emit = new ILEmitter();
ILCodeStream codeStream = emit.NewCodeStream();
- codeStream.EmitCallThrowHelper(emit, Context.GetHelperEntryPoint("ThrowHelpers", "ThrowNotSupportedException"));
+ codeStream.EmitCallThrowHelper(emit, Context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowNotSupportedException"u8));
return emit.Link(specializedMethod);
}
@@ -562,7 +563,7 @@ public override MethodIL EmitIL()
}
else
{
- MethodDesc emptyObjectArrayMethod = Context.GetHelperEntryPoint("DelegateHelpers", "GetEmptyObjectArray");
+ MethodDesc emptyObjectArrayMethod = Context.GetHelperEntryPoint("DelegateHelpers"u8, "GetEmptyObjectArray"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(emptyObjectArrayMethod));
codeStream.EmitStLoc(argsLocal);
}
@@ -578,14 +579,14 @@ public override MethodIL EmitIL()
codeStream.EmitLdArg(0);
codeStream.Emit(ILOpcode.ldfld, emitter.NewToken(HelperObjectField));
- MetadataType funcType = Context.SystemModule.GetKnownType("System", "Func`2");
+ MetadataType funcType = Context.SystemModule.GetKnownType("System"u8, "Func`2"u8);
TypeDesc instantiatedFunc = funcType.MakeInstantiatedType(objectArrayType, objectType);
codeStream.Emit(ILOpcode.castclass, emitter.NewToken(instantiatedFunc));
codeStream.EmitLdLoc(argsLocal);
- MethodDesc invokeMethod = instantiatedFunc.GetKnownMethod("Invoke", null);
+ MethodDesc invokeMethod = instantiatedFunc.GetKnownMethod("Invoke"u8, null);
codeStream.Emit(ILOpcode.callvirt, emitter.NewToken(invokeMethod));
ILLocalVariable retLocal = (ILLocalVariable)(-1);
@@ -640,11 +641,11 @@ public override MethodIL EmitIL()
return emitter.Link(this);
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "InvokeObjectArrayThunk";
+ return "InvokeObjectArrayThunk"u8;
}
}
}
@@ -757,11 +758,11 @@ public override bool IsVirtual
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "GetThunk";
+ return "GetThunk"u8;
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DynamicInvokeMethodThunk.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DynamicInvokeMethodThunk.cs
index 9a02967189db31..fd1dd35bd75d7c 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DynamicInvokeMethodThunk.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/DynamicInvokeMethodThunk.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -119,7 +120,7 @@ protected override int ComputeHashCode()
return base.ComputeHashCode() ^ _targetSignature.GetHashCode();
}
- public override string Name => "DynamicInvoke";
+ public override ReadOnlySpan Name => "DynamicInvoke"u8;
public override string DiagnosticName => "DynamicInvoke";
@@ -142,7 +143,7 @@ public override MethodIL EmitIL()
if (_targetSignature.Length != 0)
{
var fieldByReferenceValueToken = emitter.NewToken(
- Context.SystemModule.GetKnownType("System", "ByReference").GetKnownField("Value"));
+ Context.SystemModule.GetKnownType("System"u8, "ByReference"u8).GetKnownField("Value"u8));
for (int i = 0; i < _targetSignature.Length; i++)
{
codeStream.EmitLdArg(3);
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/EnumThunks.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/EnumThunks.cs
index f1eb89c48d5215..f02bd56d3c786c 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/EnumThunks.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/EnumThunks.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -28,7 +29,7 @@ private MethodDesc ObjectGetHashCodeMethod
{
get
{
- return Context.GetWellKnownType(WellKnownType.Object).GetKnownMethod("GetHashCode", null);
+ return Context.GetWellKnownType(WellKnownType.Object).GetKnownMethod("GetHashCode"u8, null);
}
}
@@ -56,11 +57,11 @@ public override MethodSignature Signature
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "GetHashCode";
+ return "GetHashCode"u8;
}
}
@@ -119,7 +120,7 @@ private MethodDesc ObjectEqualsMethod
{
get
{
- return Context.GetWellKnownType(WellKnownType.Object).GetKnownMethod("Equals", null);
+ return Context.GetWellKnownType(WellKnownType.Object).GetKnownMethod("Equals"u8, null);
}
}
@@ -147,11 +148,11 @@ public override MethodSignature Signature
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "Equals";
+ return "Equals"u8;
}
}
@@ -196,7 +197,7 @@ public override MethodIL EmitIL()
// return ({underlyingtype})this == ({underlyingtype})obj;
// PREFER: ILOpcode.unbox, but the codegen for that is pretty bad
- codeStream.Emit(ILOpcode.ldflda, emitter.NewToken(Context.GetWellKnownType(WellKnownType.Object).GetKnownField("m_pEEType")));
+ codeStream.Emit(ILOpcode.ldflda, emitter.NewToken(Context.GetWellKnownType(WellKnownType.Object).GetKnownField("m_pEEType"u8)));
codeStream.EmitLdc(Context.Target.PointerSize);
codeStream.Emit(ILOpcode.add);
codeStream.EmitLdInd(owningTypeAsOpen);
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ForwardDelegateCreationThunk.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ForwardDelegateCreationThunk.cs
index 3dd0616af51eb2..9d4ef6cbb517bb 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ForwardDelegateCreationThunk.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ForwardDelegateCreationThunk.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
using Internal.TypeSystem.Interop;
@@ -61,11 +62,11 @@ public override MethodSignature Signature
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "ForwardDelegateCreationStub__" + DelegateType.Name;
+ return "ForwardDelegateCreationStub__"u8.Append(DelegateType.Name);
}
}
@@ -110,7 +111,7 @@ public override MethodIL EmitIL()
.GetPInvokeDelegateWrapperMethod(PInvokeDelegateWrapperMethodKind.Invoke)));
codeStream.Emit(ILOpcode.newobj, emitter.NewToken(
- _delegateType.GetMethod(".ctor",
+ _delegateType.GetMethod(".ctor"u8,
new MethodSignature(MethodSignatureFlags.None,
genericParameterCount: 0,
returnType: Context.GetWellKnownType(WellKnownType.Void),
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/InterlockedIntrinsics.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/InterlockedIntrinsics.cs
index c5aa13bd3ddf11..30f5fca3d9521c 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/InterlockedIntrinsics.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/InterlockedIntrinsics.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -18,10 +20,10 @@ public static MethodIL EmitIL(
#endif // READYTORUN
MethodDesc method)
{
- Debug.Assert(((MetadataType)method.OwningType).Name == "Interlocked");
+ Debug.Assert(((MetadataType)method.OwningType).Name.SequenceEqual("Interlocked"u8));
Debug.Assert(!method.IsGenericMethodDefinition);
- if (method.HasInstantiation && method.Name == "CompareExchange")
+ if (method.HasInstantiation && method.Name.SequenceEqual("CompareExchange"u8))
{
#if READYTORUN
// Check to see if the tokens needed to describe the CompareExchange are naturally present within
@@ -54,7 +56,7 @@ public static MethodIL EmitIL(
if (ceArgType is not null)
{
- MethodDesc compareExchangeNonGeneric = method.OwningType.GetKnownMethod("CompareExchange",
+ MethodDesc compareExchangeNonGeneric = method.OwningType.GetKnownMethod("CompareExchange"u8,
new MethodSignature(
MethodSignatureFlags.Static,
genericParameterCount: 0,
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/MethodBaseGetCurrentMethodThunk.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/MethodBaseGetCurrentMethodThunk.cs
index eaed268049d42c..856b356c20922c 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/MethodBaseGetCurrentMethodThunk.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/MethodBaseGetCurrentMethodThunk.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -20,7 +21,7 @@ public MethodBaseGetCurrentMethodThunk(MethodDesc method)
Method = method;
Signature = new MethodSignature(MethodSignatureFlags.Static, 0,
- Context.SystemModule.GetKnownType("System.Reflection", "MethodBase"), TypeDesc.EmptyTypes);
+ Context.SystemModule.GetKnownType("System.Reflection"u8, "MethodBase"u8), TypeDesc.EmptyTypes);
}
public override TypeSystemContext Context
@@ -36,7 +37,7 @@ public MethodDesc Method
get;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
@@ -72,16 +73,16 @@ public override MethodIL EmitIL()
codeStream.Emit(ILOpcode.ldtoken, emit.NewToken(Method));
- string helperName;
+ ReadOnlySpan helperName;
if (Method.OwningType.HasInstantiation)
{
codeStream.Emit(ILOpcode.ldtoken, emit.NewToken(Method.OwningType));
- helperName = "GetCurrentMethodGeneric";
+ helperName = "GetCurrentMethodGeneric"u8;
}
else
- helperName = "GetCurrentMethodNonGeneric";
+ helperName = "GetCurrentMethodNonGeneric"u8;
- MethodDesc classlibHelper = Context.GetHelperEntryPoint("ReflectionHelpers", helperName);
+ MethodDesc classlibHelper = Context.GetHelperEntryPoint("ReflectionHelpers"u8, helperName);
codeStream.Emit(ILOpcode.call, emit.NewToken(classlibHelper));
codeStream.Emit(ILOpcode.ret);
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeILEmitter.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeILEmitter.cs
index 4621ebc0e465e1..adac4052ca6864 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeILEmitter.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeILEmitter.cs
@@ -173,8 +173,8 @@ private void EmitDelegateCall(DelegateMarshallingMethodThunk delegateMethod, PIn
MethodSignatureFlags.Static, 0, _marshallers[0].ManagedParameterType, parameters);
fnptrLoadStream.Emit(ILOpcode.call, emitter.NewToken(
- delegateMethod.Context.GetHelperType("InteropHelpers").GetKnownMethod(
- "GetCurrentCalleeOpenStaticDelegateFunctionPointer", null)));
+ delegateMethod.Context.GetHelperType("InteropHelpers"u8).GetKnownMethod(
+ "GetCurrentCalleeOpenStaticDelegateFunctionPointer"u8, null)));
ILLocalVariable vDelegateStub = emitter.NewLocal(
delegateMethod.Context.GetWellKnownType(WellKnownType.IntPtr));
@@ -191,8 +191,8 @@ private void EmitDelegateCall(DelegateMarshallingMethodThunk delegateMethod, PIn
// which returns the delegate. Do a CallVirt on the invoke method.
//
MethodDesc instantiatedHelper = delegateMethod.Context.GetInstantiatedMethod(
- delegateMethod.Context.GetHelperType("InteropHelpers")
- .GetKnownMethod("GetCurrentCalleeDelegate", null),
+ delegateMethod.Context.GetHelperType("InteropHelpers"u8)
+ .GetKnownMethod("GetCurrentCalleeDelegate"u8, null),
new Instantiation((delegateMethod.DelegateType)));
fnptrLoadStream.Emit(ILOpcode.call, emitter.NewToken(instantiatedHelper));
@@ -200,7 +200,7 @@ private void EmitDelegateCall(DelegateMarshallingMethodThunk delegateMethod, PIn
ILLocalVariable vDelegateStub = emitter.NewLocal(delegateMethod.DelegateType);
fnptrLoadStream.EmitStLoc(vDelegateStub);
marshallingCodeStream.EmitLdLoc(vDelegateStub);
- MethodDesc invokeMethod = delegateMethod.DelegateType.GetKnownMethod("Invoke", null);
+ MethodDesc invokeMethod = delegateMethod.DelegateType.GetKnownMethod("Invoke"u8, null);
callsiteSetupCodeStream.Emit(ILOpcode.callvirt, emitter.NewToken(invokeMethod));
}
else if (delegateMethod.Kind == DelegateMarshallingMethodThunkKind.ForwardNativeFunctionWrapper)
@@ -209,7 +209,7 @@ private void EmitDelegateCall(DelegateMarshallingMethodThunk delegateMethod, PIn
if (_flags.SetLastError)
{
callsiteSetupCodeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetPInvokeMarshal(context).GetKnownMethod("ClearLastError", null)));
+ InteropTypes.GetPInvokeMarshal(context).GetKnownMethod("ClearLastError"u8, null)));
}
//
@@ -218,7 +218,7 @@ private void EmitDelegateCall(DelegateMarshallingMethodThunk delegateMethod, PIn
fnptrLoadStream.EmitLdArg(0);
fnptrLoadStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes
.GetNativeFunctionPointerWrapper(context)
- .GetMethod("get_NativeFunctionPointer", null)));
+ .GetMethod("get_NativeFunctionPointer"u8, null)));
var fnPtr = emitter.NewLocal(
context.GetWellKnownType(WellKnownType.IntPtr));
@@ -249,7 +249,7 @@ private void EmitDelegateCall(DelegateMarshallingMethodThunk delegateMethod, PIn
{
callsiteSetupCodeStream.Emit(ILOpcode.call, emitter.NewToken(
InteropTypes.GetPInvokeMarshal(context)
- .GetKnownMethod("SaveLastError", null)));
+ .GetKnownMethod("SaveLastError"u8, null)));
}
}
else
@@ -280,7 +280,7 @@ private void EmitPInvokeCall(PInvokeILCodeStreams ilCodeStreams)
throw new NotSupportedException();
}
callsiteSetupCodeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetPInvokeMarshal(context).GetKnownMethod("ClearLastError", null)));
+ InteropTypes.GetPInvokeMarshal(context).GetKnownMethod("ClearLastError"u8, null)));
}
for (int i = 1; i < _marshallers.Length; i++)
@@ -304,12 +304,12 @@ private void EmitPInvokeCall(PInvokeILCodeStreams ilCodeStreams)
MethodSignatureFlags.Static | MethodSignatureFlags.UnmanagedCallingConvention, 0, nativeReturnType, nativeParameterTypes,
_targetMethod.GetPInvokeMethodCallingConventions().EncodeAsEmbeddedSignatureData(context));
- MetadataType lazyHelperType = context.GetHelperType("InteropHelpers");
+ MetadataType lazyHelperType = context.GetHelperType("InteropHelpers"u8);
FieldDesc lazyDispatchCell = _interopStateManager.GetPInvokeLazyFixupField(_targetMethod, nativeSig);
fnptrLoadStream.Emit(ILOpcode.ldsflda, emitter.NewToken(lazyDispatchCell));
fnptrLoadStream.Emit(ILOpcode.call, emitter.NewToken(lazyHelperType
- .GetKnownMethod("ResolvePInvoke", null)));
+ .GetKnownMethod("ResolvePInvoke"u8, null)));
ILLocalVariable vNativeFunctionPointer = emitter.NewLocal(context
.GetWellKnownType(WellKnownType.IntPtr));
@@ -334,7 +334,7 @@ private void EmitPInvokeCall(PInvokeILCodeStreams ilCodeStreams)
{
callsiteSetupCodeStream.Emit(ILOpcode.call, emitter.NewToken(
InteropTypes.GetMarshal(context)
- .GetKnownMethod("ThrowExceptionForHR", null)));
+ .GetKnownMethod("ThrowExceptionForHR"u8, null)));
}
// if the SetLastError flag is set in DllImport, call the PInvokeMarshal.SaveLastError
@@ -343,14 +343,14 @@ private void EmitPInvokeCall(PInvokeILCodeStreams ilCodeStreams)
{
callsiteSetupCodeStream.Emit(ILOpcode.call, emitter.NewToken(
InteropTypes.GetPInvokeMarshal(context)
- .GetKnownMethod("SaveLastError", null)));
+ .GetKnownMethod("SaveLastError"u8, null)));
}
if (MarshalHelpers.ShouldCheckForPendingException(context.Target, _pInvokeMetadata))
{
- MetadataType lazyHelperType = context.SystemModule.GetKnownType("System.Runtime.InteropServices.ObjectiveC", "ObjectiveCMarshal");
+ MetadataType lazyHelperType = context.SystemModule.GetKnownType("System.Runtime.InteropServices.ObjectiveC"u8, "ObjectiveCMarshal"u8);
callsiteSetupCodeStream.Emit(ILOpcode.call, emitter.NewToken(lazyHelperType
- .GetKnownMethod("ThrowPendingExceptionObject", null)));
+ .GetKnownMethod("ThrowPendingExceptionObject"u8, null)));
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeLazyFixupField.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeLazyFixupField.cs
index b14891312fa43d..eeb74f74215823 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeLazyFixupField.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeLazyFixupField.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -62,7 +63,7 @@ public override TypeDesc FieldType
{
get
{
- return Context.GetHelperType("InteropHelpers").GetNestedType("MethodFixupCell");
+ return Context.GetHelperType("InteropHelpers"u8).GetNestedType("MethodFixupCell");
}
}
@@ -123,7 +124,7 @@ public override bool HasCustomAttribute(string attributeNamespace, string attrib
return false;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeTargetNativeMethod.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeTargetNativeMethod.cs
index 0e3eaeae12e7e0..10520bf0266c70 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeTargetNativeMethod.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/PInvokeTargetNativeMethod.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
namespace Internal.IL.Stubs
@@ -53,7 +54,7 @@ public override MethodSignature Signature
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/RuntimeHelpersIntrinsics.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/RuntimeHelpersIntrinsics.cs
index ad0670d36f7e94..ae97ccd4c597d8 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/RuntimeHelpersIntrinsics.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/RuntimeHelpersIntrinsics.cs
@@ -16,8 +16,7 @@ public static class RuntimeHelpersIntrinsics
{
public static MethodIL EmitIL(MethodDesc method)
{
- Debug.Assert(((MetadataType)method.OwningType).Name == "RuntimeHelpers");
- string methodName = method.Name;
+ Debug.Assert(((MetadataType)method.OwningType).Name.SequenceEqual("RuntimeHelpers"u8));
// All the methods handled below are per-instantiation generic methods
if (method.Instantiation.Length != 1 || method.IsTypicalMethodDefinition)
@@ -30,7 +29,7 @@ public static MethodIL EmitIL(MethodDesc method)
return null;
bool result;
- if (methodName == "IsBitwiseEquatable")
+ if (method.Name.SequenceEqual("IsBitwiseEquatable"u8))
{
// Ideally we could detect automatically whether a type is trivially equatable
// (i.e., its operator == could be implemented via memcmp). But for now we'll
@@ -58,8 +57,8 @@ public static MethodIL EmitIL(MethodDesc method)
if (elementType is MetadataType mdType)
{
if (mdType.Module == mdType.Context.SystemModule &&
- mdType.Namespace == "System.Text" &&
- mdType.Name == "Rune")
+ mdType.Namespace.SequenceEqual("System.Text"u8) &&
+ mdType.Name.SequenceEqual("Rune"u8))
{
result = true;
}
@@ -70,7 +69,7 @@ public static MethodIL EmitIL(MethodDesc method)
if (equatable.HasValue && !equatable.Value)
{
// Value type that can use memcmp and that doesn't override object.Equals or implement IEquatable.Equals.
- MethodDesc objectEquals = mdType.Context.GetWellKnownType(WellKnownType.Object).GetMethod("Equals", null);
+ MethodDesc objectEquals = mdType.Context.GetWellKnownType(WellKnownType.Object).GetMethod("Equals"u8, null);
result =
mdType.FindVirtualFunctionTargetMethodOnObjectType(objectEquals).OwningType != mdType &&
ComparerIntrinsics.CanCompareValueTypeBits(mdType, objectEquals);
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StreamIntrinsics.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StreamIntrinsics.cs
index c9e65cc40fa9e0..f678bfe9bd74e5 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StreamIntrinsics.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StreamIntrinsics.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -14,15 +16,15 @@ public static class StreamIntrinsics
{
public static MethodIL EmitIL(MethodDesc method)
{
- Debug.Assert(((MetadataType)method.OwningType).Name == "Stream");
+ Debug.Assert(((MetadataType)method.OwningType).Name.SequenceEqual("Stream"u8));
- bool isRead = method.Name == "HasOverriddenBeginEndRead";
- if (!isRead && method.Name != "HasOverriddenBeginEndWrite")
+ bool isRead = method.Name.SequenceEqual("HasOverriddenBeginEndRead"u8);
+ if (!isRead && !method.Name.SequenceEqual("HasOverriddenBeginEndWrite"u8))
return null;
TypeDesc streamClass = method.OwningType;
- MethodDesc beginMethod = streamClass.GetMethod(isRead ? "BeginRead" : "BeginWrite", null);
- MethodDesc endMethod = streamClass.GetMethod(isRead ? "EndRead" : "EndWrite", null);
+ MethodDesc beginMethod = streamClass.GetMethod(isRead ? "BeginRead"u8 : "BeginWrite"u8, null);
+ MethodDesc endMethod = streamClass.GetMethod(isRead ? "EndRead"u8 : "EndWrite"u8, null);
ILEmitter emitter = new ILEmitter();
ILCodeStream codestream = emitter.NewCodeStream();
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StructMarshallingThunk.Mangling.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StructMarshallingThunk.Mangling.cs
index 68506e92117f40..0ddfcaa7789623 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StructMarshallingThunk.Mangling.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StructMarshallingThunk.Mangling.cs
@@ -19,7 +19,7 @@ string IPrefixMangledType.Prefix
{
get
{
- return NamePrefix;
+ return System.Text.Encoding.UTF8.GetString(NamePrefix);
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StructMarshallingThunk.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StructMarshallingThunk.cs
index 5c8f57452386cc..1d0263ef3cc52e 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StructMarshallingThunk.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/StructMarshallingThunk.cs
@@ -102,30 +102,30 @@ public override MethodSignature Signature
}
}
- private string NamePrefix
+ private ReadOnlySpan NamePrefix
{
get
{
switch (ThunkType)
{
case StructMarshallingThunkType.ManagedToNative:
- return "ManagedToNative";
+ return "ManagedToNative"u8;
case StructMarshallingThunkType.NativeToManaged:
- return "NativeToManaged";
+ return "NativeToManaged"u8;
case StructMarshallingThunkType.Cleanup:
- return "Cleanup";
+ return "Cleanup"u8;
default:
Debug.Fail("Unexpected Struct marshalling thunk type");
- return string.Empty;
+ return [];
}
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return NamePrefix + "__" + ((MetadataType)ManagedType).Name;
+ return NamePrefix.Append("__"u8, ManagedType.Name);
}
}
@@ -133,7 +133,7 @@ public override string DiagnosticName
{
get
{
- return NamePrefix + "__" + ManagedType.DiagnosticName;
+ return GetName();
}
}
@@ -307,7 +307,7 @@ public override MethodIL EmitIL()
}
catch (NotSupportedException)
{
- string message = "Struct '" + ((MetadataType)ManagedType).Name +
+ string message = "Struct '" + ((MetadataType)ManagedType).GetName() +
"' requires marshalling that is not yet supported by this compiler.";
return MarshalHelpers.EmitExceptionBody(message, this);
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/TypeGetTypeMethodThunk.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/TypeGetTypeMethodThunk.cs
index 48db579f5ea5a9..1db9b1c2f4231f 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/TypeGetTypeMethodThunk.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/TypeGetTypeMethodThunk.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.TypeSystem;
using Debug = System.Diagnostics.Debug;
@@ -33,11 +34,11 @@ public override TypeSystemContext Context
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return $"{_helperMethod.Name}_{Signature.Length}_{DefaultAssemblyName}";
+ return System.Text.Encoding.UTF8.GetBytes($"{_helperMethod.GetName()}_{Signature.Length}_{DefaultAssemblyName}");
}
}
@@ -169,14 +170,14 @@ protected override TypeGetTypeMethodThunk CreateValueFromKey(Key key)
// We only need 2 helpers to support this. Use the second parameter to pick the right one.
- string helperName;
+ ReadOnlySpan helperName;
MethodSignature signature = key.GetTypeOverload.Signature;
if (signature.Length > 1 && signature[1].HasInstantiation)
- helperName = "ExtensibleGetType";
+ helperName = "ExtensibleGetType"u8;
else
- helperName = "GetType";
+ helperName = "GetType"u8;
- MethodDesc helper = context.GetHelperEntryPoint("ReflectionHelpers", helperName);
+ MethodDesc helper = context.GetHelperEntryPoint("ReflectionHelpers"u8, helperName);
return new TypeGetTypeMethodThunk(_parent._owningTypeForThunks, signature, helper, key.DefaultAssemblyName);
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/TypeSystemThrowingILEmitter.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/TypeSystemThrowingILEmitter.cs
index 912a0d498152a1..e04df500733789 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/TypeSystemThrowingILEmitter.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/TypeSystemThrowingILEmitter.cs
@@ -29,24 +29,24 @@ public static MethodIL EmitIL(MethodDesc methodThatShouldThrow, TypeSystemExcept
// There are two ThrowTypeLoadException helpers. Find the one which matches the number of
// arguments "exception" was initialized with.
//
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowTypeLoadException");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowTypeLoadException"u8);
if (helper.Signature.Length != exception.Arguments.Count + 1)
{
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowTypeLoadExceptionWithArgument");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowTypeLoadExceptionWithArgument"u8);
}
}
else if (exceptionType == typeof(TypeSystemException.MissingFieldException))
{
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowMissingFieldException");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowMissingFieldException"u8);
}
else if (exceptionType == typeof(TypeSystemException.MissingMethodException))
{
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowMissingMethodException");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowMissingMethodException"u8);
}
else if (exceptionType == typeof(TypeSystemException.FileNotFoundException))
{
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowFileNotFoundException");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowFileNotFoundException"u8);
}
else if (exceptionType == typeof(TypeSystemException.InvalidProgramException))
{
@@ -55,20 +55,20 @@ public static MethodIL EmitIL(MethodDesc methodThatShouldThrow, TypeSystemExcept
// arguments "exception" was initialized with.
//
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowInvalidProgramException");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowInvalidProgramException"u8);
if (helper.Signature.Length != exception.Arguments.Count + 1)
{
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowInvalidProgramExceptionWithArgument");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowInvalidProgramExceptionWithArgument"u8);
}
}
else if (exceptionType == typeof(TypeSystemException.BadImageFormatException))
{
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowBadImageFormatException");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowBadImageFormatException"u8);
}
else if (exceptionType == typeof(TypeSystemException.MarshalDirectiveException))
{
- helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowMarshalDirectiveException");
+ helper = context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowMarshalDirectiveException"u8);
}
else
{
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/UnsafeIntrinsics.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/UnsafeIntrinsics.cs
index 2b90323728049f..65b26afcf46f57 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/UnsafeIntrinsics.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/UnsafeIntrinsics.cs
@@ -16,9 +16,9 @@ public static class UnsafeIntrinsics
{
public static MethodIL EmitIL(MethodDesc method)
{
- Debug.Assert(((MetadataType)method.OwningType).Name == "Unsafe");
+ Debug.Assert(((MetadataType)method.OwningType).Name.SequenceEqual("Unsafe"u8));
- switch (method.Name)
+ switch (method.GetName())
{
case "AsPointer":
return new ILStubMethodIL(method, new byte[] { (byte)ILOpcode.ldarg_0, (byte)ILOpcode.conv_u, (byte)ILOpcode.ret }, Array.Empty(), null);
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ValueTypeGetFieldHelperMethodOverride.cs b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ValueTypeGetFieldHelperMethodOverride.cs
index 0da39be56f58e7..73b362d8154ada 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ValueTypeGetFieldHelperMethodOverride.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/Stubs/ValueTypeGetFieldHelperMethodOverride.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using ILCompiler;
@@ -50,7 +51,7 @@ public override MethodSignature Signature
{
TypeSystemContext context = _owningType.Context;
TypeDesc int32Type = context.GetWellKnownType(WellKnownType.Int32);
- TypeDesc eeTypePtrType = context.SystemModule.GetKnownType("Internal.Runtime", "MethodTable").MakePointerType();
+ TypeDesc eeTypePtrType = context.SystemModule.GetKnownType("Internal.Runtime"u8, "MethodTable"u8).MakePointerType();
_signature = new MethodSignature(0, 0, int32Type, [ int32Type, eeTypePtrType.MakeByRefType() ]);
}
@@ -79,12 +80,12 @@ private MethodIL EmitILCommon(MethodDesc contextMethod)
if (_owningType.IsInlineArray)
{
var stream = emitter.NewCodeStream();
- MethodDesc thrower = Context.GetHelperEntryPoint("ThrowHelpers", "ThrowNotSupportedInlineArrayEqualsGetHashCode");
+ MethodDesc thrower = Context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowNotSupportedInlineArrayEqualsGetHashCode"u8);
stream.EmitCallThrowHelper(emitter, thrower);
return emitter.Link(this);
}
- if (_owningType.IsValueType && ComparerIntrinsics.CanCompareValueTypeBitsUntilOffset(_owningType, Context.GetWellKnownType(WellKnownType.Object).GetMethod("Equals", null), out int lastFieldEndOffset))
+ if (_owningType.IsValueType && ComparerIntrinsics.CanCompareValueTypeBitsUntilOffset(_owningType, Context.GetWellKnownType(WellKnownType.Object).GetMethod("Equals"u8, null), out int lastFieldEndOffset))
{
var stream = emitter.NewCodeStream();
stream.EmitLdc(-lastFieldEndOffset);
@@ -92,13 +93,13 @@ private MethodIL EmitILCommon(MethodDesc contextMethod)
return emitter.Link(this);
}
- TypeDesc methodTableType = Context.SystemModule.GetKnownType("Internal.Runtime", "MethodTable");
- MethodDesc methodTableOfMethod = methodTableType.GetKnownMethod("Of", null);
+ TypeDesc methodTableType = Context.SystemModule.GetKnownType("Internal.Runtime"u8, "MethodTable"u8);
+ MethodDesc methodTableOfMethod = methodTableType.GetKnownMethod("Of"u8, null);
var owningType = (MetadataType)_owningType.InstantiateAsOpen();
ILToken rawDataToken = owningType.IsValueType ? default :
- emitter.NewToken(Context.SystemModule.GetKnownType("System.Runtime.CompilerServices", "RawData").GetKnownField("Data"));
+ emitter.NewToken(Context.SystemModule.GetKnownType("System.Runtime.CompilerServices"u8, "RawData"u8).GetKnownField("Data"u8));
var switchStream = emitter.NewCodeStream();
var getFieldStream = emitter.NewCodeStream();
@@ -214,9 +215,9 @@ public override bool IsVirtual
}
}
- internal const string MetadataName = "__GetFieldHelper";
+ internal static ReadOnlySpan MetadataName => "__GetFieldHelper"u8;
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
@@ -228,7 +229,7 @@ public override string DiagnosticName
{
get
{
- return MetadataName;
+ return "__GetFieldHelper";
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/IL/UnsafeAccessors.cs b/src/coreclr/tools/Common/TypeSystem/IL/UnsafeAccessors.cs
index b6be413b9baa14..464105b2395b1a 100644
--- a/src/coreclr/tools/Common/TypeSystem/IL/UnsafeAccessors.cs
+++ b/src/coreclr/tools/Common/TypeSystem/IL/UnsafeAccessors.cs
@@ -206,7 +206,7 @@ private static bool TryParseUnsafeAccessorAttribute(MethodDesc method, CustomAtt
// as empty at the use site.
if (kind is not UnsafeAccessorKind.Constructor)
{
- name = method.Name;
+ name = method.GetName();
}
}
@@ -434,7 +434,7 @@ private static SetTargetResult TrySetTargetMethod(ref GenerationContext context,
}
// Check for matching name
- if (!md.Name.Equals(name))
+ if (!md.GetName().Equals(name))
{
continue;
}
@@ -497,7 +497,7 @@ private static SetTargetResult TrySetTargetField(ref GenerationContext context,
}
// Validate the name and target type match.
- if (fd.Name.Equals(name)
+ if (fd.GetName().Equals(name)
&& fieldType == fd.FieldType)
{
context.TargetField = fd;
@@ -812,20 +812,20 @@ private static MethodIL GenerateAccessorSpecificFailure(ref GenerationContext co
if (result is SetTargetResult.Ambiguous)
{
codeStream.EmitLdc((int)ExceptionStringID.AmbiguousMatchUnsafeAccessor);
- thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers", "ThrowAmbiguousMatchException");
+ thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowAmbiguousMatchException"u8);
}
else if (result is SetTargetResult.Invalid)
{
codeStream.EmitLdc((int)ExceptionStringID.InvalidProgramDefault);
- thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers", "ThrowInvalidProgramException");
+ thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowInvalidProgramException"u8);
}
else if (result is SetTargetResult.NotSupported)
{
- thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers", "ThrowNotSupportedException");
+ thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowNotSupportedException"u8);
}
else if (result is SetTargetResult.MissingType)
{
- thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers", "ThrowUnavailableType");
+ thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowUnavailableType"u8);
}
else
{
@@ -834,12 +834,12 @@ private static MethodIL GenerateAccessorSpecificFailure(ref GenerationContext co
if (context.Kind == UnsafeAccessorKind.Field || context.Kind == UnsafeAccessorKind.StaticField)
{
id = ExceptionStringID.MissingField;
- thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers", "ThrowMissingFieldException");
+ thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowMissingFieldException"u8);
}
else
{
id = ExceptionStringID.MissingMethod;
- thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers", "ThrowMissingMethodException");
+ thrower = typeSysContext.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowMissingMethodException"u8);
}
codeStream.EmitLdc((int)id);
@@ -860,7 +860,7 @@ private static MethodIL GenerateAccessorBadImageFailure(MethodDesc method)
ILCodeLabel label = emit.NewCodeLabel();
codeStream.EmitLabel(label);
codeStream.EmitLdc((int)ExceptionStringID.BadImageFormatGeneric);
- MethodDesc thrower = method.Context.GetHelperEntryPoint("ThrowHelpers", "ThrowBadImageFormatException");
+ MethodDesc thrower = method.Context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowBadImageFormatException"u8);
codeStream.Emit(ILOpcode.call, emit.NewToken(thrower));
codeStream.Emit(ILOpcode.br, label);
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/InlineArrayType.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/InlineArrayType.cs
index e2e79e04917fc7..8fd0f847466e8b 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/InlineArrayType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/InlineArrayType.cs
@@ -27,11 +27,11 @@ public override ModuleDesc Module
get;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "_InlineArray__" + ElementType.Name + "__"+ Length;
+ return "_InlineArray__"u8.Append(ElementType.Name, "__"u8, Length);
}
}
@@ -43,11 +43,11 @@ public override string DiagnosticName
}
}
- public override string Namespace
+ public override ReadOnlySpan Namespace
{
get
{
- return "Internal.CompilerGenerated";
+ return "Internal.CompilerGenerated"u8;
}
}
@@ -55,7 +55,7 @@ public override string DiagnosticNamespace
{
get
{
- return Namespace;
+ return "Internal.CompilerGenerated";
}
}
@@ -217,33 +217,25 @@ protected override MethodImplRecord[] ComputeVirtualMethodImplsForType()
return Array.Empty();
}
- public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string name)
+ public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(ReadOnlySpan name)
{
return Array.Empty();
}
private int _hashCode;
- private void InitializeHashCode()
+ private int InitializeHashCode()
{
- var hashCodeBuilder = new Internal.NativeFormat.TypeHashingAlgorithms.HashCodeBuilder(Namespace);
-
- if (Namespace.Length > 0)
- {
- hashCodeBuilder.Append(".");
- }
-
- hashCodeBuilder.Append(Name);
- _hashCode = hashCodeBuilder.ToHashCode();
+ return _hashCode = VersionResilientHashCode.NameHashCode(Namespace, Name);
}
public override int GetHashCode()
{
- if (_hashCode == 0)
+ if (_hashCode != 0)
{
- InitializeHashCode();
+ return _hashCode;
}
- return _hashCode;
+ return InitializeHashCode();
}
protected override TypeFlags ComputeTypeFlags(TypeFlags mask)
@@ -339,17 +331,17 @@ public override TypeSystemContext Context
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
if (_kind == InlineArrayMethodKind.Getter)
{
- return "get_Item";
+ return "get_Item"u8;
}
else
{
- return "set_Item";
+ return "set_Item"u8;
}
}
}
@@ -358,7 +350,7 @@ public override string DiagnosticName
{
get
{
- return Name;
+ return GetName();
}
}
@@ -509,11 +501,11 @@ public override bool HasCustomAttribute(string attributeNamespace, string attrib
return false;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "InlineArrayField";
+ return "InlineArrayField"u8;
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/MarshalHelpers.Aot.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/MarshalHelpers.Aot.cs
index a143624f710d14..0ce898ca039122 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/MarshalHelpers.Aot.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/MarshalHelpers.Aot.cs
@@ -123,7 +123,7 @@ public static MethodIL EmitExceptionBody(string message, MethodDesc method)
TypeSystemContext context = method.Context;
MethodSignature ctorSignature = new MethodSignature(0, 0, context.GetWellKnownType(WellKnownType.Void),
new TypeDesc[] { context.GetWellKnownType(WellKnownType.String) });
- MethodDesc exceptionCtor = InteropTypes.GetMarshalDirectiveException(context).GetKnownMethod(".ctor", ctorSignature);
+ MethodDesc exceptionCtor = InteropTypes.GetMarshalDirectiveException(context).GetKnownMethod(".ctor"u8, ctorSignature);
ILCodeStream codeStream = emitter.NewCodeStream();
codeStream.Emit(ILOpcode.ldstr, emitter.NewToken(message));
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/MarshalHelpers.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/MarshalHelpers.cs
index 6e0d4f5838b585..ec516afcd25265 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/MarshalHelpers.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/MarshalHelpers.cs
@@ -202,8 +202,8 @@ private static bool HasCopyConstructorCustomModifier(int? parameterIndex,
if (customModifierType == null)
continue;
- if ((customModifierType.Namespace == "System.Runtime.CompilerServices" && customModifierType.Name == "IsCopyConstructed") ||
- (customModifierType.Namespace == "Microsoft.VisualC" && customModifierType.Name == "NeedsCopyConstructorModifier"))
+ if ((customModifierType.Namespace.SequenceEqual("System.Runtime.CompilerServices"u8) && customModifierType.Name.SequenceEqual("IsCopyConstructed"u8)) ||
+ (customModifierType.Namespace.SequenceEqual("Microsoft.VisualC"u8) && customModifierType.Name.SequenceEqual("NeedsCopyConstructorModifier"u8)))
{
return true;
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.Aot.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.Aot.cs
index f1fc3547a09a8a..c3e1e4bed9d41e 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.Aot.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.Aot.cs
@@ -108,7 +108,7 @@ internal sealed class AnsiCharArrayMarshaller : ArrayMarshaller
protected override void AllocManagedToNative(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "AllocMemoryForAnsiCharArray");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AllocMemoryForAnsiCharArray"u8);
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
@@ -120,7 +120,7 @@ protected override void AllocManagedToNative(ILCodeStream codeStream)
protected override void TransformManagedToNative(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "WideCharArrayToAnsiCharArray");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "WideCharArrayToAnsiCharArray"u8);
LoadManagedValue(codeStream);
LoadNativeValue(codeStream);
@@ -132,7 +132,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
protected override void TransformNativeToManaged(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "AnsiCharArrayToWideCharArray");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AnsiCharArrayToWideCharArray"u8);
LoadNativeValue(codeStream);
LoadManagedValue(codeStream);
@@ -145,7 +145,7 @@ internal sealed class AnsiCharMarshaller : Marshaller
protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "WideCharToAnsiChar");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "WideCharToAnsiChar"u8);
LoadManagedValue(codeStream);
codeStream.Emit(PInvokeFlags.BestFitMapping ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0);
@@ -157,7 +157,7 @@ protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream
protected override void TransformNativeToManaged(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "AnsiCharToWideChar");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AnsiCharToWideChar"u8);
LoadNativeValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
@@ -184,7 +184,7 @@ internal override bool CleanupRequired
internal override void EmitElementCleanup(ILCodeStream codeStream, ILEmitter emitter)
{
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem", null)));
+ InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem"u8, null)));
}
protected override void AllocNativeToManaged(ILCodeStream codeStream)
@@ -205,8 +205,8 @@ protected override void AllocNativeToManaged(ILCodeStream codeStream)
protected override void AllocManagedToNative(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- string helperMethodName = _isAnsi ? "AllocMemoryForAnsiStringBuilder" : "AllocMemoryForUnicodeStringBuilder";
- var helper = Context.GetHelperEntryPoint("InteropHelpers", helperMethodName);
+ ReadOnlySpan helperMethodName = _isAnsi ? "AllocMemoryForAnsiStringBuilder"u8 : "AllocMemoryForUnicodeStringBuilder"u8;
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, helperMethodName);
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
@@ -217,8 +217,8 @@ protected override void AllocManagedToNative(ILCodeStream codeStream)
protected override void TransformManagedToNative(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- string helperMethodName = _isAnsi ? "StringBuilderToAnsiString" : "StringBuilderToUnicodeString";
- var helper = Context.GetHelperEntryPoint("InteropHelpers", helperMethodName);
+ ReadOnlySpan helperMethodName = _isAnsi ? "StringBuilderToAnsiString"u8 : "StringBuilderToUnicodeString"u8;
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, helperMethodName);
LoadManagedValue(codeStream);
LoadNativeValue(codeStream);
@@ -232,8 +232,8 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
protected override void TransformNativeToManaged(ILCodeStream codeStream)
{
- string helperMethodName = _isAnsi ? "AnsiStringToStringBuilder" : "UnicodeStringToStringBuilder";
- var helper = Context.GetHelperEntryPoint("InteropHelpers", helperMethodName);
+ ReadOnlySpan helperMethodName = _isAnsi ? "AnsiStringToStringBuilder"u8 : "UnicodeStringToStringBuilder"u8;
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, helperMethodName);
LoadNativeValue(codeStream);
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(helper));
@@ -245,7 +245,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadNativeValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem", null)));
+ InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem"u8, null)));
}
}
@@ -254,7 +254,7 @@ internal sealed class HandleRefMarshaller : Marshaller
protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream)
{
LoadManagedAddr(codeStream);
- codeStream.Emit(ILOpcode.ldfld, _ilCodeStreams.Emitter.NewToken(InteropTypes.GetHandleRef(Context).GetKnownField("_handle")));
+ codeStream.Emit(ILOpcode.ldfld, _ilCodeStreams.Emitter.NewToken(InteropTypes.GetHandleRef(Context).GetKnownField("_handle"u8)));
StoreNativeValue(codeStream);
}
@@ -271,8 +271,8 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
protected override void EmitCleanupManaged(ILCodeStream codeStream)
{
LoadManagedAddr(codeStream);
- codeStream.Emit(ILOpcode.ldfld, _ilCodeStreams.Emitter.NewToken(InteropTypes.GetHandleRef(Context).GetKnownField("_wrapper")));
- codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(InteropTypes.GetGC(Context).GetKnownMethod("KeepAlive", null)));
+ codeStream.Emit(ILOpcode.ldfld, _ilCodeStreams.Emitter.NewToken(InteropTypes.GetHandleRef(Context).GetKnownField("_wrapper"u8)));
+ codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(InteropTypes.GetGC(Context).GetKnownMethod("KeepAlive"u8, null)));
}
}
@@ -618,12 +618,12 @@ protected override bool IsAnsi
protected override MethodDesc GetManagedToNativeHelper()
{
- return Context.GetHelperEntryPoint("InteropHelpers", "StringToByValAnsiString");
+ return Context.GetHelperEntryPoint("InteropHelpers"u8, "StringToByValAnsiString"u8);
}
protected override MethodDesc GetNativeToManagedHelper()
{
- return Context.GetHelperEntryPoint("InteropHelpers", "ByValAnsiStringToString");
+ return Context.GetHelperEntryPoint("InteropHelpers"u8, "ByValAnsiStringToString"u8);
}
}
@@ -639,12 +639,12 @@ protected override bool IsAnsi
protected override MethodDesc GetManagedToNativeHelper()
{
- return Context.GetHelperEntryPoint("InteropHelpers", "StringToUnicodeFixedArray");
+ return Context.GetHelperEntryPoint("InteropHelpers"u8, "StringToUnicodeFixedArray"u8);
}
protected override MethodDesc GetNativeToManagedHelper()
{
- return Context.GetHelperEntryPoint("InteropHelpers", "UnicodeToStringFixedArray");
+ return Context.GetHelperEntryPoint("InteropHelpers"u8, "UnicodeToStringFixedArray"u8);
}
}
@@ -681,8 +681,8 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
codeStream.Emit(ILOpcode.brtrue, lNonNull);
codeStream.Emit(ILOpcode.ldtoken, emitter.NewToken(ManagedType));
- codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetType(Context).GetMethod("GetTypeFromHandle", null)));
- codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetRuntimeHelpers(Context).GetKnownMethod("GetUninitializedObject", null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetType(Context).GetMethod("GetTypeFromHandle"u8, null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetRuntimeHelpers(Context).GetKnownMethod("GetUninitializedObject"u8, null)));
StoreManagedValue(codeStream);
codeStream.EmitLabel(lNonNull);
@@ -735,8 +735,8 @@ protected override void AllocNativeToManaged(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
codeStream.Emit(ILOpcode.ldtoken, emitter.NewToken(ManagedType));
- codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetType(Context).GetMethod("GetTypeFromHandle", null)));
- codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetRuntimeHelpers(Context).GetKnownMethod("GetUninitializedObject", null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetType(Context).GetMethod("GetTypeFromHandle"u8, null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetRuntimeHelpers(Context).GetKnownMethod("GetUninitializedObject"u8, null)));
StoreManagedValue(codeStream);
}
@@ -815,7 +815,7 @@ protected override void AllocManagedToNative(ILCodeStream codeStream)
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.brfalse, lNull);
- MethodDesc getNativeSizeHelper = Context.GetHelperEntryPoint("InteropHelpers", "AsAnyGetNativeSize");
+ MethodDesc getNativeSizeHelper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AsAnyGetNativeSize"u8);
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(getNativeSizeHelper));
@@ -842,7 +842,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
LoadManagedValue(codeStream);
LoadNativeValue(codeStream);
codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(
- Context.GetHelperEntryPoint("InteropHelpers", "AsAnyMarshalManagedToNative")));
+ Context.GetHelperEntryPoint("InteropHelpers"u8, "AsAnyMarshalManagedToNative"u8)));
codeStream.EmitLabel(lNull);
}
@@ -858,7 +858,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
LoadNativeValue(codeStream);
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(
- Context.GetHelperEntryPoint("InteropHelpers", "AsAnyMarshalNativeToManaged")));
+ Context.GetHelperEntryPoint("InteropHelpers"u8, "AsAnyMarshalNativeToManaged"u8)));
codeStream.EmitLabel(lNull);
}
@@ -880,7 +880,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream)
LoadNativeValue(codeStream);
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- Context.GetHelperEntryPoint("InteropHelpers", "AsAnyCleanupNative")));
+ Context.GetHelperEntryPoint("InteropHelpers"u8, "AsAnyCleanupNative"u8)));
codeStream.EmitLabel(lNull);
}
@@ -911,7 +911,7 @@ protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream
for (int i = 8; i < 16; i++)
codeStream.EmitLdc(bytes[i]);
- MetadataType guidType = Context.SystemModule.GetKnownType("System", "Guid");
+ MetadataType guidType = Context.SystemModule.GetKnownType("System"u8, "Guid"u8);
var int32Type = Context.GetWellKnownType(WellKnownType.Int32);
var int16Type = Context.GetWellKnownType(WellKnownType.Int16);
var byteType = Context.GetWellKnownType(WellKnownType.Byte);
@@ -921,10 +921,10 @@ protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream
returnType: Context.GetWellKnownType(WellKnownType.Void),
parameters: new TypeDesc[] { int32Type, int16Type, int16Type, byteType, byteType, byteType, byteType, byteType, byteType, byteType, byteType });
MethodDesc guidCtorHandleMethod =
- guidType.GetKnownMethod(".ctor", sig);
+ guidType.GetKnownMethod(".ctor"u8, sig);
codeStream.Emit(ILOpcode.newobj, emitter.NewToken(guidCtorHandleMethod));
- MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers", "ConvertManagedComInterfaceToNative");
+ MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "ConvertManagedComInterfaceToNative"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
}
else
@@ -934,7 +934,7 @@ protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream
throw new NotSupportedException();
}
- MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers", "ConvertManagedComInterfaceToIUnknown");
+ MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "ConvertManagedComInterfaceToIUnknown"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
}
@@ -946,7 +946,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadNativeValue(codeStream);
- MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers", "ConvertNativeComInterfaceToManaged");
+ MethodDesc helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "ConvertNativeComInterfaceToManaged"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreManagedValue(codeStream);
@@ -965,7 +965,7 @@ internal sealed class AnsiBSTRStringMarshaller : Marshaller
internal override void EmitElementCleanup(ILCodeStream codeStream, ILEmitter emitter)
{
- var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("FreeBSTR", null);
+ var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("FreeBSTR"u8, null);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
}
protected override void TransformManagedToNative(ILCodeStream codeStream)
@@ -973,7 +973,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadManagedValue(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "StringToAnsiBstrBuffer");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "StringToAnsiBstrBuffer"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreNativeValue(codeStream);
@@ -984,7 +984,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadNativeValue(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "AnsiBstrBufferToString");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "AnsiBstrBufferToString"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreManagedValue(codeStream);
@@ -998,7 +998,7 @@ internal sealed class BSTRStringMarshaller : Marshaller
internal override void EmitElementCleanup(ILCodeStream codeStream, ILEmitter emitter)
{
- var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("FreeBSTR", null);
+ var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("FreeBSTR"u8, null);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
}
protected override void TransformManagedToNative(ILCodeStream codeStream)
@@ -1006,7 +1006,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadManagedValue(codeStream);
- var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("StringToBSTR", null);
+ var helper = InteropTypes.GetMarshal(Context).GetKnownMethod("StringToBSTR"u8, null);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreNativeValue(codeStream);
@@ -1017,7 +1017,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadNativeValue(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "BstrBufferToString");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "BstrBufferToString"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreManagedValue(codeStream);
@@ -1031,7 +1031,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadManagedValue(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "DateTimeToOleDateTime");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "DateTimeToOleDateTime"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreNativeValue(codeStream);
@@ -1042,7 +1042,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadNativeValue(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "OleDateTimeToDateTime");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "OleDateTimeToDateTime"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreManagedValue(codeStream);
@@ -1056,7 +1056,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadManagedValue(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "DecimalToOleCurrency");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "DecimalToOleCurrency"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreNativeValue(codeStream);
@@ -1067,7 +1067,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadNativeValue(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "OleCurrencyToDecimal");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "OleCurrencyToDecimal"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreManagedValue(codeStream);
@@ -1107,7 +1107,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
LoadManagedValue(codeStream);
LoadNativeAddr(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "ConvertObjectToVariant");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "ConvertObjectToVariant"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
}
@@ -1122,7 +1122,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
LoadNativeAddr(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "VariantToObject");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "VariantToObject"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
StoreManagedValue(codeStream);
@@ -1139,7 +1139,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadNativeAddr(codeStream);
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "CleanupVariant");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "CleanupVariant"u8);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
}
}
@@ -1162,16 +1162,16 @@ private ILLocalVariable InitializeMarshallerVariable()
ThrowHelper.ThrowTypeLoadException(marshallerType);
}
- var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices", "ICustomMarshaler");
+ var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "ICustomMarshaler"u8);
var getInstanceMethod = marshallerType.GetMethod(
- "GetInstance",
+ "GetInstance"u8,
new MethodSignature(MethodSignatureFlags.Static, 0, customMarshallerType, [ Context.GetWellKnownType(WellKnownType.String) ]));
if (ManagedType.IsValueType || ManagedType.IsPointer || ManagedType.IsFunctionPointer)
{
ThrowHelper.ThrowMarshalDirectiveException();
}
- var initializeCustomMarshallerMethod = Context.GetHelperEntryPoint("InteropHelpers", "InitializeCustomMarshaller");
+ var initializeCustomMarshallerMethod = Context.GetHelperEntryPoint("InteropHelpers"u8, "InitializeCustomMarshaller"u8);
ILEmitter emitter = _ilCodeStreams.Emitter;
MarshallerLocalVariable = emitter.NewLocal(customMarshallerType);
@@ -1201,10 +1201,10 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
{
var lMarshaller = InitializeMarshallerVariable();
- var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices", "ICustomMarshaler");
+ var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "ICustomMarshaler"u8);
ILEmitter emitter = _ilCodeStreams.Emitter;
var manageToNativeMethod = customMarshallerType.GetKnownMethod(
- "MarshalManagedToNative",
+ "MarshalManagedToNative"u8,
new MethodSignature(MethodSignatureFlags.None, 0, Context.GetWellKnownType(WellKnownType.IntPtr), [ Context.GetWellKnownType(WellKnownType.Object) ]));
codeStream.EmitLdLoc(lMarshaller);
@@ -1230,10 +1230,10 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
{
var lMarshaller = InitializeMarshallerVariable();
- var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices", "ICustomMarshaler");
+ var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "ICustomMarshaler"u8);
ILEmitter emitter = _ilCodeStreams.Emitter;
var marshalNativeToManagedMethod = customMarshallerType.GetKnownMethod(
- "MarshalNativeToManaged",
+ "MarshalNativeToManaged"u8,
new MethodSignature(MethodSignatureFlags.None, 0, Context.GetWellKnownType(WellKnownType.Object), [ Context.GetWellKnownType(WellKnownType.IntPtr) ]));
codeStream.EmitLdLoc(lMarshaller);
@@ -1246,12 +1246,12 @@ protected void EmitCleanUpManagedData(ILCodeStream codeStream)
{
var lMarshaller = InitializeMarshallerVariable();
- var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices", "ICustomMarshaler");
+ var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "ICustomMarshaler"u8);
ILEmitter emitter = _ilCodeStreams.Emitter;
// Call CleanUpManagedData on cleanup code stream.
var cleanupManagedDataMethod = customMarshallerType.GetKnownMethod(
- "CleanUpManagedData",
+ "CleanUpManagedData"u8,
new MethodSignature(MethodSignatureFlags.None, 0, Context.GetWellKnownType(WellKnownType.Void), [ Context.GetWellKnownType(WellKnownType.Object) ]));
codeStream.EmitLdLoc(lMarshaller);
@@ -1263,12 +1263,12 @@ protected void EmitCleanUpNativeData(ILCodeStream codeStream)
{
var lMarshaller = InitializeMarshallerVariable();
- var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices", "ICustomMarshaler");
+ var customMarshallerType = Context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "ICustomMarshaler"u8);
ILEmitter emitter = _ilCodeStreams.Emitter;
// Call CleanUpNativeData on cleanup code stream.
var cleanupNativeDataMethod = customMarshallerType.GetKnownMethod(
- "CleanUpNativeData",
+ "CleanUpNativeData"u8,
new MethodSignature(MethodSignatureFlags.None, 0, Context.GetWellKnownType(WellKnownType.Void), [ Context.GetWellKnownType(WellKnownType.IntPtr) ]));
codeStream.EmitLdLoc(lMarshaller);
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs
index 471a9f30a6b182..3ebef5efc770a2 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/Marshaller.cs
@@ -1115,7 +1115,7 @@ protected override void AllocManagedToNative(ILCodeStream codeStream)
codeStream.Emit(ILOpcode.mul_ovf);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("AllocCoTaskMem", null)));
+ InteropTypes.GetMarshal(Context).GetKnownMethod("AllocCoTaskMem"u8, null)));
StoreNativeValue(codeStream);
codeStream.EmitLabel(lNullArray);
@@ -1340,7 +1340,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream)
}
LoadNativeValue(codeStream);
- codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem", null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem"u8, null)));
codeStream.EmitLabel(lNullArray);
}
}
@@ -1352,7 +1352,7 @@ protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream
ILEmitter emitter = _ilCodeStreams.Emitter;
ILCodeLabel lNullArray = emitter.NewCodeLabel();
- MethodDesc getArrayDataReferenceGenericMethod = InteropTypes.GetMemoryMarshal(Context).GetKnownMethod("GetArrayDataReference", null);
+ MethodDesc getArrayDataReferenceGenericMethod = InteropTypes.GetMemoryMarshal(Context).GetKnownMethod("GetArrayDataReference"u8, null);
MethodDesc getArrayDataReferenceMethod = getArrayDataReferenceGenericMethod.MakeInstantiatedMethod(ManagedElementType);
// Check for null array
@@ -1482,7 +1482,7 @@ internal override bool CleanupRequired
internal override void EmitElementCleanup(ILCodeStream codeStream, ILEmitter emitter)
{
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem", null)));
+ InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem"u8, null)));
}
protected override void TransformManagedToNative(ILCodeStream codeStream)
@@ -1520,7 +1520,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
Context.GetWellKnownType(WellKnownType.String).
- GetKnownMethod("GetPinnableReference", null)));
+ GetKnownMethod("GetPinnableReference"u8, null)));
codeStream.EmitStLoc(vPinnedCharRef);
codeStream.EmitLdLoc(vPinnedCharRef);
codeStream.Emit(ILOpcode.conv_u);
@@ -1534,7 +1534,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
}
else
{
- var helper = Context.GetHelperEntryPoint("InteropHelpers", "StringToUnicodeBuffer");
+ var helper = Context.GetHelperEntryPoint("InteropHelpers"u8, "StringToUnicodeBuffer"u8);
LoadManagedValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));
@@ -1546,7 +1546,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
protected override void TransformNativeToManaged(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- var charPtrConstructor = Context.GetWellKnownType(WellKnownType.String).GetMethod(".ctor",
+ var charPtrConstructor = Context.GetWellKnownType(WellKnownType.String).GetMethod(".ctor"u8,
new MethodSignature(
MethodSignatureFlags.None, 0, Context.GetWellKnownType(WellKnownType.Void),
new TypeDesc[] {
@@ -1570,7 +1570,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream)
LoadNativeValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem", null)));
+ InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem"u8, null)));
codeStream.EmitLabel(lNullCheck);
}
@@ -1591,7 +1591,7 @@ internal override bool CleanupRequired
internal override void EmitElementCleanup(ILCodeStream codeStream, ILEmitter emitter)
{
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem", null)));
+ InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem"u8, null)));
}
protected override void TransformManagedToNative(ILCodeStream codeStream)
@@ -1602,7 +1602,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
// ANSI marshalling. Allocate a byte array, copy characters
//
LoadManagedValue(codeStream);
- var stringToAnsi = Context.GetHelperEntryPoint("InteropHelpers", "StringToAnsiString");
+ var stringToAnsi = Context.GetHelperEntryPoint("InteropHelpers"u8, "StringToAnsiString"u8);
codeStream.Emit(PInvokeFlags.BestFitMapping ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0);
codeStream.Emit(PInvokeFlags.ThrowOnUnmappableChar ? ILOpcode.ldc_i4_1 : ILOpcode.ldc_i4_0);
@@ -1615,7 +1615,7 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
protected override void TransformNativeToManaged(ILCodeStream codeStream)
{
ILEmitter emitter = _ilCodeStreams.Emitter;
- var ansiToString = Context.GetHelperEntryPoint("InteropHelpers", "AnsiStringToString");
+ var ansiToString = Context.GetHelperEntryPoint("InteropHelpers"u8, "AnsiStringToString"u8);
LoadNativeValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(ansiToString));
StoreManagedValue(codeStream);
@@ -1632,7 +1632,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream)
LoadNativeValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem", null)));
+ InteropTypes.GetMarshal(Context).GetKnownMethod("FreeCoTaskMem"u8, null)));
codeStream.EmitLabel(lNullCheck);
}
@@ -1644,7 +1644,7 @@ internal sealed class UTF8StringMarshaller : Marshaller
private ILLocalVariable? _marshallerInstance;
- private MetadataType Marshaller => Context.SystemModule.GetKnownType("System.Runtime.InteropServices.Marshalling", "Utf8StringMarshaller");
+ private MetadataType Marshaller => Context.SystemModule.GetKnownType("System.Runtime.InteropServices.Marshalling"u8, "Utf8StringMarshaller"u8);
private MetadataType MarshallerIn => Marshaller.GetNestedType("ManagedToUnmanagedIn");
@@ -1655,7 +1655,7 @@ internal override void EmitElementCleanup(ILCodeStream codeStream, ILEmitter emi
Debug.Assert(_marshallerInstance is null);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- Marshaller.GetKnownMethod("Free", null)));
+ Marshaller.GetKnownMethod("Free"u8, null)));
}
protected override void TransformManagedToNative(ILCodeStream codeStream)
@@ -1685,21 +1685,21 @@ protected override void TransformManagedToNative(ILCodeStream codeStream)
codeStream.EmitLdLoc(vBuffer);
codeStream.EmitLdc(LocalBufferLength);
- var spanOfByte = Context.SystemModule.GetKnownType("System", "Span`1").MakeInstantiatedType(
+ var spanOfByte = Context.SystemModule.GetKnownType("System"u8, "Span`1"u8).MakeInstantiatedType(
new TypeDesc[] { Context.GetWellKnownType(WellKnownType.Byte) });
- codeStream.Emit(ILOpcode.newobj, emitter.NewToken(spanOfByte.GetKnownMethod(".ctor",
+ codeStream.Emit(ILOpcode.newobj, emitter.NewToken(spanOfByte.GetKnownMethod(".ctor"u8,
new MethodSignature(0, 0, Context.GetWellKnownType(WellKnownType.Void),
new TypeDesc[] { Context.GetWellKnownType(WellKnownType.Void).MakePointerType(), Context.GetWellKnownType(WellKnownType.Int32) }))));
- codeStream.Emit(ILOpcode.call, emitter.NewToken(marshallerIn.GetKnownMethod("FromManaged", null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(marshallerIn.GetKnownMethod("FromManaged"u8, null)));
codeStream.EmitLdLoca(_marshallerInstance.Value);
- codeStream.Emit(ILOpcode.call, emitter.NewToken(marshallerIn.GetKnownMethod("ToUnmanaged", null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(marshallerIn.GetKnownMethod("ToUnmanaged"u8, null)));
}
else
{
LoadManagedValue(codeStream);
- codeStream.Emit(ILOpcode.call, emitter.NewToken(Marshaller.GetKnownMethod("ConvertToUnmanaged", null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(Marshaller.GetKnownMethod("ConvertToUnmanaged"u8, null)));
}
StoreNativeValue(codeStream);
@@ -1710,7 +1710,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
ILEmitter emitter = _ilCodeStreams.Emitter;
LoadNativeValue(codeStream);
- codeStream.Emit(ILOpcode.call, emitter.NewToken(Marshaller.GetKnownMethod("ConvertToManaged", null)));
+ codeStream.Emit(ILOpcode.call, emitter.NewToken(Marshaller.GetKnownMethod("ConvertToManaged"u8, null)));
StoreManagedValue(codeStream);
}
@@ -1722,13 +1722,13 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream)
{
codeStream.EmitLdLoca(_marshallerInstance.Value);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- MarshallerIn.GetKnownMethod("Free", null)));
+ MarshallerIn.GetKnownMethod("Free"u8, null)));
}
else
{
LoadNativeValue(codeStream);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- Marshaller.GetKnownMethod("Free", null)));
+ Marshaller.GetKnownMethod("Free"u8, null)));
}
}
}
@@ -1768,7 +1768,7 @@ protected override void EmitMarshalReturnValueManagedToNative()
LoadManagedValue(returnValueMarshallingCodeStream);
LoadNativeValue(returnValueMarshallingCodeStream);
returnValueMarshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetSafeHandle(Context).GetKnownMethod("SetHandle", null)));
+ InteropTypes.GetSafeHandle(Context).GetKnownMethod("SetHandle"u8, null)));
}
protected override void EmitMarshalArgumentManagedToNative()
@@ -1796,13 +1796,13 @@ protected override void EmitMarshalArgumentManagedToNative()
LoadManagedValue(marshallingCodeStream);
marshallingCodeStream.EmitLdLoca(vAddRefed);
marshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(
- safeHandleType.GetKnownMethod("DangerousAddRef",
+ safeHandleType.GetKnownMethod("DangerousAddRef"u8,
new MethodSignature(0, 0, Context.GetWellKnownType(WellKnownType.Void),
new TypeDesc[] { Context.GetWellKnownType(WellKnownType.Boolean).MakeByRefType() }))));
LoadManagedValue(marshallingCodeStream);
marshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(
- safeHandleType.GetKnownMethod("DangerousGetHandle",
+ safeHandleType.GetKnownMethod("DangerousGetHandle"u8,
new MethodSignature(0, 0, Context.GetWellKnownType(WellKnownType.IntPtr), TypeDesc.EmptyTypes))));
StoreNativeValue(marshallingCodeStream);
@@ -1811,7 +1811,7 @@ protected override void EmitMarshalArgumentManagedToNative()
cleanupCodeStream.Emit(ILOpcode.brfalse, lNotAddrefed);
LoadManagedValue(cleanupCodeStream);
cleanupCodeStream.Emit(ILOpcode.call, emitter.NewToken(
- safeHandleType.GetKnownMethod("DangerousRelease",
+ safeHandleType.GetKnownMethod("DangerousRelease"u8,
new MethodSignature(0, 0, Context.GetWellKnownType(WellKnownType.Void), TypeDesc.EmptyTypes))));
cleanupCodeStream.EmitLabel(lNotAddrefed);
}
@@ -1845,7 +1845,7 @@ protected override void EmitMarshalArgumentManagedToNative()
cleanupCodeStream.EmitLdLoc(vSafeHandle);
LoadNativeValue(cleanupCodeStream);
cleanupCodeStream.Emit(ILOpcode.call, emitter.NewToken(
- safeHandleType.GetKnownMethod("SetHandle",
+ safeHandleType.GetKnownMethod("SetHandle"u8,
new MethodSignature(0, 0, Context.GetWellKnownType(WellKnownType.Void),
new TypeDesc[] { Context.GetWellKnownType(WellKnownType.IntPtr) }))));
@@ -1905,7 +1905,7 @@ protected override void AllocAndTransformManagedToNative(ILCodeStream codeStream
codeStream.Emit(ILOpcode.brfalse, lNullPointer);
codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("GetFunctionPointerForDelegate",
+ InteropTypes.GetMarshal(Context).GetKnownMethod("GetFunctionPointerForDelegate"u8,
new MethodSignature(MethodSignatureFlags.Static, 1, Context.GetWellKnownType(WellKnownType.IntPtr),
new TypeDesc[] { Context.GetSignatureVariable(0, method: true) }
)).MakeInstantiatedMethod(ManagedType)));
@@ -1931,7 +1931,7 @@ protected override void TransformNativeToManaged(ILCodeStream codeStream)
codeStream.Emit(ILOpcode.brfalse, lNullPointer);
codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(
- InteropTypes.GetMarshal(Context).GetKnownMethod("GetDelegateForFunctionPointer",
+ InteropTypes.GetMarshal(Context).GetKnownMethod("GetDelegateForFunctionPointer"u8,
new MethodSignature(MethodSignatureFlags.Static, 1, Context.GetSignatureVariable(0, method: true),
new TypeDesc[] { Context.GetWellKnownType(WellKnownType.IntPtr) }
)).MakeInstantiatedMethod(ManagedType)));
@@ -1953,7 +1953,7 @@ protected override void EmitCleanupManaged(ILCodeStream codeStream)
&& MarshallerType == MarshallerType.Argument)
{
LoadManagedValue(codeStream);
- codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(InteropTypes.GetGC(Context).GetKnownMethod("KeepAlive", null)));
+ codeStream.Emit(ILOpcode.call, _ilCodeStreams.Emitter.NewToken(InteropTypes.GetGC(Context).GetKnownMethod("KeepAlive"u8, null)));
}
}
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/NativeStructType.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/NativeStructType.cs
index 4df0e469b80549..930783b00e9e67 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/NativeStructType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/NativeStructType.cs
@@ -21,11 +21,11 @@ public override ModuleDesc Module
get;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "__NativeType__" + ManagedStructType.Name;
+ return "__NativeType__"u8.Append(ManagedStructType.Name);
}
}
@@ -37,11 +37,11 @@ public override string DiagnosticName
}
}
- public override string Namespace
+ public override ReadOnlySpan Namespace
{
get
{
- return "Internal.CompilerGenerated";
+ return "Internal.CompilerGenerated"u8;
}
}
@@ -273,33 +273,25 @@ protected override MethodImplRecord[] ComputeVirtualMethodImplsForType()
return Array.Empty();
}
- public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string name)
+ public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(ReadOnlySpan name)
{
return Array.Empty();
}
private int _hashCode;
- private void InitializeHashCode()
+ private int InitializeHashCode()
{
- var hashCodeBuilder = new Internal.NativeFormat.TypeHashingAlgorithms.HashCodeBuilder(Namespace);
-
- if (Namespace.Length > 0)
- {
- hashCodeBuilder.Append(".");
- }
-
- hashCodeBuilder.Append(Name);
- _hashCode = hashCodeBuilder.ToHashCode();
+ return _hashCode = VersionResilientHashCode.NameHashCode(Namespace, Name);
}
public override int GetHashCode()
{
- if (_hashCode == 0)
+ if (_hashCode != 0)
{
- InitializeHashCode();
+ return _hashCode;
}
- return _hashCode;
+ return InitializeHashCode();
}
protected override TypeFlags ComputeTypeFlags(TypeFlags mask)
@@ -410,7 +402,7 @@ public override bool HasCustomAttribute(string attributeNamespace, string attrib
return false;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/PInvokeDelegateWrapper.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/PInvokeDelegateWrapper.cs
index 31c96e007e626d..19ad0c826176ef 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/PInvokeDelegateWrapper.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/PInvokeDelegateWrapper.cs
@@ -26,11 +26,11 @@ public override ModuleDesc Module
get;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return "PInvokeDelegateWrapper__" + DelegateType.Name;
+ return "PInvokeDelegateWrapper__"u8.Append(DelegateType.Name);
}
}
@@ -42,11 +42,11 @@ public override string DiagnosticName
}
}
- public override string Namespace
+ public override ReadOnlySpan Namespace
{
get
{
- return "Internal.CompilerGenerated";
+ return "Internal.CompilerGenerated"u8;
}
}
@@ -198,33 +198,25 @@ protected override MethodImplRecord[] ComputeVirtualMethodImplsForType()
return Array.Empty();
}
- public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(string name)
+ public override MethodImplRecord[] FindMethodsImplWithMatchingDeclName(ReadOnlySpan name)
{
return Array.Empty();
}
private int _hashCode;
- private void InitializeHashCode()
+ private int InitializeHashCode()
{
- var hashCodeBuilder = new Internal.NativeFormat.TypeHashingAlgorithms.HashCodeBuilder(Namespace);
-
- if (Namespace.Length > 0)
- {
- hashCodeBuilder.Append(".");
- }
-
- hashCodeBuilder.Append(Name);
- _hashCode = hashCodeBuilder.ToHashCode();
+ return _hashCode = VersionResilientHashCode.NameHashCode(Namespace, Name);
}
public override int GetHashCode()
{
- if (_hashCode == 0)
+ if (_hashCode != 0)
{
- InitializeHashCode();
+ return _hashCode;
}
- return _hashCode;
+ return InitializeHashCode();
}
protected override TypeFlags ComputeTypeFlags(TypeFlags mask)
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/IL/PInvokeDelegateWrapperConstructor.cs b/src/coreclr/tools/Common/TypeSystem/Interop/IL/PInvokeDelegateWrapperConstructor.cs
index 10727fac2b4b8e..af6817d57d09e6 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/IL/PInvokeDelegateWrapperConstructor.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/IL/PInvokeDelegateWrapperConstructor.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Internal.IL;
using Internal.IL.Stubs;
@@ -21,11 +22,11 @@ public override TypeDesc OwningType
get;
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
- return ".ctor";
+ return ".ctor"u8;
}
}
@@ -67,7 +68,7 @@ public override MethodIL EmitIL()
codeStream.EmitLdArg(0);
codeStream.EmitLdArg(1);
codeStream.Emit(ILOpcode.call, emitter.NewToken(
- InteropTypes.GetNativeFunctionPointerWrapper(Context).GetMethod(".ctor", Signature)));
+ InteropTypes.GetNativeFunctionPointerWrapper(Context).GetMethod(".ctor"u8, Signature)));
codeStream.Emit(ILOpcode.ret);
return emitter.Link(this);
}
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/InteropTypes.cs b/src/coreclr/tools/Common/TypeSystem/Interop/InteropTypes.cs
index 247e09e7f77e13..09822e13f8b4de 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/InteropTypes.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/InteropTypes.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+
using Internal.IL;
namespace Internal.TypeSystem.Interop
@@ -9,62 +11,62 @@ public static class InteropTypes
{
public static MetadataType GetGC(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System", "GC");
+ return context.SystemModule.GetKnownType("System"u8, "GC"u8);
}
public static MetadataType GetType(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System", "Type");
+ return context.SystemModule.GetKnownType("System"u8, "Type"u8);
}
public static MetadataType GetSafeHandle(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices", "SafeHandle");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "SafeHandle"u8);
}
public static MetadataType GetCriticalHandle(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices", "CriticalHandle");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "CriticalHandle"u8);
}
public static MetadataType GetHandleRef(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices", "HandleRef");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "HandleRef"u8);
}
public static MetadataType GetPInvokeMarshal(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices", "PInvokeMarshal");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "PInvokeMarshal"u8);
}
public static MetadataType GetRuntimeHelpers(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.CompilerServices", "RuntimeHelpers");
+ return context.SystemModule.GetKnownType("System.Runtime.CompilerServices"u8, "RuntimeHelpers"u8);
}
public static MetadataType GetMarshal(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices", "Marshal");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "Marshal"u8);
}
public static MetadataType GetMemoryMarshal(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices", "MemoryMarshal");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "MemoryMarshal"u8);
}
public static MetadataType GetNativeFunctionPointerWrapper(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices", "NativeFunctionPointerWrapper");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "NativeFunctionPointerWrapper"u8);
}
public static MetadataType GetMarshalDirectiveException(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices", "MarshalDirectiveException");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices"u8, "MarshalDirectiveException"u8);
}
public static MetadataType GetVariant(TypeSystemContext context)
{
- return context.SystemModule.GetKnownType("System.Runtime.InteropServices.Marshalling", "ComVariant");
+ return context.SystemModule.GetKnownType("System.Runtime.InteropServices.Marshalling"u8, "ComVariant"u8);
}
public static bool IsSafeHandle(TypeSystemContext context, TypeDesc type)
@@ -77,92 +79,92 @@ public static bool IsCriticalHandle(TypeSystemContext context, TypeDesc type)
return IsOrDerivesFromType(type, GetCriticalHandle(context));
}
- private static bool IsCoreNamedType(TypeSystemContext context, TypeDesc type, string @namespace, string name)
+ private static bool IsCoreNamedType(TypeSystemContext context, TypeDesc type, ReadOnlySpan @namespace, ReadOnlySpan name)
{
return type is MetadataType mdType &&
- mdType.Name == name &&
- mdType.Namespace == @namespace &&
+ mdType.Name.SequenceEqual(name) &&
+ mdType.Namespace.SequenceEqual(@namespace) &&
mdType.Module == context.SystemModule;
}
public static bool IsHandleRef(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System.Runtime.InteropServices", "HandleRef");
+ return IsCoreNamedType(context, type, "System.Runtime.InteropServices"u8, "HandleRef"u8);
}
public static bool IsSystemDateTime(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "DateTime");
+ return IsCoreNamedType(context, type, "System"u8, "DateTime"u8);
}
public static bool IsStringBuilder(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System.Text", "StringBuilder");
+ return IsCoreNamedType(context, type, "System.Text"u8, "StringBuilder"u8);
}
public static bool IsSystemDecimal(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "Decimal");
+ return IsCoreNamedType(context, type, "System"u8, "Decimal"u8);
}
public static bool IsSystemDelegate(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "Delegate");
+ return IsCoreNamedType(context, type, "System"u8, "Delegate"u8);
}
public static bool IsSystemMulticastDelegate(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "MulticastDelegate");
+ return IsCoreNamedType(context, type, "System"u8, "MulticastDelegate"u8);
}
public static bool IsSystemGuid(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "Guid");
+ return IsCoreNamedType(context, type, "System"u8, "Guid"u8);
}
public static bool IsSystemArgIterator(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "ArgIterator");
+ return IsCoreNamedType(context, type, "System"u8, "ArgIterator"u8);
}
public static bool IsSystemSpan(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "Span`1");
+ return IsCoreNamedType(context, type, "System"u8, "Span`1"u8);
}
public static bool IsSystemReadOnlySpan(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "ReadOnlySpan`1");
+ return IsCoreNamedType(context, type, "System"u8, "ReadOnlySpan`1"u8);
}
public static bool IsSystemNullable(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System", "Nullable`1");
+ return IsCoreNamedType(context, type, "System"u8, "Nullable`1"u8);
}
public static bool IsSystemRuntimeIntrinsicsVector64T(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System.Runtime.Intrinsics", "Vector64`1");
+ return IsCoreNamedType(context, type, "System.Runtime.Intrinsics"u8, "Vector64`1"u8);
}
public static bool IsSystemRuntimeIntrinsicsVector128T(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System.Runtime.Intrinsics", "Vector128`1");
+ return IsCoreNamedType(context, type, "System.Runtime.Intrinsics"u8, "Vector128`1"u8);
}
public static bool IsSystemRuntimeIntrinsicsVector256T(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System.Runtime.Intrinsics", "Vector256`1");
+ return IsCoreNamedType(context, type, "System.Runtime.Intrinsics"u8, "Vector256`1"u8);
}
public static bool IsSystemRuntimeIntrinsicsVector512T(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System.Runtime.Intrinsics", "Vector512`1");
+ return IsCoreNamedType(context, type, "System.Runtime.Intrinsics"u8, "Vector512`1"u8);
}
public static bool IsSystemNumericsVectorT(TypeSystemContext context, TypeDesc type)
{
- return IsCoreNamedType(context, type, "System.Numerics", "Vector`1");
+ return IsCoreNamedType(context, type, "System.Numerics"u8, "Vector`1"u8);
}
private static bool IsOrDerivesFromType(TypeDesc type, MetadataType targetType)
diff --git a/src/coreclr/tools/Common/TypeSystem/Interop/UnmanagedCallingConventions.cs b/src/coreclr/tools/Common/TypeSystem/Interop/UnmanagedCallingConventions.cs
index 98cdb658a42248..36cdc01805540b 100644
--- a/src/coreclr/tools/Common/TypeSystem/Interop/UnmanagedCallingConventions.cs
+++ b/src/coreclr/tools/Common/TypeSystem/Interop/UnmanagedCallingConventions.cs
@@ -189,10 +189,10 @@ private static UnmanagedCallingConventions GetUnmanagedCallingConventionFromAttr
private static UnmanagedCallingConventions AccumulateCallingConventions(UnmanagedCallingConventions existing, MetadataType newConvention)
{
- if (newConvention.Namespace != "System.Runtime.CompilerServices")
+ if (!newConvention.Namespace.SequenceEqual("System.Runtime.CompilerServices"u8))
return existing;
- UnmanagedCallingConventions? addedCallConv = newConvention.Name switch
+ UnmanagedCallingConventions? addedCallConv = newConvention.GetName() switch
{
"CallConvCdecl" => UnmanagedCallingConventions.Cdecl,
"CallConvStdcall" => UnmanagedCallingConventions.Stdcall,
@@ -234,31 +234,31 @@ public static EmbeddedSignatureData[] EncodeAsEmbeddedSignatureData(this Unmanag
{
ret[index++] = CreateCallConvEmbeddedSignatureData(context, convention switch
{
- UnmanagedCallingConventions.Cdecl => "CallConvCdecl",
- UnmanagedCallingConventions.Stdcall => "CallConvStdcall",
- UnmanagedCallingConventions.Fastcall => "CallConvFastcall",
- UnmanagedCallingConventions.Thiscall => "CallConvThiscall",
- UnmanagedCallingConventions.Swift => "CallConvSwift",
+ UnmanagedCallingConventions.Cdecl => "CallConvCdecl"u8,
+ UnmanagedCallingConventions.Stdcall => "CallConvStdcall"u8,
+ UnmanagedCallingConventions.Fastcall => "CallConvFastcall"u8,
+ UnmanagedCallingConventions.Thiscall => "CallConvThiscall"u8,
+ UnmanagedCallingConventions.Swift => "CallConvSwift"u8,
_ => throw new InvalidProgramException()
});
}
if ((modifiers & UnmanagedCallingConventions.IsMemberFunction) != 0)
- ret[index++] = CreateCallConvEmbeddedSignatureData(context, "CallConvMemberFunction");
+ ret[index++] = CreateCallConvEmbeddedSignatureData(context, "CallConvMemberFunction"u8);
if ((modifiers & UnmanagedCallingConventions.IsSuppressGcTransition) != 0)
- ret[index++] = CreateCallConvEmbeddedSignatureData(context, "CallConvSuppressGCTransition");
+ ret[index++] = CreateCallConvEmbeddedSignatureData(context, "CallConvSuppressGCTransition"u8);
Debug.Assert(index == count);
return ret;
- static EmbeddedSignatureData CreateCallConvEmbeddedSignatureData(TypeSystemContext context, string name)
+ static EmbeddedSignatureData CreateCallConvEmbeddedSignatureData(TypeSystemContext context, ReadOnlySpan name)
=> new()
{
index = MethodSignature.IndexOfCustomModifiersOnReturnType,
kind = EmbeddedSignatureDataKind.OptionalCustomModifier,
- type = context.SystemModule.GetKnownType("System.Runtime.CompilerServices", name)
+ type = context.SystemModule.GetKnownType("System.Runtime.CompilerServices"u8, name)
};
}
diff --git a/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs b/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs
index 77d31895e7b134..23ad91a45d9d0a 100644
--- a/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs
+++ b/src/coreclr/tools/Common/TypeSystem/MetadataEmitter/TypeSystemMetadataEmitter.cs
@@ -213,8 +213,8 @@ public EntityHandle GetTypeRef(TypeDesc type)
if (type.IsTypeDefinition && type is MetadataType metadataType)
{
// Make a typeref
- StringHandle typeName = _metadataBuilder.GetOrAddString(metadataType.Name);
- StringHandle typeNamespace = metadataType.Namespace != null ? _metadataBuilder.GetOrAddString(metadataType.Namespace) : default(StringHandle);
+ StringHandle typeName = _metadataBuilder.GetOrAddString(metadataType.GetName());
+ StringHandle typeNamespace = metadataType.Namespace.Length > 0 ? _metadataBuilder.GetOrAddString(metadataType.GetNamespace()) : default(StringHandle);
EntityHandle resolutionScope;
if (metadataType.ContainingType == null)
@@ -316,7 +316,7 @@ public EntityHandle GetMethodRef(MethodDesc method)
else
{
EntityHandle typeHandle = GetTypeRef(method.OwningType);
- StringHandle methodName = _metadataBuilder.GetOrAddString(method.Name);
+ StringHandle methodName = _metadataBuilder.GetOrAddString(method.GetName());
var sig = method.GetTypicalMethodDefinition().Signature;
var sigBlob = GetMethodSignatureBlobHandle(sig);
@@ -337,7 +337,7 @@ public EntityHandle GetFieldRef(FieldDesc field)
EntityHandle fieldHandle;
EntityHandle typeHandle = GetTypeRef((MetadataType)field.OwningType);
- StringHandle fieldName = _metadataBuilder.GetOrAddString(field.Name);
+ StringHandle fieldName = _metadataBuilder.GetOrAddString(field.GetName());
var sigBlob = GetFieldSignatureBlobHandle(field.GetTypicalFieldDefinition());
fieldHandle = _metadataBuilder.AddMemberReference(typeHandle, fieldName, sigBlob);
diff --git a/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/MethodForRuntimeDeterminedType.cs b/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/MethodForRuntimeDeterminedType.cs
index d111f8b130af73..5f97f7645ea76e 100644
--- a/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/MethodForRuntimeDeterminedType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/MethodForRuntimeDeterminedType.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Diagnostics;
namespace Internal.TypeSystem
@@ -35,7 +36,7 @@ internal MethodForRuntimeDeterminedType(MethodDesc typicalMethodDef, RuntimeDete
public override bool IsAbstract => _typicalMethodDef.IsAbstract;
public override bool IsFinal => _typicalMethodDef.IsFinal;
public override bool IsDefaultConstructor => _typicalMethodDef.IsDefaultConstructor;
- public override string Name => _typicalMethodDef.Name;
+ public override ReadOnlySpan Name => _typicalMethodDef.Name;
public override MethodDesc GetTypicalMethodDefinition() => _typicalMethodDef;
public override Instantiation Instantiation => _typicalMethodDef.Instantiation;
diff --git a/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/RuntimeDeterminedType.cs b/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/RuntimeDeterminedType.cs
index fffcc885db2a35..1834c19f5339e8 100644
--- a/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/RuntimeDeterminedType.cs
+++ b/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/RuntimeDeterminedType.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using System.Collections.Generic;
using Debug = System.Diagnostics.Debug;
@@ -89,7 +90,7 @@ public override Instantiation Instantiation
}
}
- public override string Name
+ public override ReadOnlySpan Name
{
get
{
@@ -97,11 +98,12 @@ public override string Name
}
}
- public override string Namespace
+ public override ReadOnlySpan Namespace
{
get
{
- return string.Concat(_runtimeDeterminedDetailsType.Name, "_", _rawCanonType.Namespace);
+ return System.Text.Encoding.UTF8.GetBytes(_runtimeDeterminedDetailsType.Name)
+ .Append("_"u8, _rawCanonType.Namespace);
}
}
@@ -121,7 +123,7 @@ public override IEnumerable GetVirtualMethods()
}
}
- public override MethodDesc GetMethod(string name, MethodSignature signature, Instantiation substitution)
+ public override MethodDesc GetMethod(ReadOnlySpan name, MethodSignature signature, Instantiation substitution)
{
MethodDesc method = _rawCanonType.GetMethod(name, signature, substitution);
if (method == null)
@@ -129,7 +131,7 @@ public override MethodDesc GetMethod(string name, MethodSignature signature, Ins
return Context.GetMethodForRuntimeDeterminedType(method.GetTypicalMethodDefinition(), this);
}
- public override MethodDesc GetMethodWithEquivalentSignature(string name, MethodSignature signature, Instantiation substitution)
+ public override MethodDesc GetMethodWithEquivalentSignature(ReadOnlySpan name, MethodSignature signature, Instantiation substitution)
{
MethodDesc method = _rawCanonType.GetMethodWithEquivalentSignature(name, signature, substitution);
if (method == null)
diff --git a/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/TypeSystemContext.RuntimeDetermined.cs b/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/TypeSystemContext.RuntimeDetermined.cs
index 689905e9526d5e..116ec5d33022fd 100644
--- a/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/TypeSystemContext.RuntimeDetermined.cs
+++ b/src/coreclr/tools/Common/TypeSystem/RuntimeDetermined/TypeSystemContext.RuntimeDetermined.cs
@@ -77,7 +77,7 @@ public MethodForRuntimeDeterminedTypeKey(MethodDesc typicalMethodDef, RuntimeDet
{
_typicalMethodDef = typicalMethodDef;
_rdType = rdType;
- _hashcode = TypeHashingAlgorithms.ComputeMethodHashCode(rdType.CanonicalType.GetHashCode(), TypeHashingAlgorithms.ComputeNameHashCode(typicalMethodDef.Name));
+ _hashcode = rdType.CanonicalType.GetHashCode() ^ VersionResilientHashCode.NameHashCode(typicalMethodDef.Name);
}
public MethodDesc TypicalMethodDef
diff --git a/src/coreclr/tools/ILVerification/ILImporter.Verify.cs b/src/coreclr/tools/ILVerification/ILImporter.Verify.cs
index 675d420febb1ad..430c7e083b8ece 100644
--- a/src/coreclr/tools/ILVerification/ILImporter.Verify.cs
+++ b/src/coreclr/tools/ILVerification/ILImporter.Verify.cs
@@ -1123,7 +1123,7 @@ void CheckDelegateCreation(StackValue ftn, StackValue obj)
bool IsDelegateAssignable(MethodDesc targetMethod, TypeDesc delegateType, TypeDesc firstArg)
{
- var invokeMethod = delegateType.GetMethod("Invoke", null);
+ var invokeMethod = delegateType.GetMethod("Invoke"u8, null);
if (invokeMethod == null)
return false;
@@ -2730,7 +2730,7 @@ static bool HasIsExternalInit(MethodSignature signature)
{
foreach (var data in signature.GetEmbeddedSignatureData())
{
- if (data.type is MetadataType mdType && mdType.Namespace == "System.Runtime.CompilerServices" && mdType.Name == "IsExternalInit" &&
+ if (data.type is MetadataType mdType && mdType.Namespace.SequenceEqual("System.Runtime.CompilerServices"u8) && mdType.Name.SequenceEqual("IsExternalInit"u8) &&
data.index == MethodSignature.IndexOfCustomModifiersOnReturnType)
return true;
}
diff --git a/src/coreclr/tools/ILVerification/ILVerification.projitems b/src/coreclr/tools/ILVerification/ILVerification.projitems
index 335aaef17ad8f7..c301f2da1d298e 100644
--- a/src/coreclr/tools/ILVerification/ILVerification.projitems
+++ b/src/coreclr/tools/ILVerification/ILVerification.projitems
@@ -24,6 +24,9 @@
+
+ TypeSystem\Common\VersionResilientHashCode.cs
+
TypeSystem\CodeGen\MethodDesc.CodeGen.cs
@@ -72,6 +75,9 @@
Utilities\LockFreeReaderHashtable.cs
+
+ TypeSystem\Common\VersionResilientHashCode.TypeSystem.cs
+
TypeSystem\Common\ArrayType.cs
diff --git a/src/coreclr/tools/ILVerify/Program.cs b/src/coreclr/tools/ILVerify/Program.cs
index c5129006e4fa0e..3d5cab0ab42b01 100644
--- a/src/coreclr/tools/ILVerify/Program.cs
+++ b/src/coreclr/tools/ILVerify/Program.cs
@@ -194,7 +194,7 @@ private void PrintVerifyMethodsResult(VerificationResult result, EcmaModule modu
private static void PrintMethod(EcmaMethod method)
{
- Write(method.Name);
+ Write(method.GetName());
Write("(");
try
{
diff --git a/src/coreclr/tools/aot/ILCompiler.Compiler.Tests/DependencyGraphTests.cs b/src/coreclr/tools/aot/ILCompiler.Compiler.Tests/DependencyGraphTests.cs
index d55ac1c07b1474..6295e9341f6bf3 100644
--- a/src/coreclr/tools/aot/ILCompiler.Compiler.Tests/DependencyGraphTests.cs
+++ b/src/coreclr/tools/aot/ILCompiler.Compiler.Tests/DependencyGraphTests.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using System.Text;
using ILCompiler.Dataflow;
using Internal.IL;
using Internal.TypeSystem;
@@ -46,10 +47,10 @@ public static IEnumerable