Merge pull request #1588 from BrzVlad/feature-aot-wbarrier
[mono.git] / mcs / class / corlib / ReferenceSources / Type.cs
1 //
2 // Type.cs
3 //
4 // Authors:
5 //      Marek Safar  <marek.safar@gmail.com>
6 //
7 // Copyright (C) 2015 Xamarin Inc (http://www.xamarin.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System.Reflection;
30 using System.Runtime.CompilerServices;
31 using System.Runtime.InteropServices;
32
33 namespace System
34 {
35         partial class Type : MemberInfo
36         {
37                 internal RuntimeTypeHandle _impl;
38
39                 #region Requires stack backtracing fixes in unmanaged type_from_name
40
41                 [MethodImplAttribute(MethodImplOptions.InternalCall)]
42                 static extern Type internal_from_name (string name, bool throwOnError, bool ignoreCase);
43
44                 public static Type GetType(string typeName)
45                 {
46                         if (typeName == null)
47                                 throw new ArgumentNullException ("TypeName");
48
49                         return internal_from_name (typeName, false, false);
50                 }
51
52                 public static Type GetType(string typeName, bool throwOnError)
53                 {
54                         if (typeName == null)
55                                 throw new ArgumentNullException ("TypeName");
56
57                         Type type = internal_from_name (typeName, throwOnError, false);
58                         if (throwOnError && type == null)
59                                 throw new TypeLoadException ("Error loading '" + typeName + "'");
60
61                         return type;
62                 }
63
64                 public static Type GetType(string typeName, bool throwOnError, bool ignoreCase)
65                 {
66                         if (typeName == null)
67                                 throw new ArgumentNullException ("TypeName");
68
69                         Type t = internal_from_name (typeName, throwOnError, ignoreCase);
70                         if (throwOnError && t == null)
71                                 throw new TypeLoadException ("Error loading '" + typeName + "'");
72
73                         return t;
74                 }
75
76                 #endregion
77
78                 // TODO: Merge with internal_from_name
79                 public static Type ReflectionOnlyGetType (string typeName, 
80                                                           bool throwIfNotFound, 
81                                                           bool ignoreCase)
82                 {
83                         if (typeName == null)
84                                 throw new ArgumentNullException ("typeName");
85                         int idx = typeName.IndexOf (',');
86                         if (idx < 0 || idx == 0 || idx == typeName.Length - 1)
87                                 throw new ArgumentException ("Assembly qualifed type name is required", "typeName");
88                         string an = typeName.Substring (idx + 1);
89                         Assembly a;
90                         try {
91                                 a = Assembly.ReflectionOnlyLoad (an);
92                         } catch {
93                                 if (throwIfNotFound)
94                                         throw;
95                                 return null;
96                         }
97                         return a.GetType (typeName.Substring (0, idx), throwIfNotFound, ignoreCase);
98                 }
99
100                 internal virtual Type InternalResolve ()
101                 {
102                         return UnderlyingSystemType;
103                 }
104
105                 internal virtual bool IsUserType {
106                         get {
107                                 return true;
108                         }
109                 }
110
111                 internal virtual MethodInfo GetMethod (MethodInfo fromNoninstanciated)
112                 {
113                         throw new System.InvalidOperationException ("can only be called in generic type");
114                 }
115
116                 internal virtual ConstructorInfo GetConstructor (ConstructorInfo fromNoninstanciated)
117                 {
118                         throw new System.InvalidOperationException ("can only be called in generic type");
119                 }
120
121                 internal virtual FieldInfo GetField (FieldInfo fromNoninstanciated)
122                 {
123                         throw new System.InvalidOperationException ("can only be called in generic type");
124                 }
125
126                 public static Type GetTypeFromHandle (RuntimeTypeHandle handle)
127                 {
128                         if (handle.Value == IntPtr.Zero)
129                                 // This is not consistent with the other GetXXXFromHandle methods, but
130                                 // MS.NET seems to do this
131                                 return null;
132
133                         return internal_from_handle (handle.Value);
134                 }
135
136                 [MethodImplAttribute(MethodImplOptions.InternalCall)]
137                 static extern Type internal_from_handle (IntPtr handle);
138         }
139 }