30bcb4d80968d2e647a20b141ed589375ba4d3da
[platform/upstream/dotnet/runtime.git] /
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4
5 using System;
6
7 using System.Reflection.Metadata;
8 using System.Reflection.Metadata.Ecma335;
9
10 using Internal.JitInterface;
11 using Internal.TypeSystem;
12 using Internal.TypeSystem.Ecma;
13
14 namespace ILCompiler.DependencyAnalysis.ReadyToRun
15 {
16     /// <summary>
17     /// This helper structure encapsulates a module-qualified token.
18     /// </summary>
19     public struct ModuleToken : IEquatable<ModuleToken>
20     {
21         public readonly EcmaModule Module;
22         public readonly mdToken Token;
23
24         public ModuleToken(EcmaModule module, mdToken token)
25         {
26             Module = module;
27             Token = token;
28         }
29         public ModuleToken(EcmaModule module, EntityHandle entityHandle)
30         {
31             Module = module;
32             Token = (mdToken)MetadataTokens.GetToken(entityHandle);
33         }
34
35         public ModuleToken(EcmaModule module, Handle handle)
36         {
37             Module = module;
38             Token = (mdToken)MetadataTokens.GetToken(handle);
39         }
40
41         public bool IsNull => Module == null;
42
43         public override int GetHashCode()
44         {
45             return IsNull ? 0 : Module.GetHashCode() ^ unchecked((int)(31 * (uint)Token));
46         }
47
48         public override string ToString()
49         {
50             if (IsNull)
51             {
52                 return "default(ModuleToken)";
53             }
54             return Module.ToString() + ":" + ((uint)Token).ToString("X8");
55         }
56
57         public override bool Equals(object obj)
58         {
59             return obj is ModuleToken moduleToken &&
60                 Equals(moduleToken);
61         }
62
63         public bool Equals(ModuleToken moduleToken)
64         {
65             return Module == moduleToken.Module && Token == moduleToken.Token;
66         }
67
68         public int CompareTo(ModuleToken other)
69         {
70             int result = Token.CompareTo(other.Token);
71             if (result != 0)
72                 return result;
73
74             return Module.CompareTo(other.Module);
75         }
76
77         public SignatureContext SignatureContext(ModuleTokenResolver resolver)
78         {
79             return new SignatureContext(Module, resolver);
80         }
81
82         public MetadataReader MetadataReader => Module.PEReader.GetMetadataReader();
83
84         public CorTokenType TokenType => SignatureBuilder.TypeFromToken(Token);
85
86         public uint TokenRid => SignatureBuilder.RidFromToken(Token);
87
88         public Handle Handle => MetadataTokens.Handle((int)Token);
89     }
90 }