Merge pull request #4928 from kumpera/ptr_to_struct_intrinsic
[mono.git] / mono / utils / mono-error.c
index 2f83c8357d5281cba7d9699683d10907425241d0..f7bc6187d56e0d744f1f5fb0a416a6474bf7d0e1 100644 (file)
@@ -541,20 +541,30 @@ mono_error_set_not_verifiable (MonoError *oerror, MonoMethod *method, const char
 }
 
 
+/* Used by mono_error_prepare_exception - it sets its own error on mono_string_new_checked failure. */
+static MonoString*
+string_new_cleanup (MonoDomain *domain, const char *text)
+{
+       MonoError ignored_err;
+       MonoString *result = mono_string_new_checked (domain, text, &ignored_err);
+       mono_error_cleanup (&ignored_err);
+       return result;
+}
+
 static MonoString*
 get_type_name_as_mono_string (MonoErrorInternal *error, MonoDomain *domain, MonoError *error_out)
 {
        MonoString* res = NULL;
 
        if (error->type_name) {
-               res = mono_string_new (domain, error->type_name);
+               res = string_new_cleanup (domain, error->type_name);
                
        } else {
                MonoClass *klass = get_class (error);
                if (klass) {
                        char *name = mono_type_full_name (&klass->byval_arg);
                        if (name) {
-                               res = mono_string_new (domain, name);
+                               res = string_new_cleanup (domain, name);
                                g_free (name);
                        }
                }
@@ -567,7 +577,7 @@ get_type_name_as_mono_string (MonoErrorInternal *error, MonoDomain *domain, Mono
 static void
 set_message_on_exception (MonoException *exception, MonoErrorInternal *error, MonoError *error_out)
 {
-       MonoString *msg = mono_string_new (mono_domain_get (), error->full_message);
+       MonoString *msg = string_new_cleanup (mono_domain_get (), error->full_message);
        if (msg)
                MONO_OBJECT_SETREF (exception, message, msg);
        else
@@ -596,7 +606,7 @@ mono_error_prepare_exception (MonoError *oerror, MonoError *error_out)
                        if (!mono_error_ok (error_out))
                                break;
 
-                       method_name = mono_string_new (domain, error->member_name);
+                       method_name = string_new_cleanup (domain, error->member_name);
                        if (!method_name) {
                                mono_error_set_out_of_memory (error_out, "Could not allocate method name");
                                break;
@@ -616,7 +626,7 @@ mono_error_prepare_exception (MonoError *oerror, MonoError *error_out)
                        if (!mono_error_ok (error_out))
                                break;
                        
-                       field_name = mono_string_new (domain, error->member_name);
+                       field_name = string_new_cleanup (domain, error->member_name);
                        if (!field_name) {
                                mono_error_set_out_of_memory (error_out, "Could not allocate field name");
                                break;
@@ -637,11 +647,13 @@ mono_error_prepare_exception (MonoError *oerror, MonoError *error_out)
                                break;
 
                        if (error->assembly_name) {
-                               assembly_name = mono_string_new (domain, error->assembly_name);
+                               assembly_name = string_new_cleanup (domain, error->assembly_name);
                                if (!assembly_name) {
                                        mono_error_set_out_of_memory (error_out, "Could not allocate assembly name");
                                        break;
                                }
+                       } else {
+                               assembly_name = mono_string_empty (domain);
                        }
 
                        exception = mono_exception_from_name_two_strings_checked (mono_get_corlib (), "System", "TypeLoadException", type_name, assembly_name, error_out);
@@ -655,14 +667,14 @@ mono_error_prepare_exception (MonoError *oerror, MonoError *error_out)
        case MONO_ERROR_FILE_NOT_FOUND:
        case MONO_ERROR_BAD_IMAGE:
                if (error->assembly_name) {
-                       msg = mono_string_new (domain, error->full_message);
+                       msg = string_new_cleanup (domain, error->full_message);
                        if (!msg) {
                                mono_error_set_out_of_memory (error_out, "Could not allocate message");
                                break;
                        }
 
                        if (error->assembly_name) {
-                               assembly_name = mono_string_new (domain, error->assembly_name);
+                               assembly_name = string_new_cleanup (domain, error->assembly_name);
                                if (!assembly_name) {
                                        mono_error_set_out_of_memory (error_out, "Could not allocate assembly name");
                                        break;