2 // Wrapper handles for Mono Runtime internal structs
5 // Aleksey Kliger <aleksey@xamarin.com>
6 // Rodrigo Kumpera <kumpera@xamarin.com>
8 // Copyright 2016 Dot net foundation.
9 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
13 using System.Reflection;
14 using System.Runtime.CompilerServices;
18 internal struct RuntimeClassHandle {
19 unsafe RuntimeStructs.MonoClass* value;
21 internal unsafe RuntimeClassHandle (RuntimeStructs.MonoClass* value) {
25 internal unsafe RuntimeClassHandle (IntPtr ptr) {
26 this.value = (RuntimeStructs.MonoClass*) ptr;
29 internal unsafe RuntimeStructs.MonoClass* Value {
33 public override bool Equals (object obj)
35 if (obj == null || GetType () != obj.GetType ())
38 unsafe { return value == ((RuntimeClassHandle)obj).Value; }
41 public override int GetHashCode ()
43 unsafe { return ((IntPtr)value).GetHashCode (); }
46 public bool Equals (RuntimeClassHandle handle)
48 unsafe { return value == handle.Value; }
51 public static bool operator == (RuntimeClassHandle left, Object right)
53 return (right != null) && (right is RuntimeClassHandle) && left.Equals ((RuntimeClassHandle)right);
56 public static bool operator != (RuntimeClassHandle left, Object right)
58 return (right == null) || !(right is RuntimeClassHandle) || !left.Equals ((RuntimeClassHandle)right);
61 public static bool operator == (Object left, RuntimeClassHandle right)
63 return (left != null) && (left is RuntimeClassHandle) && ((RuntimeClassHandle)left).Equals (right);
66 public static bool operator != (Object left, RuntimeClassHandle right)
68 return (left == null) || !(left is RuntimeClassHandle) || !((RuntimeClassHandle)left).Equals (right);
71 [MethodImpl(MethodImplOptions.InternalCall)]
72 internal unsafe extern static IntPtr GetTypeFromClass (RuntimeStructs.MonoClass *klass);
74 internal RuntimeTypeHandle GetTypeHandle ()
76 unsafe { return new RuntimeTypeHandle (GetTypeFromClass (value)); }
80 internal struct RuntimeRemoteClassHandle {
81 unsafe RuntimeStructs.RemoteClass* value;
83 internal unsafe RuntimeRemoteClassHandle (RuntimeStructs.RemoteClass* value)
88 internal RuntimeClassHandle ProxyClass {
91 return new RuntimeClassHandle (value->proxy_class);
97 internal struct RuntimeGenericParamInfoHandle {
98 unsafe RuntimeStructs.GenericParamInfo* value;
100 internal unsafe RuntimeGenericParamInfoHandle (RuntimeStructs.GenericParamInfo* value)
105 internal unsafe RuntimeGenericParamInfoHandle (IntPtr ptr)
107 this.value = (RuntimeStructs.GenericParamInfo*) ptr;
111 internal Type[] Constraints { get { return GetConstraints (); } }
113 internal GenericParameterAttributes Attributes {
116 return (GenericParameterAttributes) value->flags;
121 Type[] GetConstraints () {
122 int n = GetConstraintsCount ();
124 for (int i = 0; i < n; i++) {
126 RuntimeClassHandle c = new RuntimeClassHandle (value->constraints[i]);
127 a[i] = Type.GetTypeFromHandle (c.GetTypeHandle ());
133 int GetConstraintsCount () {
136 RuntimeStructs.MonoClass** p = value->constraints;
137 while (p != null && *p != null) {
145 internal struct RuntimeEventHandle {
148 internal RuntimeEventHandle (IntPtr v)
153 public IntPtr Value {
159 public override bool Equals (object obj)
161 if (obj == null || GetType () != obj.GetType ())
164 return value == ((RuntimeEventHandle)obj).Value;
167 public bool Equals (RuntimeEventHandle handle)
169 return value == handle.Value;
172 public override int GetHashCode ()
174 return value.GetHashCode ();
177 public static bool operator == (RuntimeEventHandle left, RuntimeEventHandle right)
179 return left.Equals (right);
182 public static bool operator != (RuntimeEventHandle left, RuntimeEventHandle right)
184 return !left.Equals (right);
188 internal struct RuntimePropertyHandle {
191 internal RuntimePropertyHandle (IntPtr v)
196 public IntPtr Value {
202 public override bool Equals (object obj)
204 if (obj == null || GetType () != obj.GetType ())
207 return value == ((RuntimePropertyHandle)obj).Value;
210 public bool Equals (RuntimePropertyHandle handle)
212 return value == handle.Value;
215 public override int GetHashCode ()
217 return value.GetHashCode ();
220 public static bool operator == (RuntimePropertyHandle left, RuntimePropertyHandle right)
222 return left.Equals (right);
225 public static bool operator != (RuntimePropertyHandle left, RuntimePropertyHandle right)
227 return !left.Equals (right);
231 internal struct RuntimeGPtrArrayHandle {
232 unsafe RuntimeStructs.GPtrArray* value;
234 internal unsafe RuntimeGPtrArrayHandle (RuntimeStructs.GPtrArray* value)
239 internal unsafe RuntimeGPtrArrayHandle (IntPtr ptr)
241 this.value = (RuntimeStructs.GPtrArray*) ptr;
244 internal int Length {
252 internal IntPtr this[int i] => Lookup (i);
254 internal IntPtr Lookup (int i)
256 if (i >= 0 && i < Length) {
258 return value->data[i];
261 throw new IndexOutOfRangeException ();
264 [MethodImpl(MethodImplOptions.InternalCall)]
265 unsafe extern static void GPtrArrayFree (RuntimeStructs.GPtrArray* value, bool freeSeg);
267 internal static void DestroyAndFree (ref RuntimeGPtrArrayHandle h, bool freeSeg) {
269 GPtrArrayFree (h.value, freeSeg);