2 * Copyright 2016 Microsoft
3 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
5 #include <mono/metadata/class-internals.h>
6 #include <mono/metadata/tabledefs.h>
10 PROP_MARSHAL_INFO = 1, /* MonoMarshalType */
11 PROP_REF_INFO_HANDLE = 2, /* gchandle */
12 PROP_EXCEPTION_DATA = 3, /* MonoErrorBoxed* */
13 PROP_NESTED_CLASSES = 4, /* GList* */
14 PROP_PROPERTY_INFO = 5, /* MonoClassPropertyInfo* */
15 PROP_EVENT_INFO = 6, /* MonoClassEventInfo* */
16 PROP_FIELD_DEF_VALUES = 7, /* MonoFieldDefaultValue* */
17 PROP_DECLSEC_FLAGS = 8 /* guint32 */
20 /* Accessors based on class kind*/
23 * mono_class_get_generic_class:
25 * Return the MonoGenericClass of @klass, which MUST be a generic instance.
28 mono_class_get_generic_class (MonoClass *klass)
30 g_assert (mono_class_is_ginst (klass));
31 return ((MonoClassGenericInst*)klass)->generic_class;
35 * mono_class_try_get_generic_class:
37 * Return the MonoGenericClass if @klass is a ginst, NULL otherwise
40 mono_class_try_get_generic_class (MonoClass *klass)
42 if (mono_class_is_ginst (klass))
43 return ((MonoClassGenericInst*)klass)->generic_class;
48 * mono_class_get_flags:
49 * @klass: the MonoClass to act on
51 * Return the TypeAttributes flags of @klass.
52 * See the TYPE_ATTRIBUTE_* definitions on tabledefs.h for the different values.
54 * Returns: The type flags
57 mono_class_get_flags (MonoClass *klass)
59 switch (klass->class_kind) {
62 return ((MonoClassDef*)klass)->flags;
63 case MONO_CLASS_GINST:
64 return mono_class_get_flags (((MonoClassGenericInst*)klass)->generic_class->container_class);
65 case MONO_CLASS_GPARAM:
66 return TYPE_ATTRIBUTE_PUBLIC;
67 case MONO_CLASS_ARRAY:
68 /* all arrays are marked serializable and sealed, bug #42779 */
69 return TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED | TYPE_ATTRIBUTE_PUBLIC;
70 case MONO_CLASS_POINTER:
71 return TYPE_ATTRIBUTE_CLASS | (mono_class_get_flags (klass->element_class) & TYPE_ATTRIBUTE_VISIBILITY_MASK);
73 g_assert_not_reached ();
77 mono_class_set_flags (MonoClass *klass, guint32 flags)
79 g_assert (klass->class_kind == MONO_CLASS_DEF || klass->class_kind == MONO_CLASS_GTD);
80 ((MonoClassDef*)klass)->flags = flags;
84 * mono_class_get_generic_container:
86 * Return the generic container of KLASS which should be a generic type definition.
89 mono_class_get_generic_container (MonoClass *klass)
91 g_assert (mono_class_is_gtd (klass));
93 return ((MonoClassGtd*)klass)->generic_container;
97 mono_class_try_get_generic_container (MonoClass *klass)
99 if (mono_class_is_gtd (klass))
100 return ((MonoClassGtd*)klass)->generic_container;
106 mono_class_set_generic_container (MonoClass *klass, MonoGenericContainer *container)
108 g_assert (mono_class_is_gtd (klass));
110 ((MonoClassGtd*)klass)->generic_container = container;
114 * mono_class_get_first_method_idx:
116 * Return the table index of the first method for metadata classes.
119 mono_class_get_first_method_idx (MonoClass *klass)
121 g_assert (mono_class_has_static_metadata (klass));
123 return ((MonoClassDef*)klass)->first_method_idx;
127 mono_class_set_first_method_idx (MonoClass *klass, guint32 idx)
129 g_assert (mono_class_has_static_metadata (klass));
131 ((MonoClassDef*)klass)->first_method_idx = idx;
135 mono_class_get_first_field_idx (MonoClass *klass)
137 if (mono_class_is_ginst (klass))
138 return mono_class_get_first_field_idx (mono_class_get_generic_class (klass)->container_class);
140 g_assert (mono_class_has_static_metadata (klass));
142 return ((MonoClassDef*)klass)->first_field_idx;
146 mono_class_set_first_field_idx (MonoClass *klass, guint32 idx)
148 g_assert (mono_class_has_static_metadata (klass));
150 ((MonoClassDef*)klass)->first_field_idx = idx;
154 mono_class_get_method_count (MonoClass *klass)
156 switch (klass->class_kind) {
159 return ((MonoClassDef*)klass)->method_count;
160 case MONO_CLASS_GINST:
161 return mono_class_get_method_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
162 case MONO_CLASS_GPARAM:
164 case MONO_CLASS_ARRAY:
165 return ((MonoClassArray*)klass)->method_count;
166 case MONO_CLASS_POINTER:
169 g_assert_not_reached ();
175 mono_class_set_method_count (MonoClass *klass, guint32 count)
177 switch (klass->class_kind) {
180 ((MonoClassDef*)klass)->method_count = count;
182 case MONO_CLASS_GINST:
184 case MONO_CLASS_GPARAM:
185 case MONO_CLASS_POINTER:
186 g_assert (count == 0);
188 case MONO_CLASS_ARRAY:
189 ((MonoClassArray*)klass)->method_count = count;
192 g_assert_not_reached ();
198 mono_class_get_field_count (MonoClass *klass)
200 switch (klass->class_kind) {
203 return ((MonoClassDef*)klass)->field_count;
204 case MONO_CLASS_GINST:
205 return mono_class_get_field_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
206 case MONO_CLASS_GPARAM:
207 case MONO_CLASS_ARRAY:
208 case MONO_CLASS_POINTER:
211 g_assert_not_reached ();
217 mono_class_set_field_count (MonoClass *klass, guint32 count)
219 switch (klass->class_kind) {
222 ((MonoClassDef*)klass)->field_count = count;
224 case MONO_CLASS_GINST:
226 case MONO_CLASS_GPARAM:
227 case MONO_CLASS_ARRAY:
228 case MONO_CLASS_POINTER:
229 g_assert (count == 0);
232 g_assert_not_reached ();
238 mono_class_get_marshal_info (MonoClass *class)
240 return mono_property_bag_get (&class->infrequent_data, PROP_MARSHAL_INFO);
244 mono_class_set_marshal_info (MonoClass *class, MonoMarshalType *marshal_info)
246 marshal_info->head.tag = PROP_MARSHAL_INFO;
247 mono_property_bag_add (&class->infrequent_data, marshal_info);
251 MonoPropertyBagItem head;
256 mono_class_get_ref_info_handle (MonoClass *class)
258 Uint32Property *prop = mono_property_bag_get (&class->infrequent_data, PROP_REF_INFO_HANDLE);
259 return prop ? prop->value : 0;
263 mono_class_set_ref_info_handle (MonoClass *class, guint32 value)
266 Uint32Property *prop = mono_property_bag_get (&class->infrequent_data, PROP_REF_INFO_HANDLE);
272 Uint32Property *prop = mono_class_alloc (class, sizeof (Uint32Property));
273 prop->head.tag = PROP_REF_INFO_HANDLE;
275 prop = mono_property_bag_add (&class->infrequent_data, prop);
280 MonoPropertyBagItem head;
285 set_pointer_property (MonoClass *klass, InfrequentDataKind property, gpointer value)
287 PointerProperty *prop = mono_class_alloc (klass, sizeof (PointerProperty));
288 prop->head.tag = property;
290 mono_property_bag_add (&klass->infrequent_data, prop);
294 get_pointer_property (MonoClass *klass, InfrequentDataKind property)
296 PointerProperty *prop = (PointerProperty*)mono_property_bag_get (&klass->infrequent_data, property);
297 return prop ? prop->value : NULL;
301 mono_class_get_exception_data (MonoClass *klass)
303 return (MonoErrorBoxed*)get_pointer_property (klass, PROP_EXCEPTION_DATA);
307 mono_class_set_exception_data (MonoClass *klass, MonoErrorBoxed *value)
309 set_pointer_property (klass, PROP_EXCEPTION_DATA, value);
313 mono_class_get_nested_classes_property (MonoClass *klass)
315 return (GList*)get_pointer_property (klass, PROP_NESTED_CLASSES);
319 mono_class_set_nested_classes_property (MonoClass *klass, GList *value)
321 set_pointer_property (klass, PROP_NESTED_CLASSES, value);
324 MonoClassPropertyInfo*
325 mono_class_get_property_info (MonoClass *klass)
327 return mono_property_bag_get (&klass->infrequent_data, PROP_PROPERTY_INFO);
331 mono_class_set_property_info (MonoClass *klass, MonoClassPropertyInfo *info)
333 info->head.tag = PROP_PROPERTY_INFO;
334 mono_property_bag_add (&klass->infrequent_data, info);
338 mono_class_get_event_info (MonoClass *klass)
340 return mono_property_bag_get (&klass->infrequent_data, PROP_EVENT_INFO);
344 mono_class_set_event_info (MonoClass *klass, MonoClassEventInfo *info)
346 info->head.tag = PROP_EVENT_INFO;
347 mono_property_bag_add (&klass->infrequent_data, info);
350 MonoFieldDefaultValue*
351 mono_class_get_field_def_values (MonoClass *klass)
353 return (MonoFieldDefaultValue*)get_pointer_property (klass, PROP_FIELD_DEF_VALUES);
357 mono_class_set_field_def_values (MonoClass *klass, MonoFieldDefaultValue *values)
359 set_pointer_property (klass, PROP_FIELD_DEF_VALUES, values);
363 mono_class_get_declsec_flags (MonoClass *class)
365 Uint32Property *prop = mono_property_bag_get (&class->infrequent_data, PROP_DECLSEC_FLAGS);
366 return prop ? prop->value : 0;
370 mono_class_set_declsec_flags (MonoClass *class, guint32 value)
372 Uint32Property *prop = mono_class_alloc (class, sizeof (Uint32Property));
373 prop->head.tag = PROP_DECLSEC_FLAGS;
375 mono_property_bag_add (&class->infrequent_data, prop);
379 mono_class_set_is_com_object (MonoClass *klass)
383 klass->is_com_object = 1;
384 mono_loader_unlock ();