}
+/* 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);
}
}
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
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;
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;
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);
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;