done:
/* Generic case, should be avoided for when a better error is possible. */
if (!res && mono_error_ok (error)) {
- if (mono_loader_get_last_error ()) { /*FIXME plug the above to not leak errors*/
- mono_error_set_from_loader_error (error);
- } else {
- char *name = mono_class_name_from_token (image, type_token);
- char *assembly = mono_assembly_name_from_token (image, type_token);
- mono_error_set_type_load_name (error, name, assembly, "Could not resolve type with token %08x", type_token);
- }
+ char *name = mono_class_name_from_token (image, type_token);
+ char *assembly = mono_assembly_name_from_token (image, type_token);
+ mono_error_set_type_load_name (error, name, assembly, "Could not resolve type with token %08x", type_token);
}
mono_loader_assert_no_error ();
return res;
if (mono_class_has_failure (klass)) {
mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass));
} else {
- mono_error_set_from_loader_error (&error);
- mono_loader_clear_error ();
+ mono_loader_assert_no_error ();
}
failure:
if (mono_class_has_failure (klass)) {
mono_error_set_exception_instance (&error, mono_class_get_exception_for_failure (klass));
} else {
- mono_error_set_from_loader_error (&error);
- mono_loader_clear_error ();
+ mono_loader_assert_no_error ();
}
failure:
*retklass = k;
field = mono_class_get_field (k, token);
if (!field) {
- if (mono_loader_get_last_error ())
- mono_error_set_from_loader_error (error);
- else
- mono_error_set_bad_image (error, image, "Could not resolve field token 0x%08x", token);
+ mono_loader_assert_no_error ();
+ mono_error_set_bad_image (error, image, "Could not resolve field token 0x%08x", token);
}
}
g_free (msig);
msig = g_string_free (s, FALSE);
- if (mono_loader_get_last_error ()) /* FIXME find_method and mono_method_search_in_array_class can leak a loader error */
- mono_error_set_from_loader_error (error);
- else
- mono_error_set_method_load (error, klass, mname, "Could not find method %s", msig);
+ mono_loader_assert_no_error ();
+ mono_error_set_method_load (error, klass, mname, "Could not find method %s", msig);
g_free (msig);
}
if (!mono_error_ok (&error))
goto leave;
- if (mono_loader_get_last_error ()) {
- mono_error_set_from_loader_error (&error);
- goto leave;
- }
-
if (!typedargs || !namedargs)
goto leave;
} else
result = mono_array_new (mono_domain_get (), mono_defaults.customattribute_data_class, 0);
- if (mono_loader_get_last_error ())
- mono_error_set_from_loader_error (error);
-
return result;
}
res = mono_method_verify_with_current_settings (method, cfg->skip_visibility, is_fulltrust);
- if (mono_loader_get_last_error ()) {
- if (fail_compile) {
- mono_cfg_set_exception (cfg, MONO_EXCEPTION_MONO_ERROR);
- mono_error_set_from_loader_error (&cfg->error);
- } else {
- mono_loader_clear_error ();
- }
- if (res)
- mono_free_verify_list (res);
- return TRUE;
- }
-
if (res) {
for (tmp = res; tmp; tmp = tmp->next) {
MonoVerifyInfoExtended *info = (MonoVerifyInfoExtended *)tmp->data;
void
mono_error_set_exception_instance (MonoError *error, MonoException *exc);
-void
-mono_error_set_from_loader_error (MonoError *error);
-
MonoException*
mono_error_prepare_exception (MonoError *error, MonoError *error_out);
error->exn.instance_handle = mono_gchandle_new (exc ? &exc->object : NULL, FALSE);
}
-void
-mono_error_set_from_loader_error (MonoError *oerror)
-{
- MonoLoaderError *loader_error = mono_loader_get_last_error ();
- MonoErrorInternal *error = (MonoErrorInternal*)oerror;
- gboolean dup_strings = TRUE;
-
- mono_error_prepare (error);
-
- if (!loader_error) {
- mono_error_set_execution_engine (oerror, "Runtime tried to produce a mono-error from an empty loader-error");
- return;
- }
-
- switch (loader_error->exception_type) {
- case MONO_EXCEPTION_NONE:
- mono_error_set_execution_engine (oerror, "Runtime tried to produce a mono-error from a non-error loader-error");
- break;
-
- case MONO_EXCEPTION_INVALID_PROGRAM:
- mono_error_set_generic_error (oerror, "System", "InvalidProgramException", "Failed for unknown reasons.");
- break;
-
- case MONO_EXCEPTION_UNVERIFIABLE_IL:
- mono_error_set_generic_error (oerror, "System.Security", "VerificationException", "Failed for unknown reasons.");
- break;
-
- case MONO_EXCEPTION_MISSING_METHOD:
- error->error_code = MONO_ERROR_MISSING_METHOD;
- mono_error_set_type_name (oerror, loader_error->class_name);
- mono_error_set_member_name (oerror, loader_error->member_name);
- error->full_message = g_strdup ("Failed for unknown reasons.");
- break;
-
- case MONO_EXCEPTION_MISSING_FIELD:
- mono_error_set_field_load (oerror, loader_error->klass, loader_error->member_name, "Failed for unknown reasons.");
- break;
-
- case MONO_EXCEPTION_TYPE_LOAD:
- mono_error_set_type_load_name (oerror, g_strdup (loader_error->class_name), g_strdup (loader_error->assembly_name), "Failed for unknown reasons.");
- dup_strings = FALSE;
- break;
-
- case MONO_EXCEPTION_FILE_NOT_FOUND:
- mono_error_set_assembly_load_simple (oerror, loader_error->assembly_name, loader_error->ref_only);
- break;
-
- case MONO_EXCEPTION_METHOD_ACCESS:
- mono_error_set_generic_error (oerror, "System", "MethodAccessException", "Failed for unknown reasons.");
- break;
-
- case MONO_EXCEPTION_FIELD_ACCESS:
- mono_error_set_generic_error (oerror, "System", "FieldAccessException", "Failed for unknown reasons.");
- break;
-
- case MONO_EXCEPTION_OBJECT_SUPPLIED:
- case MONO_EXCEPTION_GENERIC_SHARING_FAILED:
- mono_error_set_execution_engine (oerror, "Runtime tried to produce a mono-error from JIT internal error %d", loader_error->exception_type);
- break;
-
- case MONO_EXCEPTION_BAD_IMAGE:
- mono_error_set_bad_image_name (oerror, "<unknown>", "%s", loader_error->msg);
- break;
-
- case MONO_EXCEPTION_OUT_OF_MEMORY:
- mono_error_set_out_of_memory (oerror, "Failed for unknown reasons.");
- break;
-
- default:
- mono_error_set_execution_engine (oerror, "Runtime tried to produce an unknown loader-error %d", loader_error->exception_type);
- break;
- }
-
- mono_error_dup_strings (oerror, dup_strings);
- mono_loader_clear_error ();
-}
-
void
mono_loader_set_error_from_mono_error (MonoError *oerror)
{