Skip to content

Commit 840cfe0

Browse files
simonrozsivaljonathanpeppers
authored andcommitted
Include assembly name in hash
1 parent 1d57736 commit 840cfe0

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

src/Microsoft.Android.Runtime.NativeAOT/Android.Runtime.NativeAOT/TypeMapping.cs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,8 @@ internal static bool TryGetType (string javaClassName, [NotNullWhen (true)] out
3838

3939
internal static bool TryGetJavaClassName (Type type, [NotNullWhen (true)] out string? className)
4040
{
41-
string? fullName = type.FullName;
42-
if (fullName is null) {
43-
className = null;
44-
return false;
45-
}
46-
47-
ulong hash = Hash (fullName);
41+
string name = $"{type.FullName}, {type.Assembly.GetName ().Name}";
42+
ulong hash = Hash (name);
4843

4944
// the hashes array is sorted and all the hashes are unique
5045
int javaClassNameIndex = MemoryExtensions.BinarySearch (TypeNameHashes, hash);
@@ -60,17 +55,17 @@ internal static bool TryGetJavaClassName (Type type, [NotNullWhen (true)] out st
6055

6156
// ensure this is not a hash collision
6257
var resolvedType = GetTypeByIndex (JavaClassNameIndexToTypeIndex [javaClassNameIndex]);
63-
if (resolvedType?.FullName != type.FullName) {
58+
if (resolvedType?.AssemblyQualifiedName != type.AssemblyQualifiedName) {
6459
className = null;
6560
return false;
6661
}
6762

6863
return true;
6964
}
7065

71-
private static ulong Hash (string javaClassName)
66+
private static ulong Hash (string value)
7267
{
73-
ReadOnlySpan<byte> bytes = MemoryMarshal.AsBytes (javaClassName.AsSpan ());
68+
ReadOnlySpan<byte> bytes = MemoryMarshal.AsBytes (value.AsSpan ());
7469
ulong hash = XxHash3.HashToUInt64 (bytes);
7570

7671
// The bytes in the hashes array are stored as little endian. If the target platform is big endian,

src/Microsoft.Android.Sdk.ILLink/TypeMappingStep.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ protected override void EndProcess ()
7171
GenerateGetTypeByIndex (types);
7272

7373
// .NET -> Java mapping
74-
KeyValuePair<string, List<TypeDefinition>>[] orderedManagedToJavaMapping = TypeMappings.OrderBy (kvp => Hash (SelectTypeDefinition(kvp.Key, kvp.Value).FullName)).ToArray ();
74+
var orderedManagedToJavaMapping = TypeMappings.OrderBy (kvp => Hash (GetTypeName (SelectTypeDefinition (kvp.Key, kvp.Value)))).ToArray ();
7575

76-
var dotnetTypeNameHashes = orderedManagedToJavaMapping.Select (kvp => Hash (SelectTypeDefinition(kvp.Key, kvp.Value).FullName)).ToArray ();
76+
var dotnetTypeNameHashes = orderedManagedToJavaMapping.Select (kvp => Hash (GetTypeName (SelectTypeDefinition (kvp.Key, kvp.Value)))).ToArray ();
7777
GenerateHashes (dotnetTypeNameHashes, methodName: "get_TypeNameHashes");
7878

79-
string[] javaClassNames = orderedManagedToJavaMapping.Select (kvp => kvp.Key).ToArray ();
79+
var javaClassNames = orderedManagedToJavaMapping.Select (kvp => kvp.Key).ToArray ();
8080
GenerateGetJavaClassNameByIndex (javaClassNames);
8181

8282
// Generate remap arrays
@@ -243,6 +243,13 @@ TypeDefinition GetArrayType (TypeDefinition type, int size)
243243

244244
return arrayType;
245245
}
246+
247+
string GetTypeName (TypeDefinition type)
248+
{
249+
var fullName = type.FullName.Replace ('/', '.').Replace ('+', '.');
250+
var assemblyName = type.Module.Assembly.Name.Name;
251+
return $"{fullName}, {assemblyName}";
252+
}
246253
}
247254

248255
TypeDefinition SelectTypeDefinition (string javaName, List<TypeDefinition> list)

0 commit comments

Comments
 (0)