зеркало из https://github.com/mono/mono.git
[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:
Родитель
2f9b9142cd
Коммит
b8da973620
|
@ -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>
|
||||
|
|
Загрузка…
Ссылка в новой задаче