[metadata] Define getters for MonoClass fields (#6652)

* [configure.ac] Add --enable-checked-build=private_types option

  The idea is that when private_types is turned on, we will hide the definitions
  of various structs in Mono and only allow access via getter/setter
  methods.

  If private_types is off, those same getters would be static inline functions
  and also the struct definition would be visible (to allow for incremental
  conversion of existing code).

* [metadata] Move _MonoClass definition to class-private-definition.h

* [metadata] Define a getter for every MonoClass field

  in a checked build, the getters are just declared in class-internals.h and
  defined in class-accessors.h

  in a non-checked build, the getters are static inline functions in class-internals.h

  For a field foo of type FooType define
      FooType m_class_get_foo (MonoClass *klass) { return klass->foo; }

  The exceptions are fields that are embedded structs, e.g. MonoType byval_arg,
  for those we return a pointer to the field instead of a copy:
      MonoType * m_class_get_byval_arg (MonoClass *klass) { return &klass->byval_arg; }

* [metadata] Rename MonoClass boolean getters to use is/has names

  instead of the string m_class_get_fieldname pattern

  - m_class_is_inited
  - m_class_is_size_inited
  - m_class_is_valuetype
  - m_class_is_enumtype
  - m_class_is_blittable
  - m_class_is_unicode
  - m_class_was_typebuilder
  - m_class_is_ghcimpl
  - m_class_has_finalize
  - m_class_is_delegate
  - m_class_is_gc_descr_inited
  - m_class_has_cctor
  - m_class_has_references
  - m_class_has_static_refs
  - m_class_has_no_special_static_fields
  - m_class_is_com_object
  - m_class_is_interfaces_inited
  - m_class_is_simd_type
  - m_class_is_has_finalize_inited
  - m_class_is_fields_inited
  - m_class_has_failure

* [metadata] (class-internals.h) Use m_class_get_ getters

* [metadata] (class-inlines.h) Use m_class_get_ getters

* [metadata] (class-accessors.c) Use m_class_get_ getters; setters not done

  The setters are not converted.
  Ultimately, I think that will sort itself out - a few of them are only used
  from SRE and from MonoClass construction - we will eventually provide setters
  for just two places and hide them elsewhere.
This commit is contained in:
Aleksey Kliger (λgeek) 2018-02-07 13:01:19 -05:00 коммит произвёл GitHub
Родитель c1fd4b064d
Коммит 766bf49afb
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
9 изменённых файлов: 379 добавлений и 205 удалений

Просмотреть файл

@ -4428,7 +4428,7 @@ fi
AM_CONDITIONAL([ENABLE_COOP], [test x$with_cooperative_gc != xno])
AC_ARG_ENABLE(checked_build, [ --enable-checked-build=LIST To enable checked build (expensive asserts), configure with a comma-separated LIST of checked build modules and then include that same list in the environment variable MONO_CHECK_MODE at runtime. Recognized checked build modules: all, gc, metadata, thread],[
AC_ARG_ENABLE(checked_build, [ --enable-checked-build=LIST To enable checked build (expensive asserts), configure with a comma-separated LIST of checked build modules and then include that same list in the environment variable MONO_CHECK_MODE at runtime. Recognized checked build modules: all, gc, metadata, thread, private_types],[
if test x$enable_checked_build != x ; then
AC_DEFINE(ENABLE_CHECKED_BUILD,1,[Enable checked build])
@ -4441,6 +4441,7 @@ AC_ARG_ENABLE(checked_build, [ --enable-checked-build=LIST To enable check
eval "mono_checked_build_test_enable_gc='yes'"
eval "mono_checked_build_test_enable_metadata='yes'"
eval "mono_checked_build_test_enable_thread='yes'"
eval "mono_checked_build_test_enable_private_types='yes'"
fi
if test "x$mono_checked_build_test_enable_gc" = "xyes"; then
@ -4455,6 +4456,9 @@ AC_ARG_ENABLE(checked_build, [ --enable-checked-build=LIST To enable check
AC_DEFINE(ENABLE_CHECKED_BUILD_THREAD, 1, [Enable thread checked build])
fi
if test "x$mono_checked_build_test_enable_private_types" = "xyes"; then
AC_DEFINE(ENABLE_CHECKED_BUILD_PRIVATE_TYPES, 1, [Enable private types checked build])
fi
], [])
AC_CHECK_HEADER([malloc.h],

Просмотреть файл

@ -120,10 +120,12 @@ common_sources = \
attach.c \
cil-coff.h \
class.c \
class-getters.h \
class-init.h \
class-init.c \
class-internals.h \
class-inlines.h \
class-private-definition.h \
class-accessors.c \
cominterop.c \
cominterop.h \

Просмотреть файл

@ -6,7 +6,11 @@
#include <config.h>
#include <mono/metadata/class-internals.h>
#include <mono/metadata/tabledefs.h>
#ifdef MONO_CLASS_DEF_PRIVATE
#define REALLY_INCLUDE_CLASS_DEF 1
#include <mono/metadata/class-private-definition.h>
#undef REALLY_INCLUDE_CLASS_DEF
#endif
typedef enum {
PROP_MARSHAL_INFO = 1, /* MonoMarshalType */
@ -31,7 +35,7 @@ MonoGenericClass*
mono_class_get_generic_class (MonoClass *klass)
{
g_assert (mono_class_is_ginst (klass));
return ((MonoClassGenericInst*)klass)->generic_class;
return m_classgenericinst_get_generic_class ((MonoClassGenericInst*)klass);
}
/*
@ -43,7 +47,7 @@ MonoGenericClass*
mono_class_try_get_generic_class (MonoClass *klass)
{
if (mono_class_is_ginst (klass))
return ((MonoClassGenericInst*)klass)->generic_class;
return m_classgenericinst_get_generic_class ((MonoClassGenericInst*)klass);
return NULL;
}
@ -56,19 +60,19 @@ mono_class_try_get_generic_class (MonoClass *klass)
guint32
mono_class_get_flags (MonoClass *klass)
{
switch (klass->class_kind) {
switch (m_class_get_class_kind (klass)) {
case MONO_CLASS_DEF:
case MONO_CLASS_GTD:
return ((MonoClassDef*)klass)->flags;
return m_classdef_get_flags ((MonoClassDef*)klass);
case MONO_CLASS_GINST:
return mono_class_get_flags (((MonoClassGenericInst*)klass)->generic_class->container_class);
return mono_class_get_flags (m_classgenericinst_get_generic_class ((MonoClassGenericInst*)klass)->container_class);
case MONO_CLASS_GPARAM:
return TYPE_ATTRIBUTE_PUBLIC;
case MONO_CLASS_ARRAY:
/* all arrays are marked serializable and sealed, bug #42779 */
return TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED | TYPE_ATTRIBUTE_PUBLIC;
case MONO_CLASS_POINTER:
return TYPE_ATTRIBUTE_CLASS | (mono_class_get_flags (klass->element_class) & TYPE_ATTRIBUTE_VISIBILITY_MASK);
return TYPE_ATTRIBUTE_CLASS | (mono_class_get_flags (m_class_get_element_class (klass)) & TYPE_ATTRIBUTE_VISIBILITY_MASK);
}
g_assert_not_reached ();
}
@ -76,7 +80,7 @@ mono_class_get_flags (MonoClass *klass)
void
mono_class_set_flags (MonoClass *klass, guint32 flags)
{
g_assert (klass->class_kind == MONO_CLASS_DEF || klass->class_kind == MONO_CLASS_GTD);
g_assert (m_class_get_class_kind (klass) == MONO_CLASS_DEF || m_class_get_class_kind (klass) == MONO_CLASS_GTD);
((MonoClassDef*)klass)->flags = flags;
}
@ -90,14 +94,14 @@ mono_class_get_generic_container (MonoClass *klass)
{
g_assert (mono_class_is_gtd (klass));
return ((MonoClassGtd*)klass)->generic_container;
return m_classgtd_get_generic_container ((MonoClassGtd*)klass);
}
MonoGenericContainer*
mono_class_try_get_generic_container (MonoClass *klass)
{
if (mono_class_is_gtd (klass))
return ((MonoClassGtd*)klass)->generic_container;
return m_classgtd_get_generic_container ((MonoClassGtd*)klass);
return NULL;
}
@ -120,7 +124,7 @@ mono_class_get_first_method_idx (MonoClass *klass)
{
g_assert (mono_class_has_static_metadata (klass));
return ((MonoClassDef*)klass)->first_method_idx;
return m_classdef_get_first_method_idx ((MonoClassDef*)klass);
}
void
@ -139,7 +143,7 @@ mono_class_get_first_field_idx (MonoClass *klass)
g_assert (mono_class_has_static_metadata (klass));
return ((MonoClassDef*)klass)->first_field_idx;
return m_classdef_get_first_field_idx ((MonoClassDef*)klass);
}
void
@ -153,16 +157,16 @@ mono_class_set_first_field_idx (MonoClass *klass, guint32 idx)
guint32
mono_class_get_method_count (MonoClass *klass)
{
switch (klass->class_kind) {
switch (m_class_get_class_kind (klass)) {
case MONO_CLASS_DEF:
case MONO_CLASS_GTD:
return ((MonoClassDef*)klass)->method_count;
return m_classdef_get_method_count ((MonoClassDef*)klass);
case MONO_CLASS_GINST:
return mono_class_get_method_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
return mono_class_get_method_count (m_classgenericinst_get_generic_class ((MonoClassGenericInst*)klass)->container_class);
case MONO_CLASS_GPARAM:
return 0;
case MONO_CLASS_ARRAY:
return ((MonoClassArray*)klass)->method_count;
return m_classarray_get_method_count ((MonoClassArray*)klass);
case MONO_CLASS_POINTER:
return 0;
default:
@ -174,7 +178,7 @@ mono_class_get_method_count (MonoClass *klass)
void
mono_class_set_method_count (MonoClass *klass, guint32 count)
{
switch (klass->class_kind) {
switch (m_class_get_class_kind (klass)) {
case MONO_CLASS_DEF:
case MONO_CLASS_GTD:
((MonoClassDef*)klass)->method_count = count;
@ -197,12 +201,12 @@ mono_class_set_method_count (MonoClass *klass, guint32 count)
guint32
mono_class_get_field_count (MonoClass *klass)
{
switch (klass->class_kind) {
switch (m_class_get_class_kind (klass)) {
case MONO_CLASS_DEF:
case MONO_CLASS_GTD:
return ((MonoClassDef*)klass)->field_count;
return m_classdef_get_field_count ((MonoClassDef*)klass);
case MONO_CLASS_GINST:
return mono_class_get_field_count (((MonoClassGenericInst*)klass)->generic_class->container_class);
return mono_class_get_field_count (m_classgenericinst_get_generic_class ((MonoClassGenericInst*)klass)->container_class);
case MONO_CLASS_GPARAM:
case MONO_CLASS_ARRAY:
case MONO_CLASS_POINTER:
@ -216,7 +220,7 @@ mono_class_get_field_count (MonoClass *klass)
void
mono_class_set_field_count (MonoClass *klass, guint32 count)
{
switch (klass->class_kind) {
switch (m_class_get_class_kind (klass)) {
case MONO_CLASS_DEF:
case MONO_CLASS_GTD:
((MonoClassDef*)klass)->field_count = count;
@ -237,14 +241,14 @@ mono_class_set_field_count (MonoClass *klass, guint32 count)
MonoMarshalType*
mono_class_get_marshal_info (MonoClass *klass)
{
return mono_property_bag_get (&klass->infrequent_data, PROP_MARSHAL_INFO);
return mono_property_bag_get (m_class_get_infrequent_data (klass), PROP_MARSHAL_INFO);
}
void
mono_class_set_marshal_info (MonoClass *klass, MonoMarshalType *marshal_info)
{
marshal_info->head.tag = PROP_MARSHAL_INFO;
mono_property_bag_add (&klass->infrequent_data, marshal_info);
mono_property_bag_add (m_class_get_infrequent_data (klass), marshal_info);
}
typedef struct {
@ -255,7 +259,7 @@ typedef struct {
guint32
mono_class_get_ref_info_handle (MonoClass *klass)
{
Uint32Property *prop = mono_property_bag_get (&klass->infrequent_data, PROP_REF_INFO_HANDLE);
Uint32Property *prop = mono_property_bag_get (m_class_get_infrequent_data (klass), PROP_REF_INFO_HANDLE);
return prop ? prop->value : 0;
}
@ -263,7 +267,7 @@ guint32
mono_class_set_ref_info_handle (MonoClass *klass, guint32 value)
{
if (!value) {
Uint32Property *prop = mono_property_bag_get (&klass->infrequent_data, PROP_REF_INFO_HANDLE);
Uint32Property *prop = mono_property_bag_get (m_class_get_infrequent_data (klass), PROP_REF_INFO_HANDLE);
if (prop)
prop->value = 0;
return 0;
@ -272,7 +276,7 @@ mono_class_set_ref_info_handle (MonoClass *klass, guint32 value)
Uint32Property *prop = mono_class_alloc (klass, sizeof (Uint32Property));
prop->head.tag = PROP_REF_INFO_HANDLE;
prop->value = value;
prop = mono_property_bag_add (&klass->infrequent_data, prop);
prop = mono_property_bag_add (m_class_get_infrequent_data (klass), prop);
return prop->value;
}
@ -287,13 +291,13 @@ set_pointer_property (MonoClass *klass, InfrequentDataKind property, gpointer va
PointerProperty *prop = mono_class_alloc (klass, sizeof (PointerProperty));
prop->head.tag = property;
prop->value = value;
mono_property_bag_add (&klass->infrequent_data, prop);
mono_property_bag_add (m_class_get_infrequent_data (klass), prop);
}
static gpointer
get_pointer_property (MonoClass *klass, InfrequentDataKind property)
{
PointerProperty *prop = (PointerProperty*)mono_property_bag_get (&klass->infrequent_data, property);
PointerProperty *prop = (PointerProperty*)mono_property_bag_get (m_class_get_infrequent_data (klass), property);
return prop ? prop->value : NULL;
}
@ -324,27 +328,27 @@ mono_class_set_nested_classes_property (MonoClass *klass, GList *value)
MonoClassPropertyInfo*
mono_class_get_property_info (MonoClass *klass)
{
return mono_property_bag_get (&klass->infrequent_data, PROP_PROPERTY_INFO);
return mono_property_bag_get (m_class_get_infrequent_data (klass), PROP_PROPERTY_INFO);
}
void
mono_class_set_property_info (MonoClass *klass, MonoClassPropertyInfo *info)
{
info->head.tag = PROP_PROPERTY_INFO;
mono_property_bag_add (&klass->infrequent_data, info);
mono_property_bag_add (m_class_get_infrequent_data (klass), info);
}
MonoClassEventInfo*
mono_class_get_event_info (MonoClass *klass)
{
return mono_property_bag_get (&klass->infrequent_data, PROP_EVENT_INFO);
return mono_property_bag_get (m_class_get_infrequent_data (klass), PROP_EVENT_INFO);
}
void
mono_class_set_event_info (MonoClass *klass, MonoClassEventInfo *info)
{
info->head.tag = PROP_EVENT_INFO;
mono_property_bag_add (&klass->infrequent_data, info);
mono_property_bag_add (m_class_get_infrequent_data (klass), info);
}
MonoFieldDefaultValue*
@ -362,7 +366,7 @@ mono_class_set_field_def_values (MonoClass *klass, MonoFieldDefaultValue *values
guint32
mono_class_get_declsec_flags (MonoClass *klass)
{
Uint32Property *prop = mono_property_bag_get (&klass->infrequent_data, PROP_DECLSEC_FLAGS);
Uint32Property *prop = mono_property_bag_get (m_class_get_infrequent_data (klass), PROP_DECLSEC_FLAGS);
return prop ? prop->value : 0;
}
@ -372,7 +376,7 @@ mono_class_set_declsec_flags (MonoClass *klass, guint32 value)
Uint32Property *prop = mono_class_alloc (klass, sizeof (Uint32Property));
prop->head.tag = PROP_DECLSEC_FLAGS;
prop->value = value;
mono_property_bag_add (&klass->infrequent_data, prop);
mono_property_bag_add (m_class_get_infrequent_data (klass), prop);
}
void
@ -389,7 +393,7 @@ MonoType*
mono_class_gtd_get_canonical_inst (MonoClass *klass)
{
g_assert (mono_class_is_gtd (klass));
return &((MonoClassGtd*)klass)->canonical_inst;
return m_classgtd_get_canonical_inst ((MonoClassGtd*)klass);
}
typedef struct {
@ -407,15 +411,21 @@ mono_class_set_weak_bitmap (MonoClass *klass, int nbits, gsize *bits)
info->bits = bits;
info->head.tag = PROP_WEAK_BITMAP;
mono_property_bag_add (&klass->infrequent_data, info);
mono_property_bag_add (m_class_get_infrequent_data (klass), info);
}
gsize*
mono_class_get_weak_bitmap (MonoClass *klass, int *nbits)
{
WeakBitmapData *prop = mono_property_bag_get (&klass->infrequent_data, PROP_WEAK_BITMAP);
WeakBitmapData *prop = mono_property_bag_get (m_class_get_infrequent_data (klass), PROP_WEAK_BITMAP);
g_assert (prop);
*nbits = prop->nbits;
return prop->bits;
}
#ifdef MONO_CLASS_DEF_PRIVATE
#define MONO_CLASS_GETTER(funcname, rettype, optref, argtype, fieldname) rettype funcname (argtype *klass) { return optref klass-> fieldname ; }
#include "class-getters.h"
#undef MONO_CLASS_GETTER
#endif /* MONO_CLASS_DEF_PRIVATE */

Просмотреть файл

@ -0,0 +1,102 @@
/*
* \file Definitions of getters for the fields of struct _MonoClass
*
* Copyright 2018 Microsoft
* Licensed under the MIT license. See LICENSE file in the project root for full license information.
*/
/* No include guards - this file is meant to be included multiple times.
* Before including the file define the following macros:
* MONO_CLASS_GETTER(funcname, rettype, optref, argtype, fieldname)
*/
/* Accessors for _MonoClass fields. */
MONO_CLASS_GETTER(m_class_get_element_class, MonoClass *, , MonoClass, element_class)
MONO_CLASS_GETTER(m_class_get_cast_class, MonoClass *, , MonoClass, cast_class)
MONO_CLASS_GETTER(m_class_get_supertypes, MonoClass **, , MonoClass, supertypes)
MONO_CLASS_GETTER(m_class_get_idepth, guint16, , MonoClass, idepth)
MONO_CLASS_GETTER(m_class_get_rank, guint8, , MonoClass, rank)
MONO_CLASS_GETTER(m_class_get_instance_size, int, , MonoClass, instance_size)
MONO_CLASS_GETTER(m_class_is_inited, gboolean, , MonoClass, inited)
MONO_CLASS_GETTER(m_class_is_size_inited, gboolean, , MonoClass, size_inited)
MONO_CLASS_GETTER(m_class_is_valuetype, gboolean, , MonoClass, valuetype)
MONO_CLASS_GETTER(m_class_is_enumtype, gboolean, , MonoClass, enumtype)
MONO_CLASS_GETTER(m_class_is_blittable, gboolean, , MonoClass, blittable)
MONO_CLASS_GETTER(m_class_is_unicode, gboolean, , MonoClass, unicode)
MONO_CLASS_GETTER(m_class_was_typebuilder, gboolean, , MonoClass, wastypebuilder)
MONO_CLASS_GETTER(m_class_is_array_special_interface, gboolean, , MonoClass, is_array_special_interface)
MONO_CLASS_GETTER(m_class_get_min_align, guint8, , MonoClass, min_align)
MONO_CLASS_GETTER(m_class_get_packing_size, guint, , MonoClass, packing_size)
MONO_CLASS_GETTER(m_class_is_ghcimpl, gboolean, , MonoClass, ghcimpl)
MONO_CLASS_GETTER(m_class_has_finalize, gboolean, , MonoClass, has_finalize)
#ifndef DISABLE_REMOTING
MONO_CLASS_GETTER(m_class_get_marshalbyref, guint, , MonoClass, marshalbyref)
MONO_CLASS_GETTER(m_class_get_contextbound, guint, , MonoClass, contextbound)
#endif
MONO_CLASS_GETTER(m_class_is_delegate, gboolean, , MonoClass, delegate)
MONO_CLASS_GETTER(m_class_is_gc_descr_inited, gboolean, , MonoClass, gc_descr_inited)
MONO_CLASS_GETTER(m_class_has_cctor, gboolean, , MonoClass, has_cctor)
MONO_CLASS_GETTER(m_class_has_references, gboolean, , MonoClass, has_references)
MONO_CLASS_GETTER(m_class_has_static_refs, gboolean, , MonoClass, has_static_refs)
MONO_CLASS_GETTER(m_class_has_no_special_static_fields, gboolean, , MonoClass, no_special_static_fields)
MONO_CLASS_GETTER(m_class_is_com_object, gboolean, , MonoClass, is_com_object)
MONO_CLASS_GETTER(m_class_is_nested_classes_inited, gboolean, , MonoClass, nested_classes_inited)
MONO_CLASS_GETTER(m_class_get_class_kind, guint, , MonoClass, class_kind)
MONO_CLASS_GETTER(m_class_is_interfaces_inited, gboolean, , MonoClass, interfaces_inited)
MONO_CLASS_GETTER(m_class_is_simd_type, gboolean, , MonoClass, simd_type)
MONO_CLASS_GETTER(m_class_is_has_finalize_inited, gboolean, , MonoClass, has_finalize_inited)
MONO_CLASS_GETTER(m_class_is_fields_inited, gboolean, , MonoClass, fields_inited)
MONO_CLASS_GETTER(m_class_has_failure, gboolean, , MonoClass, has_failure)
MONO_CLASS_GETTER(m_class_has_weak_fields, gboolean, , MonoClass, has_weak_fields)
MONO_CLASS_GETTER(m_class_get_parent, MonoClass *, , MonoClass, parent)
MONO_CLASS_GETTER(m_class_get_nested_in, MonoClass *, , MonoClass, nested_in)
MONO_CLASS_GETTER(m_class_get_image, MonoImage *, , MonoClass, image)
MONO_CLASS_GETTER(m_class_get_name, const char *, , MonoClass, name)
MONO_CLASS_GETTER(m_class_get_name_space, const char *, , MonoClass, name_space)
MONO_CLASS_GETTER(m_class_get_type_token, guint32, , MonoClass, type_token)
MONO_CLASS_GETTER(m_class_get_vtable_size, int, , MonoClass, vtable_size)
MONO_CLASS_GETTER(m_class_get_interface_count, guint16, , MonoClass, interface_count)
MONO_CLASS_GETTER(m_class_get_interface_id, guint32, , MonoClass, interface_id)
MONO_CLASS_GETTER(m_class_get_max_interface_id, guint32, , MonoClass, max_interface_id)
MONO_CLASS_GETTER(m_class_get_interface_offsets_count, guint16, , MonoClass, interface_offsets_count)
MONO_CLASS_GETTER(m_class_get_interfaces_packed, MonoClass **, , MonoClass, interfaces_packed)
MONO_CLASS_GETTER(m_class_get_interface_offsets_packed, guint16 *, , MonoClass, interface_offsets_packed)
MONO_CLASS_GETTER(m_class_get_interface_bitmap, guint8 *, , MonoClass, interface_bitmap)
MONO_CLASS_GETTER(m_class_get_interfaces, MonoClass **, , MonoClass, interfaces)
MONO_CLASS_GETTER(m_class_get_sizes, union _MonoClassSizes, , MonoClass, sizes)
MONO_CLASS_GETTER(m_class_get_fields, MonoClassField *, , MonoClass, fields)
MONO_CLASS_GETTER(m_class_get_methods, MonoMethod **, , MonoClass, methods)
MONO_CLASS_GETTER(m_class_get_this_arg, MonoType*, &, MonoClass, this_arg)
MONO_CLASS_GETTER(m_class_get_byval_arg, MonoType*, &, MonoClass, byval_arg)
MONO_CLASS_GETTER(m_class_get_gc_descr, MonoGCDescriptor, , MonoClass, gc_descr)
MONO_CLASS_GETTER(m_class_get_runtime_info, MonoClassRuntimeInfo *, , MonoClass, runtime_info)
MONO_CLASS_GETTER(m_class_get_vtable, MonoMethod **, , MonoClass, vtable)
MONO_CLASS_GETTER(m_class_get_infrequent_data, MonoPropertyBag*, &, MonoClass, infrequent_data)
/* Accessors for _MonoClassDef fields. */
MONO_CLASS_GETTER(m_classdef_get_klass, MonoClass*, &, MonoClassDef, klass)
MONO_CLASS_GETTER(m_classdef_get_flags, guint32, , MonoClassDef, flags)
MONO_CLASS_GETTER(m_classdef_get_first_method_idx, guint32, , MonoClassDef, first_method_idx)
MONO_CLASS_GETTER(m_classdef_get_first_field_idx, guint32, , MonoClassDef, first_field_idx)
MONO_CLASS_GETTER(m_classdef_get_method_count, guint32, , MonoClassDef, method_count)
MONO_CLASS_GETTER(m_classdef_get_field_count, guint32, , MonoClassDef, field_count)
MONO_CLASS_GETTER(m_classdef_get_next_class_cache, MonoClass *, , MonoClassDef, next_class_cache)
/* Accessors for _MonoClassGtd fields. */
MONO_CLASS_GETTER(m_classgtd_get_klass, MonoClassDef*, &, MonoClassGtd, klass)
MONO_CLASS_GETTER(m_classgtd_get_generic_container, MonoGenericContainer*, , MonoClassGtd, generic_container)
MONO_CLASS_GETTER(m_classgtd_get_canonical_inst, MonoType*, &, MonoClassGtd, canonical_inst)
/* Accessors for _MonoClassGenericInst fields. */
MONO_CLASS_GETTER(m_classgenericinst_get_klass, MonoClass*, &, MonoClassGenericInst, klass)
MONO_CLASS_GETTER(m_classgenericinst_get_generic_class, MonoGenericClass*, , MonoClassGenericInst, generic_class)
/* Accessors for _MonoClassGenericParam fields. */
MONO_CLASS_GETTER(m_classgenericparam_get_klass, MonoClass*, &, MonoClassGenericParam, klass)
/* Accessors for _MonoClassArray fields. */
MONO_CLASS_GETTER(m_classarray_get_klass, MonoClass*, &, MonoClassArray, klass)
MONO_CLASS_GETTER(m_classarray_get_method_count, guint32, , MonoClassArray, method_count)
/* Accessors for _MonoClassPointer fields. */
MONO_CLASS_GETTER(m_classpointer_get_klass, MonoClass*, &, MonoClassPointer, klass)

Просмотреть файл

@ -12,37 +12,37 @@
static inline gboolean
mono_class_is_def (MonoClass *klass)
{
return klass->class_kind == MONO_CLASS_DEF;
return m_class_get_class_kind (klass) == MONO_CLASS_DEF;
}
static inline gboolean
mono_class_is_gtd (MonoClass *klass)
{
return klass->class_kind == MONO_CLASS_GTD;
return m_class_get_class_kind (klass) == MONO_CLASS_GTD;
}
static inline gboolean
mono_class_is_ginst (MonoClass *klass)
{
return klass->class_kind == MONO_CLASS_GINST;
return m_class_get_class_kind (klass) == MONO_CLASS_GINST;
}
static inline gboolean
mono_class_is_gparam (MonoClass *klass)
{
return klass->class_kind == MONO_CLASS_GPARAM;
return m_class_get_class_kind (klass) == MONO_CLASS_GPARAM;
}
static inline gboolean
mono_class_is_array (MonoClass *klass)
{
return klass->class_kind == MONO_CLASS_ARRAY;
return m_class_get_class_kind (klass) == MONO_CLASS_ARRAY;
}
static inline gboolean
mono_class_is_pointer (MonoClass *klass)
{
return klass->class_kind == MONO_CLASS_POINTER;
return m_class_get_class_kind (klass) == MONO_CLASS_POINTER;
}
static inline gboolean
@ -90,7 +90,7 @@ mono_class_is_public (MonoClass *klass)
static inline gboolean
mono_class_has_static_metadata (MonoClass *klass)
{
return klass->type_token && !klass->image->dynamic && !mono_class_is_ginst (klass);
return m_class_get_type_token (klass) && !m_class_get_image (klass)->dynamic && !mono_class_is_ginst (klass);
}
#endif

Просмотреть файл

@ -15,9 +15,9 @@
#include "mono/utils/mono-error.h"
#include "mono/sgen/gc-internal-agnostic.h"
#define MONO_CLASS_IS_ARRAY(c) ((c)->rank)
#define MONO_CLASS_IS_ARRAY(c) (m_class_get_rank (c))
#define MONO_CLASS_HAS_STATIC_METADATA(klass) ((klass)->type_token && !(klass)->image->dynamic && !mono_class_is_ginst (klass))
#define MONO_CLASS_HAS_STATIC_METADATA(klass) (m_class_get_type_token (klass) && !m_class_get_image (klass)->dynamic && !mono_class_is_ginst (klass))
#define MONO_DEFAULT_SUPERTABLE_SIZE 6
@ -260,167 +260,46 @@ typedef enum {
MONO_CLASS_POINTER, /* pointer of function pointer*/
} MonoTypeKind;
struct _MonoClass {
/* element class for arrays and enum basetype for enums */
MonoClass *element_class;
/* used for subtype checks */
MonoClass *cast_class;
typedef struct _MonoClassDef MonoClassDef;
typedef struct _MonoClassGtd MonoClassGtd;
typedef struct _MonoClassGenericInst MonoClassGenericInst;
typedef struct _MonoClassGenericParam MonoClassGenericParam;
typedef struct _MonoClassArray MonoClassArray;
typedef struct _MonoClassPointer MonoClassPointer;
/* for fast subtype checks */
MonoClass **supertypes;
guint16 idepth;
union _MonoClassSizes {
int class_size; /* size of area for static fields */
int element_size; /* for array types */
int generic_param_token; /* for generic param types, both var and mvar */
};
/* array dimension */
guint8 rank;
int instance_size; /* object instance size */
guint inited : 1;
/* A class contains static and non static data. Static data can be
* of the same type as the class itselfs, but it does not influence
* the instance size of the class. To avoid cyclic calls to
* mono_class_init (from mono_class_instance_size ()) we first
* initialise all non static fields. After that we set size_inited
* to 1, because we know the instance size now. After that we
* initialise all static fields.
*/
/* ALL BITFIELDS SHOULD BE WRITTEN WHILE HOLDING THE LOADER LOCK */
guint size_inited : 1;
guint valuetype : 1; /* derives from System.ValueType */
guint enumtype : 1; /* derives from System.Enum */
guint blittable : 1; /* class is blittable */
guint unicode : 1; /* class uses unicode char when marshalled */
guint wastypebuilder : 1; /* class was created at runtime from a TypeBuilder */
guint is_array_special_interface : 1; /* gtd or ginst of once of the magic interfaces that arrays implement */
/* next byte */
guint8 min_align;
/* next byte */
guint packing_size : 4;
guint ghcimpl : 1; /* class has its own GetHashCode impl */
guint has_finalize : 1; /* class has its own Finalize impl */
#ifndef DISABLE_REMOTING
guint marshalbyref : 1; /* class is a MarshalByRefObject */
guint contextbound : 1; /* class is a ContextBoundObject */
#endif
/* next byte */
guint delegate : 1; /* class is a Delegate */
guint gc_descr_inited : 1; /* gc_descr is initialized */
guint has_cctor : 1; /* class has a cctor */
guint has_references : 1; /* it has GC-tracked references in the instance */
guint has_static_refs : 1; /* it has static fields that are GC-tracked */
guint no_special_static_fields : 1; /* has no thread/context static fields */
/* directly or indirectly derives from ComImport attributed class.
* this means we need to create a proxy for instances of this class
* for COM Interop. set this flag on loading so all we need is a quick check
* during object creation rather than having to traverse supertypes
*/
guint is_com_object : 1;
guint nested_classes_inited : 1; /* Whenever nested_class is initialized */
/* next byte*/
guint class_kind : 3; /* One of the values from MonoTypeKind */
guint interfaces_inited : 1; /* interfaces is initialized */
guint simd_type : 1; /* class is a simd intrinsic type */
guint has_finalize_inited : 1; /* has_finalize is initialized */
guint fields_inited : 1; /* setup_fields () has finished */
guint has_failure : 1; /* See mono_class_get_exception_data () for a MonoErrorBoxed with the details */
guint has_weak_fields : 1; /* class has weak reference fields */
MonoClass *parent;
MonoClass *nested_in;
MonoImage *image;
const char *name;
const char *name_space;
guint32 type_token;
int vtable_size; /* number of slots */
guint16 interface_count;
guint32 interface_id; /* unique inderface id (for interfaces) */
guint32 max_interface_id;
guint16 interface_offsets_count;
MonoClass **interfaces_packed;
guint16 *interface_offsets_packed;
/* enabled only with small config for now: we might want to do it unconditionally */
#ifdef MONO_SMALL_CONFIG
#define COMPRESSED_INTERFACE_BITMAP 1
#endif
guint8 *interface_bitmap;
MonoClass **interfaces;
union {
int class_size; /* size of area for static fields */
int element_size; /* for array types */
int generic_param_token; /* for generic param types, both var and mvar */
} sizes;
#ifdef ENABLE_CHECKED_BUILD_PRIVATE_TYPES
#define MONO_CLASS_DEF_PRIVATE 1
#endif
/*
* Field information: Type and location from object base
*/
MonoClassField *fields;
/* Hide _MonoClass definition in checked build mode to ensure that
* it is only accessed via getter and setter methods.
*/
#ifndef MONO_CLASS_DEF_PRIVATE
#include "class-private-definition.h"
#endif
MonoMethod **methods;
/* used as the type of the this argument and when passing the arg by value */
MonoType this_arg;
MonoType byval_arg;
MonoGCDescriptor gc_descr;
MonoClassRuntimeInfo *runtime_info;
/* Generic vtable. Initialized by a call to mono_class_setup_vtable () */
MonoMethod **vtable;
/* Infrequently used items. See class-accessors.c: InfrequentDataKind for what goes into here. */
MonoPropertyBag infrequent_data;
};
typedef struct {
MonoClass klass;
guint32 flags;
/*
* From the TypeDef table
*/
guint32 first_method_idx;
guint32 first_field_idx;
guint32 method_count, field_count;
/* next element in the class_cache hash list (in MonoImage) */
MonoClass *next_class_cache;
} MonoClassDef;
typedef struct {
MonoClassDef klass;
MonoGenericContainer *generic_container;
/* The canonical GENERICINST where we instantiate a generic type definition with its own generic parameters.*/
/* Suppose we have class T`2<A,B> {...}. canonical_inst is the GTD T`2 applied to A and B. */
MonoType canonical_inst;
} MonoClassGtd;
typedef struct {
MonoClass klass;
MonoGenericClass *generic_class;
} MonoClassGenericInst;
typedef struct {
MonoClass klass;
} MonoClassGenericParam;
typedef struct {
MonoClass klass;
guint32 method_count;
} MonoClassArray;
typedef struct {
MonoClass klass;
} MonoClassPointer;
/* If MonoClass definition is hidden, just declare the getters.
* Otherwise, define them as static inline functions.
*/
#ifdef MONO_CLASS_DEF_PRIVATE
#define MONO_CLASS_GETTER(funcname, rettype, optref, argtype, fieldname) rettype funcname (argtype *klass);
#else
#define MONO_CLASS_GETTER(funcname, rettype, optref, argtype, fieldname) static inline rettype funcname (argtype *klass) { return optref klass-> fieldname ; }
#endif
#include "class-getters.h"
#undef MONO_CLASS_GETTER
#ifdef COMPRESSED_INTERFACE_BITMAP
int mono_compress_bitmap (uint8_t *dest, const uint8_t *bitmap, int size);
@ -429,7 +308,7 @@ int mono_class_interface_match (const uint8_t *bitmap, int id);
#define mono_class_interface_match(bmap,uiid) ((bmap) [(uiid) >> 3] & (1 << ((uiid)&7)))
#endif
#define MONO_CLASS_IMPLEMENTS_INTERFACE(k,uiid) (((uiid) <= (k)->max_interface_id) && mono_class_interface_match ((k)->interface_bitmap, (uiid)))
#define MONO_CLASS_IMPLEMENTS_INTERFACE(k,uiid) (((uiid) <= m_class_get_max_interface_id (k)) && mono_class_interface_match (m_class_get_interface_bitmap (k), (uiid)))
#define MONO_VTABLE_AVAILABLE_GC_BITS 4
@ -439,8 +318,8 @@ int mono_class_interface_match (const uint8_t *bitmap, int id);
#define mono_vtable_is_remote(vtable) (FALSE)
#define mono_vtable_set_is_remote(vtable,enable) do {} while (0)
#else
#define mono_class_is_marshalbyref(klass) ((klass)->marshalbyref)
#define mono_class_is_contextbound(klass) ((klass)->contextbound)
#define mono_class_is_marshalbyref(klass) (m_class_get_marshalbyref (klass))
#define mono_class_is_contextbound(klass) (m_class_get_contextbound (klass))
#define mono_vtable_is_remote(vtable) ((vtable)->remote)
#define mono_vtable_set_is_remote(vtable,enable) do { (vtable)->remote = enable ? 1 : 0; } while (0)
#endif
@ -448,7 +327,7 @@ int mono_class_interface_match (const uint8_t *bitmap, int id);
#ifdef DISABLE_COM
#define mono_class_is_com_object(klass) (FALSE)
#else
#define mono_class_is_com_object(klass) ((klass)->is_com_object)
#define mono_class_is_com_object(klass) (m_class_is_com_object (klass))
#endif
@ -733,16 +612,16 @@ mono_class_setup_supertypes (MonoClass *klass);
static inline gboolean
mono_class_has_parent_fast (MonoClass *klass, MonoClass *parent)
{
return (klass->idepth >= parent->idepth) && (klass->supertypes [parent->idepth - 1] == parent);
return (m_class_get_idepth (klass) >= m_class_get_idepth (parent)) && (m_class_get_supertypes (klass) [m_class_get_idepth (parent) - 1] == parent);
}
static inline gboolean
mono_class_has_parent (MonoClass *klass, MonoClass *parent)
{
if (G_UNLIKELY (!klass->supertypes))
if (G_UNLIKELY (!m_class_get_supertypes (klass)))
mono_class_setup_supertypes (klass);
if (G_UNLIKELY (!parent->supertypes))
if (G_UNLIKELY (!m_class_get_supertypes (parent)))
mono_class_setup_supertypes (parent);
return mono_class_has_parent_fast (klass, parent);

Просмотреть файл

@ -0,0 +1,169 @@
/**
* \file Definitions of struct _MonoClass members
*
* NOTE: This file should NOT be included directly.
*/
#if defined(MONO_CLASS_DEF_PRIVATE) && !defined(REALLY_INCLUDE_CLASS_DEF)
#error struct _MonoClass definition should not be accessed directly
#endif
#ifndef __MONO_METADATA_CLASS_PRIVATE_DEFINITION_H__
#define __MONO_METADATA_CLASS_PRIVATE_DEFINITION_H__
struct _MonoClass {
/* element class for arrays and enum basetype for enums */
MonoClass *element_class;
/* used for subtype checks */
MonoClass *cast_class;
/* for fast subtype checks */
MonoClass **supertypes;
guint16 idepth;
/* array dimension */
guint8 rank;
int instance_size; /* object instance size */
guint inited : 1;
/* A class contains static and non static data. Static data can be
* of the same type as the class itselfs, but it does not influence
* the instance size of the class. To avoid cyclic calls to
* mono_class_init (from mono_class_instance_size ()) we first
* initialise all non static fields. After that we set size_inited
* to 1, because we know the instance size now. After that we
* initialise all static fields.
*/
/* ALL BITFIELDS SHOULD BE WRITTEN WHILE HOLDING THE LOADER LOCK */
guint size_inited : 1;
guint valuetype : 1; /* derives from System.ValueType */
guint enumtype : 1; /* derives from System.Enum */
guint blittable : 1; /* class is blittable */
guint unicode : 1; /* class uses unicode char when marshalled */
guint wastypebuilder : 1; /* class was created at runtime from a TypeBuilder */
guint is_array_special_interface : 1; /* gtd or ginst of once of the magic interfaces that arrays implement */
/* next byte */
guint8 min_align;
/* next byte */
guint packing_size : 4;
guint ghcimpl : 1; /* class has its own GetHashCode impl */
guint has_finalize : 1; /* class has its own Finalize impl */
#ifndef DISABLE_REMOTING
guint marshalbyref : 1; /* class is a MarshalByRefObject */
guint contextbound : 1; /* class is a ContextBoundObject */
#endif
/* next byte */
guint delegate : 1; /* class is a Delegate */
guint gc_descr_inited : 1; /* gc_descr is initialized */
guint has_cctor : 1; /* class has a cctor */
guint has_references : 1; /* it has GC-tracked references in the instance */
guint has_static_refs : 1; /* it has static fields that are GC-tracked */
guint no_special_static_fields : 1; /* has no thread/context static fields */
/* directly or indirectly derives from ComImport attributed class.
* this means we need to create a proxy for instances of this class
* for COM Interop. set this flag on loading so all we need is a quick check
* during object creation rather than having to traverse supertypes
*/
guint is_com_object : 1;
guint nested_classes_inited : 1; /* Whenever nested_class is initialized */
/* next byte*/
guint class_kind : 3; /* One of the values from MonoTypeKind */
guint interfaces_inited : 1; /* interfaces is initialized */
guint simd_type : 1; /* class is a simd intrinsic type */
guint has_finalize_inited : 1; /* has_finalize is initialized */
guint fields_inited : 1; /* setup_fields () has finished */
guint has_failure : 1; /* See mono_class_get_exception_data () for a MonoErrorBoxed with the details */
guint has_weak_fields : 1; /* class has weak reference fields */
MonoClass *parent;
MonoClass *nested_in;
MonoImage *image;
const char *name;
const char *name_space;
guint32 type_token;
int vtable_size; /* number of slots */
guint16 interface_count;
guint32 interface_id; /* unique inderface id (for interfaces) */
guint32 max_interface_id;
guint16 interface_offsets_count;
MonoClass **interfaces_packed;
guint16 *interface_offsets_packed;
guint8 *interface_bitmap;
MonoClass **interfaces;
union _MonoClassSizes sizes;
/*
* Field information: Type and location from object base
*/
MonoClassField *fields;
MonoMethod **methods;
/* used as the type of the this argument and when passing the arg by value */
MonoType this_arg;
MonoType byval_arg;
MonoGCDescriptor gc_descr;
MonoClassRuntimeInfo *runtime_info;
/* Generic vtable. Initialized by a call to mono_class_setup_vtable () */
MonoMethod **vtable;
/* Infrequently used items. See class-accessors.c: InfrequentDataKind for what goes into here. */
MonoPropertyBag infrequent_data;
};
struct _MonoClassDef {
MonoClass klass;
guint32 flags;
/*
* From the TypeDef table
*/
guint32 first_method_idx;
guint32 first_field_idx;
guint32 method_count, field_count;
/* next element in the class_cache hash list (in MonoImage) */
MonoClass *next_class_cache;
};
struct _MonoClassGtd {
MonoClassDef klass;
MonoGenericContainer *generic_container;
/* The canonical GENERICINST where we instantiate a generic type definition with its own generic parameters.*/
/* Suppose we have class T`2<A,B> {...}. canonical_inst is the GTD T`2 applied to A and B. */
MonoType canonical_inst;
};
struct _MonoClassGenericInst {
MonoClass klass;
MonoGenericClass *generic_class;
};
struct _MonoClassGenericParam {
MonoClass klass;
};
struct _MonoClassArray {
MonoClass klass;
guint32 method_count;
};
struct _MonoClassPointer {
MonoClass klass;
};
#endif

Просмотреть файл

@ -13,11 +13,13 @@
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\attach.c" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\cil-coff.h" />
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\class.c" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-getters.h" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-internals.h" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-inlines.h" />
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\class-init.c" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-init.h" />
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\class-accessors.c" />
<ClInclude Include="$(MonosourceLocation)\mono\metadata\class-private-definition.h" />
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\cominterop.c" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\cominterop.h" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\console-io.h" />

Просмотреть файл

@ -28,6 +28,9 @@
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\class.c">
<Filter>Source Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClCompile>
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-getters.h">
<Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClInclude>
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-internals.h">
<Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClInclude>
@ -43,6 +46,9 @@
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-init.h">
<Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClInclude>
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-private-definition.h">
<Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClInclude>
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\cominterop.c">
<Filter>Source Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClCompile>