[marshal] Use MonoClass getters in marshal.c (#7253)

* [runtime] Use getters in IS_MONOTYPE()

* [metadata] Add m_class_offsetof_fieldName accessors

These look like:
```c
intptr_t
m_class_offsetof_someField (void) {
  return MONO_STRUCT_OFFSET (MonoClass, someField);
}
```

When Mono is compiled with the definition of MonoClass
hidden (--enable-checked-build=private_types),
only the function prototypes are available via
mono/metadata/class-abi-details.h
When Mono is compiled without the checked build flag,
the functions are inlined into that header.

* [metadata] Add accessor function mono_class_set_nonblittable

This is needed by mono_marshal_load_type_info ()

* [marshal] Use m_class_get_ getters to access MonoClass fields
This commit is contained in:
Aleksey Kliger (λgeek) 2018-02-27 10:55:16 -05:00 коммит произвёл GitHub
Родитель 2f9b9142cd
Коммит b8da973620
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
9 изменённых файлов: 531 добавлений и 397 удалений

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

@ -282,6 +282,7 @@ common_sources = \
file-mmap.h \
object-offsets.h \
abi-details.h \
class-abi-details.h \
metadata-cross-helpers.c \
seq-points-data.h \
seq-points-data.c \

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

@ -0,0 +1,23 @@
/**
* \file Declarations of MonoClass field offset functions
* Copyright 2018 Microsoft
* Licensed under the MIT license. See LICENSE file in the project root for full license information.
*/
#ifndef __MONO_METADATA_CLASS_ABI_DETAILS_H__
#define __MONO_METADATA_CLASS_ABI_DETAILS_H__
#include <mono/metadata/class-internals.h>
#include <mono/metadata/abi-details.h>
#define MONO_CLASS_GETTER(funcname, rettype, optref, argtype, fieldname) /*nothing*/
#ifdef MONO_CLASS_DEF_PRIVATE
#define MONO_CLASS_OFFSET(funcname, argtype, fieldname) intptr_t funcname (void);
#else
#define MONO_CLASS_OFFSET(funcname, argtype, fieldname) static inline intptr_t funcname (void) { return MONO_STRUCT_OFFSET (argtype, fieldname); }
#endif
#include "class-getters.h"
#undef MONO_CLASS_GETTER
#undef MONO_CLASS_OFFSET
#endif /* __MONO_METADATA_CLASS_ABI_DETAILS_H__ */

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

@ -7,6 +7,7 @@
#include <mono/metadata/class-internals.h>
#include <mono/metadata/tabledefs.h>
#ifdef MONO_CLASS_DEF_PRIVATE
#include <mono/metadata/abi-details.h>
#define REALLY_INCLUDE_CLASS_DEF 1
#include <mono/metadata/class-private-definition.h>
#undef REALLY_INCLUDE_CLASS_DEF
@ -496,8 +497,25 @@ mono_class_set_failure (MonoClass *klass, MonoErrorBoxed *boxed_error)
return TRUE;
}
/**
* mono_class_set_nonblittable:
* \param klass class which will be marked as not blittable.
*
* Mark \c klass as not blittable.
*
* LOCKING: Acquires the loader lock.
*/
void
mono_class_set_nonblittable (MonoClass *klass) {
mono_loader_lock ();
klass->blittable = FALSE;
mono_loader_unlock ();
}
#ifdef MONO_CLASS_DEF_PRIVATE
#define MONO_CLASS_GETTER(funcname, rettype, optref, argtype, fieldname) rettype funcname (argtype *klass) { return optref klass-> fieldname ; }
#define MONO_CLASS_OFFSET(funcname, argtype, fieldname) intptr_t funcname (void) { return MONO_STRUCT_OFFSET (argtype, fieldname); }
#include "class-getters.h"
#undef MONO_CLASS_GETTER
#undef MONO_CLASS_OFFSET
#endif /* MONO_CLASS_DEF_PRIVATE */

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

@ -8,6 +8,8 @@
/* 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)
*
* MONO_CLASS_OFFSET(funcname, argtype, fieldname)
*/
/* Accessors for _MonoClass fields. */
@ -101,3 +103,16 @@ MONO_CLASS_GETTER(m_classarray_get_method_count, guint32, , MonoClassArray, meth
/* Accessors for _MonoClassPointer fields. */
MONO_CLASS_GETTER(m_classpointer_get_klass, MonoClass*, &, MonoClassPointer, klass)
MONO_CLASS_OFFSET(m_class_offsetof_interface_bitmap, MonoClass, interface_bitmap)
MONO_CLASS_OFFSET(m_class_offsetof_byval_arg, MonoClass, byval_arg)
MONO_CLASS_OFFSET(m_class_offsetof_cast_class, MonoClass, cast_class)
MONO_CLASS_OFFSET(m_class_offsetof_element_class, MonoClass, element_class)
MONO_CLASS_OFFSET(m_class_offsetof_idepth, MonoClass, idepth)
MONO_CLASS_OFFSET(m_class_offsetof_instance_size, MonoClass, instance_size)
MONO_CLASS_OFFSET(m_class_offsetof_interface_id, MonoClass, interface_id)
MONO_CLASS_OFFSET(m_class_offsetof_max_interface_id, MonoClass, max_interface_id)
MONO_CLASS_OFFSET(m_class_offsetof_parent, MonoClass, parent)
MONO_CLASS_OFFSET(m_class_offsetof_rank, MonoClass, rank)
MONO_CLASS_OFFSET(m_class_offsetof_sizes, MonoClass, sizes)
MONO_CLASS_OFFSET(m_class_offsetof_supertypes, MonoClass, supertypes)

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

@ -299,8 +299,10 @@ union _MonoClassSizes {
#else
#define MONO_CLASS_GETTER(funcname, rettype, optref, argtype, fieldname) static inline rettype funcname (argtype *klass) { return optref klass-> fieldname ; }
#endif
#define MONO_CLASS_OFFSET(funcname, argtype, fieldname) /*nothing*/
#include "class-getters.h"
#undef MONO_CLASS_GETTER
#undef MONO_CLASS_OFFSET
#ifdef COMPRESSED_INTERFACE_BITMAP
int mono_compress_bitmap (uint8_t *dest, const uint8_t *bitmap, int size);
@ -1408,6 +1410,9 @@ mono_field_resolve_type (MonoClassField *field, MonoError *error);
gboolean
mono_type_has_exceptions (MonoType *type);
void
mono_class_set_nonblittable (MonoClass *klass);
/*Now that everything has been defined, let's include the inline functions */
#include <mono/metadata/class-inlines.h>

Разница между файлами не показана из-за своего большого размера Загрузить разницу

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

@ -741,7 +741,7 @@ mono_domain_get_tls_offset (void);
* encountering instances of user defined subclasses of System.Type.
*/
#define IS_MONOTYPE(obj) (!(obj) || (((MonoObject*)(obj))->vtable->klass->image == mono_defaults.corlib && ((MonoReflectionType*)(obj))->type != NULL))
#define IS_MONOTYPE(obj) (!(obj) || (m_class_get_image (mono_object_class ((obj))) == mono_defaults.corlib && ((MonoReflectionType*)(obj))->type != NULL))
#define IS_MONOTYPE_HANDLE(obj) IS_MONOTYPE (MONO_HANDLE_RAW (obj))

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

@ -148,6 +148,7 @@
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\file-mmap.h" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\object-offsets.h" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\abi-details.h" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-abi-details.h" />
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\metadata-cross-helpers.c" />
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\seq-points-data.h" />
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\seq-points-data.c" />

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

@ -421,6 +421,9 @@
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\abi-details.h">
<Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClInclude>
<ClInclude Include="$(MonoSourceLocation)\mono\metadata\class-abi-details.h">
<Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClInclude>
<ClCompile Include="$(MonoSourceLocation)\mono\metadata\metadata-cross-helpers.c">
<Filter>Source Files$(MonoRuntimeFilterSubFolder)\common</Filter>
</ClCompile>