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 /* Accessors based on class kind*/
12 * mono_class_get_generic_class:
14 * Return the MonoGenericClass of @klass, which MUST be a generic instance.
17 mono_class_get_generic_class (MonoClass *klass)
19 g_assert (mono_class_is_ginst (klass));
20 return ((MonoClassGenericInst*)klass)->generic_class;
24 * mono_class_try_get_generic_class:
26 * Return the MonoGenericClass if @klass is a ginst, NULL otherwise
29 mono_class_try_get_generic_class (MonoClass *klass)
31 if (mono_class_is_ginst (klass))
32 return ((MonoClassGenericInst*)klass)->generic_class;
37 * mono_class_get_flags:
38 * @klass: the MonoClass to act on
40 * Return the TypeAttributes flags of @klass.
41 * See the TYPE_ATTRIBUTE_* definitions on tabledefs.h for the different values.
43 * Returns: The type flags
46 mono_class_get_flags (MonoClass *klass)
48 switch (klass->class_kind) {
51 return ((MonoClassDef*)klass)->flags;
52 case MONO_CLASS_GINST:
53 return mono_class_get_flags (((MonoClassGenericInst*)klass)->generic_class->container_class);
54 case MONO_CLASS_GPARAM:
55 return TYPE_ATTRIBUTE_PUBLIC;
56 case MONO_CLASS_ARRAY:
57 /* all arrays are marked serializable and sealed, bug #42779 */
58 return TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED | TYPE_ATTRIBUTE_PUBLIC;
59 case MONO_CLASS_POINTER:
60 return TYPE_ATTRIBUTE_CLASS | (mono_class_get_flags (klass->element_class) & TYPE_ATTRIBUTE_VISIBILITY_MASK);
62 g_assert_not_reached ();
66 mono_class_set_flags (MonoClass *klass, guint32 flags)
68 g_assert (klass->class_kind == MONO_CLASS_DEF || klass->class_kind == MONO_CLASS_GTD);
69 ((MonoClassDef*)klass)->flags = flags;
73 * mono_class_get_generic_container:
75 * Return the generic container of KLASS which should be a generic type definition.
78 mono_class_get_generic_container (MonoClass *klass)
80 g_assert (mono_class_is_gtd (klass));
82 return ((MonoClassGtd*)klass)->generic_container;
86 mono_class_try_get_generic_container (MonoClass *klass)
88 if (mono_class_is_gtd (klass))
89 return ((MonoClassGtd*)klass)->generic_container;
95 mono_class_set_generic_container (MonoClass *klass, MonoGenericContainer *container)
97 g_assert (mono_class_is_gtd (klass));
99 ((MonoClassGtd*)klass)->generic_container = container;
103 * mono_class_get_first_method_idx:
105 * Return the table index of the first method for metadata classes.
108 mono_class_get_first_method_idx (MonoClass *klass)
110 g_assert (mono_class_has_static_metadata (klass));
112 return ((MonoClassDef*)klass)->first_method_idx;
116 mono_class_set_first_method_idx (MonoClass *klass, guint32 idx)
118 g_assert (mono_class_has_static_metadata (klass));
120 ((MonoClassDef*)klass)->first_method_idx = idx;
124 mono_class_get_first_field_idx (MonoClass *klass)
126 if (mono_class_is_ginst (klass))
127 return mono_class_get_first_field_idx (mono_class_get_generic_class (klass)->container_class);
129 g_assert (mono_class_has_static_metadata (klass));
131 return ((MonoClassDef*)klass)->first_field_idx;
135 mono_class_set_first_field_idx (MonoClass *klass, guint32 idx)
137 g_assert (mono_class_has_static_metadata (klass));
139 ((MonoClassDef*)klass)->first_field_idx = idx;
143 mono_class_get_method_count (MonoClass *klass)
145 switch (klass->class_kind) {
148 return ((MonoClassDef*)klass)->method_count;
149 case MONO_CLASS_GINST:
150 return mono_class_get_method_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
151 case MONO_CLASS_GPARAM:
153 case MONO_CLASS_ARRAY:
154 return ((MonoClassArray*)klass)->method_count;
155 case MONO_CLASS_POINTER:
158 g_assert_not_reached ();
164 mono_class_set_method_count (MonoClass *klass, guint32 count)
166 switch (klass->class_kind) {
169 ((MonoClassDef*)klass)->method_count = count;
171 case MONO_CLASS_GINST:
173 case MONO_CLASS_GPARAM:
174 case MONO_CLASS_POINTER:
175 g_assert (count == 0);
177 case MONO_CLASS_ARRAY:
178 ((MonoClassArray*)klass)->method_count = count;
181 g_assert_not_reached ();
187 mono_class_get_field_count (MonoClass *klass)
189 switch (klass->class_kind) {
192 return ((MonoClassDef*)klass)->field_count;
193 case MONO_CLASS_GINST:
194 return mono_class_get_field_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
195 case MONO_CLASS_GPARAM:
196 case MONO_CLASS_ARRAY:
197 case MONO_CLASS_POINTER:
200 g_assert_not_reached ();
206 mono_class_set_field_count (MonoClass *klass, guint32 count)
208 switch (klass->class_kind) {
211 ((MonoClassDef*)klass)->field_count = count;
213 case MONO_CLASS_GINST:
215 case MONO_CLASS_GPARAM:
216 case MONO_CLASS_ARRAY:
217 case MONO_CLASS_POINTER:
218 g_assert (count == 0);
221 g_assert_not_reached ();