3 * Copyright 2016 Microsoft
4 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
6 #include <mono/metadata/class-internals.h>
7 #include <mono/metadata/tabledefs.h>
11 PROP_MARSHAL_INFO = 1, /* MonoMarshalType */
12 PROP_REF_INFO_HANDLE = 2, /* gchandle */
13 PROP_EXCEPTION_DATA = 3, /* MonoErrorBoxed* */
14 PROP_NESTED_CLASSES = 4, /* GList* */
15 PROP_PROPERTY_INFO = 5, /* MonoClassPropertyInfo* */
16 PROP_EVENT_INFO = 6, /* MonoClassEventInfo* */
17 PROP_FIELD_DEF_VALUES = 7, /* MonoFieldDefaultValue* */
18 PROP_DECLSEC_FLAGS = 8 /* guint32 */
21 /* Accessors based on class kind*/
24 * mono_class_get_generic_class:
26 * Return the MonoGenericClass of @klass, which MUST be a generic instance.
29 mono_class_get_generic_class (MonoClass *klass)
31 g_assert (mono_class_is_ginst (klass));
32 return ((MonoClassGenericInst*)klass)->generic_class;
36 * mono_class_try_get_generic_class:
38 * Return the MonoGenericClass if @klass is a ginst, NULL otherwise
41 mono_class_try_get_generic_class (MonoClass *klass)
43 if (mono_class_is_ginst (klass))
44 return ((MonoClassGenericInst*)klass)->generic_class;
49 * mono_class_get_flags:
50 * @klass: the MonoClass to act on
52 * Return the TypeAttributes flags of @klass.
53 * See the TYPE_ATTRIBUTE_* definitions on tabledefs.h for the different values.
55 * Returns: The type flags
58 mono_class_get_flags (MonoClass *klass)
60 switch (klass->class_kind) {
63 return ((MonoClassDef*)klass)->flags;
64 case MONO_CLASS_GINST:
65 return mono_class_get_flags (((MonoClassGenericInst*)klass)->generic_class->container_class);
66 case MONO_CLASS_GPARAM:
67 return TYPE_ATTRIBUTE_PUBLIC;
68 case MONO_CLASS_ARRAY:
69 /* all arrays are marked serializable and sealed, bug #42779 */
70 return TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED | TYPE_ATTRIBUTE_PUBLIC;
71 case MONO_CLASS_POINTER:
72 return TYPE_ATTRIBUTE_CLASS | (mono_class_get_flags (klass->element_class) & TYPE_ATTRIBUTE_VISIBILITY_MASK);
74 g_assert_not_reached ();
78 mono_class_set_flags (MonoClass *klass, guint32 flags)
80 g_assert (klass->class_kind == MONO_CLASS_DEF || klass->class_kind == MONO_CLASS_GTD);
81 ((MonoClassDef*)klass)->flags = flags;
85 * mono_class_get_generic_container:
87 * Return the generic container of KLASS which should be a generic type definition.
90 mono_class_get_generic_container (MonoClass *klass)
92 g_assert (mono_class_is_gtd (klass));
94 return ((MonoClassGtd*)klass)->generic_container;
98 mono_class_try_get_generic_container (MonoClass *klass)
100 if (mono_class_is_gtd (klass))
101 return ((MonoClassGtd*)klass)->generic_container;
107 mono_class_set_generic_container (MonoClass *klass, MonoGenericContainer *container)
109 g_assert (mono_class_is_gtd (klass));
111 ((MonoClassGtd*)klass)->generic_container = container;
115 * mono_class_get_first_method_idx:
117 * Return the table index of the first method for metadata classes.
120 mono_class_get_first_method_idx (MonoClass *klass)
122 g_assert (mono_class_has_static_metadata (klass));
124 return ((MonoClassDef*)klass)->first_method_idx;
128 mono_class_set_first_method_idx (MonoClass *klass, guint32 idx)
130 g_assert (mono_class_has_static_metadata (klass));
132 ((MonoClassDef*)klass)->first_method_idx = idx;
136 mono_class_get_first_field_idx (MonoClass *klass)
138 if (mono_class_is_ginst (klass))
139 return mono_class_get_first_field_idx (mono_class_get_generic_class (klass)->container_class);
141 g_assert (mono_class_has_static_metadata (klass));
143 return ((MonoClassDef*)klass)->first_field_idx;
147 mono_class_set_first_field_idx (MonoClass *klass, guint32 idx)
149 g_assert (mono_class_has_static_metadata (klass));
151 ((MonoClassDef*)klass)->first_field_idx = idx;
155 mono_class_get_method_count (MonoClass *klass)
157 switch (klass->class_kind) {
160 return ((MonoClassDef*)klass)->method_count;
161 case MONO_CLASS_GINST:
162 return mono_class_get_method_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
163 case MONO_CLASS_GPARAM:
165 case MONO_CLASS_ARRAY:
166 return ((MonoClassArray*)klass)->method_count;
167 case MONO_CLASS_POINTER:
170 g_assert_not_reached ();
176 mono_class_set_method_count (MonoClass *klass, guint32 count)
178 switch (klass->class_kind) {
181 ((MonoClassDef*)klass)->method_count = count;
183 case MONO_CLASS_GINST:
185 case MONO_CLASS_GPARAM:
186 case MONO_CLASS_POINTER:
187 g_assert (count == 0);
189 case MONO_CLASS_ARRAY:
190 ((MonoClassArray*)klass)->method_count = count;
193 g_assert_not_reached ();
199 mono_class_get_field_count (MonoClass *klass)
201 switch (klass->class_kind) {
204 return ((MonoClassDef*)klass)->field_count;
205 case MONO_CLASS_GINST:
206 return mono_class_get_field_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
207 case MONO_CLASS_GPARAM:
208 case MONO_CLASS_ARRAY:
209 case MONO_CLASS_POINTER:
212 g_assert_not_reached ();
218 mono_class_set_field_count (MonoClass *klass, guint32 count)
220 switch (klass->class_kind) {
223 ((MonoClassDef*)klass)->field_count = count;
225 case MONO_CLASS_GINST:
227 case MONO_CLASS_GPARAM:
228 case MONO_CLASS_ARRAY:
229 case MONO_CLASS_POINTER:
230 g_assert (count == 0);
233 g_assert_not_reached ();
239 mono_class_get_marshal_info (MonoClass *class)
241 return mono_property_bag_get (&class->infrequent_data, PROP_MARSHAL_INFO);
245 mono_class_set_marshal_info (MonoClass *class, MonoMarshalType *marshal_info)
247 marshal_info->head.tag = PROP_MARSHAL_INFO;
248 mono_property_bag_add (&class->infrequent_data, marshal_info);
252 MonoPropertyBagItem head;
257 mono_class_get_ref_info_handle (MonoClass *class)
259 Uint32Property *prop = mono_property_bag_get (&class->infrequent_data, PROP_REF_INFO_HANDLE);
260 return prop ? prop->value : 0;
264 mono_class_set_ref_info_handle (MonoClass *class, guint32 value)
267 Uint32Property *prop = mono_property_bag_get (&class->infrequent_data, PROP_REF_INFO_HANDLE);
273 Uint32Property *prop = mono_class_alloc (class, sizeof (Uint32Property));
274 prop->head.tag = PROP_REF_INFO_HANDLE;
276 prop = mono_property_bag_add (&class->infrequent_data, prop);
281 MonoPropertyBagItem head;
286 set_pointer_property (MonoClass *klass, InfrequentDataKind property, gpointer value)
288 PointerProperty *prop = mono_class_alloc (klass, sizeof (PointerProperty));
289 prop->head.tag = property;
291 mono_property_bag_add (&klass->infrequent_data, prop);
295 get_pointer_property (MonoClass *klass, InfrequentDataKind property)
297 PointerProperty *prop = (PointerProperty*)mono_property_bag_get (&klass->infrequent_data, property);
298 return prop ? prop->value : NULL;
302 mono_class_get_exception_data (MonoClass *klass)
304 return (MonoErrorBoxed*)get_pointer_property (klass, PROP_EXCEPTION_DATA);
308 mono_class_set_exception_data (MonoClass *klass, MonoErrorBoxed *value)
310 set_pointer_property (klass, PROP_EXCEPTION_DATA, value);
314 mono_class_get_nested_classes_property (MonoClass *klass)
316 return (GList*)get_pointer_property (klass, PROP_NESTED_CLASSES);
320 mono_class_set_nested_classes_property (MonoClass *klass, GList *value)
322 set_pointer_property (klass, PROP_NESTED_CLASSES, value);
325 MonoClassPropertyInfo*
326 mono_class_get_property_info (MonoClass *klass)
328 return mono_property_bag_get (&klass->infrequent_data, PROP_PROPERTY_INFO);
332 mono_class_set_property_info (MonoClass *klass, MonoClassPropertyInfo *info)
334 info->head.tag = PROP_PROPERTY_INFO;
335 mono_property_bag_add (&klass->infrequent_data, info);
339 mono_class_get_event_info (MonoClass *klass)
341 return mono_property_bag_get (&klass->infrequent_data, PROP_EVENT_INFO);
345 mono_class_set_event_info (MonoClass *klass, MonoClassEventInfo *info)
347 info->head.tag = PROP_EVENT_INFO;
348 mono_property_bag_add (&klass->infrequent_data, info);
351 MonoFieldDefaultValue*
352 mono_class_get_field_def_values (MonoClass *klass)
354 return (MonoFieldDefaultValue*)get_pointer_property (klass, PROP_FIELD_DEF_VALUES);
358 mono_class_set_field_def_values (MonoClass *klass, MonoFieldDefaultValue *values)
360 set_pointer_property (klass, PROP_FIELD_DEF_VALUES, values);
364 mono_class_get_declsec_flags (MonoClass *class)
366 Uint32Property *prop = mono_property_bag_get (&class->infrequent_data, PROP_DECLSEC_FLAGS);
367 return prop ? prop->value : 0;
371 mono_class_set_declsec_flags (MonoClass *class, guint32 value)
373 Uint32Property *prop = mono_class_alloc (class, sizeof (Uint32Property));
374 prop->head.tag = PROP_DECLSEC_FLAGS;
376 mono_property_bag_add (&class->infrequent_data, prop);
380 mono_class_set_is_com_object (MonoClass *klass)
384 klass->is_com_object = 1;
385 mono_loader_unlock ();