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;