Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mono/dis/dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -898,7 +898,7 @@ custom_attr_params (MonoImage *m, MonoMethodSignature* sig, const char* value)
break;
}
case MONO_TYPE_VALUETYPE:
if (mono_class_is_enum (sig->params [i]->data.klass)) {
if (m_class_is_enumtype (sig->params [i]->data.klass)) {
type = mono_class_enum_basetype (sig->params [i]->data.klass)->type;
goto handle_enum;
} else {
Expand Down
5 changes: 4 additions & 1 deletion mono/metadata/appdomain.c
Original file line number Diff line number Diff line change
Expand Up @@ -575,9 +575,11 @@ void
mono_domain_set_config (MonoDomain *domain, const char *base_dir, const char *config_file_name)
{
HANDLE_FUNCTION_ENTER ();
MONO_ENTER_GC_UNSAFE;
ERROR_DECL (error);
mono_domain_set_config_checked (domain, base_dir, config_file_name, error);
mono_error_cleanup (error);
MONO_EXIT_GC_UNSAFE;
HANDLE_FUNCTION_RETURN ();
}

Expand Down Expand Up @@ -896,8 +898,9 @@ mono_domain_set (MonoDomain *domain, gboolean force)
if (!force && domain->state == MONO_APPDOMAIN_UNLOADED)
return FALSE;

MONO_ENTER_GC_UNSAFE;
mono_domain_set_internal (domain);

MONO_EXIT_GC_UNSAFE;
return TRUE;
}

Expand Down
6 changes: 3 additions & 3 deletions mono/metadata/class-init.c
Original file line number Diff line number Diff line change
Expand Up @@ -2078,8 +2078,8 @@ foreach_override (gpointer key, gpointer value, gpointer user_data) {
MonoClass *override_class = mono_method_get_class (override);

printf (" Method '%s.%s:%s' has override '%s.%s:%s'\n",
mono_class_get_namespace (method_class), mono_class_get_name (method_class), mono_method_get_name (method),
mono_class_get_namespace (override_class), mono_class_get_name (override_class), mono_method_get_name (override));
m_class_get_name_space (method_class), m_class_get_name (method_class), mono_method_get_name (method),
m_class_get_name_space (override_class), m_class_get_name (override_class), mono_method_get_name (override));
}
static void
print_overrides (GHashTable *override_map, const char *message) {
Expand Down Expand Up @@ -3810,7 +3810,7 @@ mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_
gpointer iter = NULL;
guint32 first_field_idx = mono_class_get_first_field_idx (p);

while ((field = mono_class_get_fields (p, &iter))) {
while ((field = mono_class_get_fields_internal (p, &iter))) {
guint32 field_idx = first_field_idx + (field - p->fields);
if (MONO_TYPE_IS_REFERENCE (field->type) && mono_assembly_is_weak_field (p->image, field_idx + 1)) {
has_weak_fields = TRUE;
Expand Down
3 changes: 3 additions & 0 deletions mono/metadata/class-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -1209,6 +1209,9 @@ gboolean mono_is_corlib_image (MonoImage *image);
MonoType*
mono_field_get_type_checked (MonoClassField *field, MonoError *error);

MonoClassField*
mono_class_get_fields_internal (MonoClass* klass, gpointer *iter);

MonoClassField*
mono_class_get_fields_lazy (MonoClass* klass, gpointer *iter);

Expand Down
53 changes: 45 additions & 8 deletions mono/metadata/class.c
Original file line number Diff line number Diff line change
Expand Up @@ -4188,7 +4188,11 @@ mono_class_get_image (MonoClass *klass)
MonoClass*
mono_class_get_element_class (MonoClass *klass)
{
return m_class_get_element_class (klass);
MonoClass *result;
MONO_ENTER_GC_UNSAFE;
result = m_class_get_element_class (klass);
MONO_EXIT_GC_UNSAFE;
return result;
}

/**
Expand All @@ -4203,7 +4207,11 @@ mono_class_get_element_class (MonoClass *klass)
gboolean
mono_class_is_valuetype (MonoClass *klass)
{
return m_class_is_valuetype (klass);
gboolean result;
MONO_ENTER_GC_UNSAFE;
result = m_class_is_valuetype (klass);
MONO_EXIT_GC_UNSAFE;
return result;
}

/**
Expand All @@ -4217,7 +4225,11 @@ mono_class_is_valuetype (MonoClass *klass)
gboolean
mono_class_is_enum (MonoClass *klass)
{
return m_class_is_enumtype (klass);
gboolean result;
MONO_ENTER_GC_UNSAFE;
result = m_class_is_enumtype (klass);
MONO_EXIT_GC_UNSAFE;
return result;
}

/**
Expand Down Expand Up @@ -4251,7 +4263,11 @@ mono_class_enum_basetype (MonoClass *klass)
MonoClass*
mono_class_get_parent (MonoClass *klass)
{
return m_class_get_parent (klass);
MonoClass *result;
MONO_ENTER_GC_UNSAFE;
result = m_class_get_parent (klass);
MONO_EXIT_GC_UNSAFE;
return result;
}

/**
Expand Down Expand Up @@ -4291,7 +4307,11 @@ mono_class_get_rank (MonoClass *klass)
const char*
mono_class_get_name (MonoClass *klass)
{
return m_class_get_name (klass);
const char *result;
MONO_ENTER_GC_UNSAFE;
result = m_class_get_name (klass);
MONO_EXIT_GC_UNSAFE;
return result;
}

/**
Expand All @@ -4303,7 +4323,10 @@ mono_class_get_name (MonoClass *klass)
const char*
mono_class_get_namespace (MonoClass *klass)
{
return m_class_get_name_space (klass);
const char *result;
MONO_ENTER_GC_UNSAFE;
result = m_class_get_name_space (klass);
MONO_EXIT_GC_UNSAFE;
}

/**
Expand Down Expand Up @@ -4416,6 +4439,16 @@ mono_class_num_events (MonoClass *klass)
*/
MonoClassField*
mono_class_get_fields (MonoClass* klass, gpointer *iter)
{
MonoClassField *result;
MONO_ENTER_GC_UNSAFE;
result = mono_class_get_fields_internal (klass, iter);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not m_class_get_fields?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure what you're asking:

  • I'm trying to keep the m_class_get_* namespace just for simple field accessors
  • There's already m_class_get_fields - it directly returns a pointer to an array of MonoClassField elements; mono_class_get_fields is an iterator.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah okay. I noticed this inconsistency: usually it's something like

  • mono_class_get_namespace -> GC_UNSAFE wrapper + m_class_get_name_space

here the pattern is different

  • mono_class_get_fields -> GC_UNSAFE wrapper + mono_class_get_fields_internal ???

I guess the problem is that mono_class_get_fields should be really mono_class_get_fielditerator or something like that, but I understand we can't easily change that name. With your explanation it makes sense.

MONO_EXIT_GC_UNSAFE;
return result;
}

MonoClassField*
mono_class_get_fields_internal (MonoClass *klass, gpointer *iter)
{
MonoClassField* field;
if (!iter)
Expand Down Expand Up @@ -4669,7 +4702,11 @@ mono_class_get_nested_types (MonoClass* klass, gpointer *iter)
mono_bool
mono_class_is_delegate (MonoClass *klass)
{
return m_class_is_delegate (klass);
mono_bool result;
MONO_ENTER_GC_UNSAFE;
result = m_class_is_delegate (klass);
MONO_EXIT_GC_UNSAFE;
return result;
}

/**
Expand Down Expand Up @@ -5671,7 +5708,7 @@ mono_class_is_valid_enum (MonoClass *klass)
if (!mono_class_is_auto_layout (klass))
return FALSE;

while ((field = mono_class_get_fields (klass, &iter))) {
while ((field = mono_class_get_fields_internal (klass, &iter))) {
if (!(field->type->attrs & FIELD_ATTRIBUTE_STATIC)) {
if (found_base_field)
return FALSE;
Expand Down
8 changes: 8 additions & 0 deletions mono/metadata/class.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,18 +141,22 @@ mono_type_get_underlying_type (MonoType *type);
MONO_API MonoImage*
mono_class_get_image (MonoClass *klass);

MONO_RT_EXTERNAL_ONLY
MONO_API MonoClass*
mono_class_get_element_class (MonoClass *klass);

MONO_RT_EXTERNAL_ONLY
MONO_API mono_bool
mono_class_is_valuetype (MonoClass *klass);

MONO_RT_EXTERNAL_ONLY
MONO_API mono_bool
mono_class_is_enum (MonoClass *klass);

MONO_API MonoType*
mono_class_enum_basetype (MonoClass *klass);

MONO_RT_EXTERNAL_ONLY
MONO_API MonoClass*
mono_class_get_parent (MonoClass *klass);

Expand All @@ -165,9 +169,11 @@ mono_class_get_rank (MonoClass *klass);
MONO_API uint32_t
mono_class_get_flags (MonoClass *klass);

MONO_RT_EXTERNAL_ONLY
MONO_API const char*
mono_class_get_name (MonoClass *klass);

MONO_RT_EXTERNAL_ONLY
MONO_API const char*
mono_class_get_namespace (MonoClass *klass);

Expand All @@ -192,6 +198,7 @@ mono_class_num_properties (MonoClass *klass);
MONO_API int
mono_class_num_events (MonoClass *klass);

MONO_RT_EXTERNAL_ONLY
MONO_API MonoClassField*
mono_class_get_fields (MonoClass* klass, void **iter);

Expand All @@ -210,6 +217,7 @@ mono_class_get_interfaces (MonoClass* klass, void **iter);
MONO_API MonoClass*
mono_class_get_nested_types (MonoClass* klass, void **iter);

MONO_RT_EXTERNAL_ONLY
MONO_API mono_bool
mono_class_is_delegate (MonoClass* klass);

Expand Down
4 changes: 2 additions & 2 deletions mono/metadata/debug-helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -1139,7 +1139,7 @@ objval_describe (MonoClass *klass, const char *addr)
for (p = klass; p != NULL; p = p->parent) {
gpointer iter = NULL;
int printed_header = FALSE;
while ((field = mono_class_get_fields (p, &iter))) {
while ((field = mono_class_get_fields_internal (p, &iter))) {
if (field->type->attrs & (FIELD_ATTRIBUTE_STATIC | FIELD_ATTRIBUTE_HAS_FIELD_RVA))
continue;

Expand Down Expand Up @@ -1210,7 +1210,7 @@ mono_class_describe_statics (MonoClass* klass)

for (p = klass; p != NULL; p = p->parent) {
gpointer iter = NULL;
while ((field = mono_class_get_fields (p, &iter))) {
while ((field = mono_class_get_fields_internal (p, &iter))) {
if (field->type->attrs & FIELD_ATTRIBUTE_LITERAL)
continue;
if (!(field->type->attrs & (FIELD_ATTRIBUTE_STATIC | FIELD_ATTRIBUTE_HAS_FIELD_RVA)))
Expand Down
1 change: 1 addition & 0 deletions mono/metadata/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -922,6 +922,7 @@ mono_domain_unset (void)
void
mono_domain_set_internal_with_options (MonoDomain *domain, gboolean migrate_exception)
{
MONO_REQ_GC_UNSAFE_MODE;
MonoInternalThread *thread;

if (mono_domain_get () == domain)
Expand Down
23 changes: 23 additions & 0 deletions mono/metadata/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ static void mono_reference_queue_cleanup (void);
static void reference_queue_clear_for_domain (MonoDomain *domain);
static void mono_runtime_do_background_work (void);

static MonoReferenceQueue* mono_gc_reference_queue_new_internal (mono_reference_queue_callback callback);
static gboolean mono_gc_reference_queue_add_internal (MonoReferenceQueue *queue, MonoObject *obj, void *user_data);


static MonoThreadInfoWaitRet
guarded_wait (MonoThreadHandle *thread_handle, guint32 timeout, gboolean alertable)
Expand Down Expand Up @@ -1220,6 +1223,16 @@ reference_queue_clear_for_domain (MonoDomain *domain)
*/
MonoReferenceQueue*
mono_gc_reference_queue_new (mono_reference_queue_callback callback)
{
MonoReferenceQueue *result;
MONO_ENTER_GC_UNSAFE;
result = mono_gc_reference_queue_new_internal (callback);
MONO_EXIT_GC_UNSAFE;
return result;
}

MonoReferenceQueue*
mono_gc_reference_queue_new_internal (mono_reference_queue_callback callback)
{
MonoReferenceQueue *res = g_new0 (MonoReferenceQueue, 1);
res->callback = callback;
Expand All @@ -1246,6 +1259,16 @@ mono_gc_reference_queue_new (mono_reference_queue_callback callback)
*/
gboolean
mono_gc_reference_queue_add (MonoReferenceQueue *queue, MonoObject *obj, void *user_data)
{
gboolean result;
MONO_ENTER_GC_UNSAFE;
result = mono_gc_reference_queue_add_internal (queue, obj, user_data);
MONO_EXIT_GC_UNSAFE;
return result;
}

gboolean
mono_gc_reference_queue_add_internal (MonoReferenceQueue *queue, MonoObject *obj, void *user_data)
{
RefQueueEntry *entry;
if (queue->should_be_deleted)
Expand Down
6 changes: 3 additions & 3 deletions mono/metadata/icall.c
Original file line number Diff line number Diff line change
Expand Up @@ -1083,7 +1083,7 @@ ves_icall_System_ValueType_InternalGetHashCode (MonoObject *this_obj, MonoArray
* This way, we can avoid costly reflection operations in managed code.
*/
iter = NULL;
while ((field = mono_class_get_fields (klass, &iter))) {
while ((field = mono_class_get_fields_internal (klass, &iter))) {
if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)
continue;
if (mono_field_is_deleted (field))
Expand Down Expand Up @@ -1159,7 +1159,7 @@ ves_icall_System_ValueType_Equals (MonoObject *this_obj, MonoObject *that, MonoA
* managed code.
*/
iter = NULL;
while ((field = mono_class_get_fields (klass, &iter))) {
while ((field = mono_class_get_fields_internal (klass, &iter))) {
if (field->type->attrs & FIELD_ATTRIBUTE_STATIC)
continue;
if (mono_field_is_deleted (field))
Expand Down Expand Up @@ -3842,7 +3842,7 @@ ves_icall_System_Enum_GetEnumValuesAndNames (MonoReflectionTypeHandle type, Mono
return_val_if_nok (error, FALSE);

iter = NULL;
while ((field = mono_class_get_fields (enumc, &iter))) {
while ((field = mono_class_get_fields_internal (enumc, &iter))) {
get_enum_field(domain, names, values, base_type, field, &j, &previous_value, &sorted, error);
if (!is_ok (error))
break;
Expand Down
31 changes: 27 additions & 4 deletions mono/metadata/loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@ static MonoNativeTlsKey loader_lock_nest_id;
static void dllmap_cleanup (void);
static void cached_module_cleanup(void);

static void dllmap_insert_global (const char *dll, const char *func, const char *tdll, const char *tfunc);
static void dllmap_insert_image (MonoImage *assembly, const char *dll, const char *func, const char *tdll, const char *tfun);


/* Class lazy loading functions */
GENERATE_GET_CLASS_WITH_CACHE (appdomain_unloaded_exception, "System", "AppDomainUnloadedException")

Expand Down Expand Up @@ -1050,12 +1054,23 @@ mono_dllmap_lookup (MonoImage *assembly, const char *dll, const char* func, cons
*/
void
mono_dllmap_insert (MonoImage *assembly, const char *dll, const char *func, const char *tdll, const char *tfunc)
{
if (!assembly)
dllmap_insert_global (dll, func, tdll, tfunc);
else {
MONO_ENTER_GC_UNSAFE;
dllmap_insert_image (assembly, dll, func, tdll, tfunc);
MONO_EXIT_GC_UNSAFE;
}
}

void
dllmap_insert_global (const char *dll, const char *func, const char *tdll, const char *tfunc)
{
MonoDllMap *entry;

mono_loader_init ();
mono_loader_init ();

if (!assembly) {
entry = (MonoDllMap *)g_malloc0 (sizeof (MonoDllMap));
entry->dll = dll? g_strdup (dll): NULL;
entry->target = tdll? g_strdup (tdll): NULL;
Expand All @@ -1066,7 +1081,16 @@ mono_dllmap_insert (MonoImage *assembly, const char *dll, const char *func, cons
entry->next = global_dll_map;
global_dll_map = entry;
global_loader_data_unlock ();
} else {
}

void
dllmap_insert_image (MonoImage *assembly, const char *dll, const char *func, const char *tdll, const char *tfunc)
{
MonoDllMap *entry;
g_assert (assembly != NULL);

mono_loader_init ();

entry = (MonoDllMap *)mono_image_alloc0 (assembly, sizeof (MonoDllMap));
entry->dll = dll? mono_image_strdup (assembly, dll): NULL;
entry->target = tdll? mono_image_strdup (assembly, tdll): NULL;
Expand All @@ -1077,7 +1101,6 @@ mono_dllmap_insert (MonoImage *assembly, const char *dll, const char *func, cons
entry->next = assembly->dll_map;
assembly->dll_map = entry;
mono_image_unlock (assembly);
}
}

static void
Expand Down
2 changes: 1 addition & 1 deletion mono/metadata/marshal-ilgen.c
Original file line number Diff line number Diff line change
Expand Up @@ -6341,7 +6341,7 @@ emit_native_icall_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethod *method, Mono
if (sig->hasthis) {
mono_mb_emit_byte (mb, CEE_LDARG_0);
/* TODO support adding wrappers to non-static struct methods */
g_assert (!mono_class_is_valuetype(mono_method_get_class (method)));
g_assert (!m_class_is_valuetype (mono_method_get_class (method)));
mono_mb_emit_icall (mb, mono_icall_handle_new);
}
for (int i = 0; i < sig->param_count; i++) {
Expand Down
Loading