diff --git a/mono/metadata/exception-internals.h b/mono/metadata/exception-internals.h index a606e79b57ddc..4a9ad505798ee 100644 --- a/mono/metadata/exception-internals.h +++ b/mono/metadata/exception-internals.h @@ -20,4 +20,9 @@ mono_exception_from_name_two_strings_checked (MonoImage *image, const char *name const char *name, MonoString *a1, MonoString *a2, MonoError *error); +MonoException * +mono_exception_from_token_two_strings_checked (MonoImage *image, uint32_t token, + MonoString *a1, MonoString *a2, + MonoError *error); + #endif diff --git a/mono/metadata/exception.c b/mono/metadata/exception.c index 76f70a3dcfc7e..2aff26dfd5378 100644 --- a/mono/metadata/exception.c +++ b/mono/metadata/exception.c @@ -245,16 +245,31 @@ mono_exception_from_token_two_strings (MonoImage *image, guint32 token, MonoString *a1, MonoString *a2) { MonoError error; - MonoClass *klass; MonoException *ret; + ret = mono_exception_from_token_two_strings_checked (image, token, a1, a2, &error); + mono_error_cleanup (&error); + return ret; +} - klass = mono_class_get_checked (image, token, &error); - mono_error_assert_ok (&error); /* FIXME handle the error. */ +/** + * mono_exception_from_token_two_strings_checked: + * + * Same as mono_exception_from_name_two_strings, but lookup the exception class using + * IMAGE and TOKEN. + */ +MonoException * +mono_exception_from_token_two_strings_checked (MonoImage *image, guint32 token, + MonoString *a1, MonoString *a2, + MonoError *error) +{ + MonoClass *klass; - ret = create_exception_two_strings (klass, a1, a2, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + mono_error_init (error); - return ret; + klass = mono_class_get_checked (image, token, error); + mono_error_assert_ok (error); /* FIXME handle the error. */ + + return create_exception_two_strings (klass, a1, a2, error); } /** diff --git a/mono/metadata/exception.h b/mono/metadata/exception.h index 261bd92c6c9cc..3de5ae7ff5768 100644 --- a/mono/metadata/exception.h +++ b/mono/metadata/exception.h @@ -23,6 +23,7 @@ MONO_API MonoException * mono_exception_from_name_msg (MonoImage *image, const char *name_space, const char *name, const char *msg); +MONO_RT_EXTERNAL_ONLY MONO_API MonoException * mono_exception_from_token_two_strings (MonoImage *image, uint32_t token, MonoString *a1, MonoString *a2); diff --git a/mono/mini/jit-icalls.c b/mono/mini/jit-icalls.c index 39abeb2854974..1735b3cc979f4 100644 --- a/mono/mini/jit-icalls.c +++ b/mono/mini/jit-icalls.c @@ -19,6 +19,7 @@ #include "jit-icalls.h" #include +#include #include #include @@ -1189,13 +1190,21 @@ mono_create_corlib_exception_0 (guint32 token) MonoException * mono_create_corlib_exception_1 (guint32 token, MonoString *arg) { - return mono_exception_from_token_two_strings (mono_defaults.corlib, token, arg, NULL); + MonoError error; + MonoException *ret = mono_exception_from_token_two_strings_checked ( + mono_defaults.corlib, token, arg, NULL, &error); + mono_error_set_pending_exception (&error); + return ret; } MonoException * mono_create_corlib_exception_2 (guint32 token, MonoString *arg1, MonoString *arg2) { - return mono_exception_from_token_two_strings (mono_defaults.corlib, token, arg1, arg2); + MonoError error; + MonoException *ret = mono_exception_from_token_two_strings_checked ( + mono_defaults.corlib, token, arg1, arg2, &error); + mono_error_set_pending_exception (&error); + return ret; } MonoObject*