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>
9 enum InfrequentDataKind {
10 PROP_MARSHAL_INFO = 1, /* MonoMarshalType */
11 PROP_EXT = 2, /* MonoClassExt */
14 /* Accessors based on class kind*/
17 * mono_class_get_generic_class:
19 * Return the MonoGenericClass of @klass, which MUST be a generic instance.
22 mono_class_get_generic_class (MonoClass *klass)
24 g_assert (mono_class_is_ginst (klass));
25 return ((MonoClassGenericInst*)klass)->generic_class;
29 * mono_class_try_get_generic_class:
31 * Return the MonoGenericClass if @klass is a ginst, NULL otherwise
34 mono_class_try_get_generic_class (MonoClass *klass)
36 if (mono_class_is_ginst (klass))
37 return ((MonoClassGenericInst*)klass)->generic_class;
42 * mono_class_get_flags:
43 * @klass: the MonoClass to act on
45 * Return the TypeAttributes flags of @klass.
46 * See the TYPE_ATTRIBUTE_* definitions on tabledefs.h for the different values.
48 * Returns: The type flags
51 mono_class_get_flags (MonoClass *klass)
53 switch (klass->class_kind) {
56 return ((MonoClassDef*)klass)->flags;
57 case MONO_CLASS_GINST:
58 return mono_class_get_flags (((MonoClassGenericInst*)klass)->generic_class->container_class);
59 case MONO_CLASS_GPARAM:
60 return TYPE_ATTRIBUTE_PUBLIC;
61 case MONO_CLASS_ARRAY:
62 /* all arrays are marked serializable and sealed, bug #42779 */
63 return TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED | TYPE_ATTRIBUTE_PUBLIC;
64 case MONO_CLASS_POINTER:
65 return TYPE_ATTRIBUTE_CLASS | (mono_class_get_flags (klass->element_class) & TYPE_ATTRIBUTE_VISIBILITY_MASK);
67 g_assert_not_reached ();
71 mono_class_set_flags (MonoClass *klass, guint32 flags)
73 g_assert (klass->class_kind == MONO_CLASS_DEF || klass->class_kind == MONO_CLASS_GTD);
74 ((MonoClassDef*)klass)->flags = flags;
78 * mono_class_get_generic_container:
80 * Return the generic container of KLASS which should be a generic type definition.
83 mono_class_get_generic_container (MonoClass *klass)
85 g_assert (mono_class_is_gtd (klass));
87 return ((MonoClassGtd*)klass)->generic_container;
91 mono_class_try_get_generic_container (MonoClass *klass)
93 if (mono_class_is_gtd (klass))
94 return ((MonoClassGtd*)klass)->generic_container;
100 mono_class_set_generic_container (MonoClass *klass, MonoGenericContainer *container)
102 g_assert (mono_class_is_gtd (klass));
104 ((MonoClassGtd*)klass)->generic_container = container;
108 * mono_class_get_first_method_idx:
110 * Return the table index of the first method for metadata classes.
113 mono_class_get_first_method_idx (MonoClass *klass)
115 g_assert (mono_class_has_static_metadata (klass));
117 return ((MonoClassDef*)klass)->first_method_idx;
121 mono_class_set_first_method_idx (MonoClass *klass, guint32 idx)
123 g_assert (mono_class_has_static_metadata (klass));
125 ((MonoClassDef*)klass)->first_method_idx = idx;
129 mono_class_get_first_field_idx (MonoClass *klass)
131 if (mono_class_is_ginst (klass))
132 return mono_class_get_first_field_idx (mono_class_get_generic_class (klass)->container_class);
134 g_assert (mono_class_has_static_metadata (klass));
136 return ((MonoClassDef*)klass)->first_field_idx;
140 mono_class_set_first_field_idx (MonoClass *klass, guint32 idx)
142 g_assert (mono_class_has_static_metadata (klass));
144 ((MonoClassDef*)klass)->first_field_idx = idx;
148 mono_class_get_method_count (MonoClass *klass)
150 switch (klass->class_kind) {
153 return ((MonoClassDef*)klass)->method_count;
154 case MONO_CLASS_GINST:
155 return mono_class_get_method_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
156 case MONO_CLASS_GPARAM:
158 case MONO_CLASS_ARRAY:
159 return ((MonoClassArray*)klass)->method_count;
160 case MONO_CLASS_POINTER:
163 g_assert_not_reached ();
169 mono_class_set_method_count (MonoClass *klass, guint32 count)
171 switch (klass->class_kind) {
174 ((MonoClassDef*)klass)->method_count = count;
176 case MONO_CLASS_GINST:
178 case MONO_CLASS_GPARAM:
179 case MONO_CLASS_POINTER:
180 g_assert (count == 0);
182 case MONO_CLASS_ARRAY:
183 ((MonoClassArray*)klass)->method_count = count;
186 g_assert_not_reached ();
192 mono_class_get_field_count (MonoClass *klass)
194 switch (klass->class_kind) {
197 return ((MonoClassDef*)klass)->field_count;
198 case MONO_CLASS_GINST:
199 return mono_class_get_field_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
200 case MONO_CLASS_GPARAM:
201 case MONO_CLASS_ARRAY:
202 case MONO_CLASS_POINTER:
205 g_assert_not_reached ();
211 mono_class_set_field_count (MonoClass *klass, guint32 count)
213 switch (klass->class_kind) {
216 ((MonoClassDef*)klass)->field_count = count;
218 case MONO_CLASS_GINST:
220 case MONO_CLASS_GPARAM:
221 case MONO_CLASS_ARRAY:
222 case MONO_CLASS_POINTER:
223 g_assert (count == 0);
226 g_assert_not_reached ();
232 mono_class_get_marshal_info (MonoClass *class)
234 return mono_property_bag_get (&class->infrequent_data, PROP_MARSHAL_INFO);
238 mono_class_set_marshal_info (MonoClass *class, MonoMarshalType *marshal_info)
240 marshal_info->head.tag = PROP_MARSHAL_INFO;
241 mono_property_bag_add (&class->infrequent_data, marshal_info);
245 mono_class_get_ext (MonoClass *class)
247 return mono_property_bag_get (&class->infrequent_data, PROP_EXT);
251 mono_class_set_ext (MonoClass *class, MonoClassExt *ext)
253 ext->head.tag = PROP_EXT;
254 mono_property_bag_add (&class->infrequent_data, ext);