X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fobject.c;h=48ced0faa557ffa8dadb067608dd54e67db2053e;hb=107e44e461ae22e5fcee195146d753d8e59e8bc8;hp=3731cd5c430dbbd51a1ba87da25dfdc8a7c7aa8b;hpb=b783623ed18a3c1cb25f9c459cbffdd77d60393c;p=mono.git diff --git a/mono/metadata/object.c b/mono/metadata/object.c index 3731cd5c430..48ced0faa55 100644 --- a/mono/metadata/object.c +++ b/mono/metadata/object.c @@ -1999,21 +1999,23 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean gsize default_bitmap [4] = {0}; gsize *bitmap; int max_set = 0; + int numbits; MonoClass *fclass; if (mono_type_is_reference (field->type)) { default_bitmap [0] = 1; - max_set = 1; + numbits = 1; bitmap = default_bitmap; } else if (mono_type_is_struct (field->type)) { fclass = mono_class_from_mono_type (field->type); bitmap = compute_class_bitmap (fclass, default_bitmap, sizeof (default_bitmap) * 8, 0, &max_set, FALSE); + numbits = max_set + 1; } else { default_bitmap [0] = 0; - max_set = 0; + numbits = 0; bitmap = default_bitmap; } size = mono_type_size (field->type, &align); - offset = mono_alloc_special_static_data (special_static, size, align, (uintptr_t*)bitmap, max_set); + offset = mono_alloc_special_static_data (special_static, size, align, (uintptr_t*)bitmap, numbits); if (!domain->special_static_fields) domain->special_static_fields = g_hash_table_new (NULL, NULL); g_hash_table_insert (domain->special_static_fields, field, GUINT_TO_POINTER (offset)); @@ -2536,7 +2538,9 @@ mono_remote_class (MonoDomain *domain, MonoString *class_name, MonoClass *proxy_ rc->default_vtable = NULL; rc->xdomain_vtable = NULL; rc->proxy_class_name = name; +#ifndef DISABLE_PERFCOUNTERS mono_perfcounters->loader_bytes += mono_string_length (class_name) + 1; +#endif g_hash_table_insert (domain->proxy_vtable_hash, key, rc); @@ -2615,9 +2619,11 @@ mono_remote_class_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, Mon MonoClass *klass; type = ((MonoReflectionType *)rp->class_to_proxy)->type; klass = mono_class_from_mono_type (type); +#ifndef DISABLE_COM if ((klass->is_com_object || (mono_defaults.com_object_class && klass == mono_defaults.com_object_class)) && !mono_class_vtable (mono_domain_get (), klass)->remote) remote_class->default_vtable = mono_class_proxy_vtable (domain, remote_class, MONO_REMOTING_TARGET_COMINTEROP); else +#endif remote_class->default_vtable = mono_class_proxy_vtable (domain, remote_class, MONO_REMOTING_TARGET_UNKNOWN); } @@ -4944,7 +4950,7 @@ mono_string_new_len (MonoDomain *domain, const char *text, guint length) guint16 *ut; glong items_written; - ut = g_utf8_to_utf16 (text, length, NULL, &items_written, &error); + ut = eg_utf8_to_utf16_with_nuls (text, length, NULL, &items_written, &error); if (!error) o = mono_string_new_utf16 (domain, ut, items_written); @@ -6018,15 +6024,22 @@ mono_print_unhandled_exception (MonoObject *exc) if (exc == (MonoObject*)mono_object_domain (exc)->out_of_memory_ex) { message = g_strdup ("OutOfMemoryException"); + free_message = TRUE; } else { - str = mono_object_to_string (exc, NULL); - if (str) { - message = mono_string_to_utf8_checked (str, &error); - if (!mono_error_ok (&error)) { - mono_error_cleanup (&error); - message = (char *) ""; - } else { - free_message = TRUE; + + if (((MonoException*)exc)->native_trace_ips) { + message = mono_exception_get_native_backtrace ((MonoException*)exc); + free_message = TRUE; + } else { + str = mono_object_to_string (exc, NULL); + if (str) { + message = mono_string_to_utf8_checked (str, &error); + if (!mono_error_ok (&error)) { + mono_error_cleanup (&error); + message = (char *) ""; + } else { + free_message = TRUE; + } } } } @@ -6035,7 +6048,7 @@ mono_print_unhandled_exception (MonoObject *exc) * g_printerr ("\nUnhandled Exception: %s.%s: %s\n", exc->vtable->klass->name_space, * exc->vtable->klass->name, message); */ - g_printerr ("\nUnhandled Exception: %s\n", message); + g_printerr ("\nUnhandled Exception:\n%s\n", message); if (free_message) g_free (message);