/** * mono_exception_new_by_name_domain: * \param domain Domain where the return object will be created. * \param image the Mono image where to look for the class * \param name_space the namespace for the class * \param name class name * * Creates an exception object of the given namespace/name class on * the given domain. * * \returns the initialized exception instance. */ static MonoExceptionHandle mono_exception_new_by_name_domain (MonoDomain *domain, MonoImage *image, const char* name_space, const char *name, MonoError *error) { HANDLE_FUNCTION_ENTER (); MonoDomain * const caller_domain = mono_domain_get (); MonoClass * const klass = mono_class_load_from_name (image, name_space, name); MonoObjectHandle o = mono_object_new_handle (domain, klass, error); goto_if_nok (error, return_null); if (domain != caller_domain) mono_domain_set_internal (domain); mono_runtime_object_init_handle (o, error); mono_error_assert_ok (error); // Restore domain in success and error path. if (domain != caller_domain) mono_domain_set_internal (caller_domain); goto_if_ok (error, exit); return_null: MONO_HANDLE_ASSIGN (o, NULL_HANDLE); exit: HANDLE_FUNCTION_RETURN_REF (MonoException, MONO_HANDLE_CAST (MonoException, o)); }
MonoExceptionHandle mono_get_exception_runtime_wrapped_handle (MonoObjectHandle wrapped_exception, MonoError *error) { HANDLE_FUNCTION_ENTER (); MonoClass *klass; MonoMethod *method; klass = mono_class_load_from_name (mono_get_corlib (), "System.Runtime.CompilerServices", "RuntimeWrappedException"); MonoObjectHandle o = mono_object_new_handle (mono_domain_get (), klass, error); mono_error_assert_ok (error); g_assert (!MONO_HANDLE_IS_NULL (o)); method = mono_class_get_method_from_name_checked (klass, ".ctor", 1, 0, error); mono_error_assert_ok (error); g_assert (method); gpointer args [ ] = { MONO_HANDLE_RAW (wrapped_exception) }; mono_runtime_invoke_handle (method, o, args, error); goto_if_nok (error, return_null); goto exit; return_null: o = mono_new_null (); exit: HANDLE_FUNCTION_RETURN_REF (MonoException, MONO_HANDLE_CAST (MonoException, o)); }
static MonoExceptionHandle mono_error_prepare_exception_handle (MonoError *oerror, MonoError *error_out) // Can fail with out-of-memory { HANDLE_FUNCTION_ENTER (); MonoExceptionHandle ex = MONO_HANDLE_NEW (MonoException, mono_error_prepare_exception (oerror, error_out)); HANDLE_FUNCTION_RETURN_REF (MonoException, ex); }
/** * mono_exception_from_name_two_strings_checked: * \param image the Mono image where to look for the class * \param name_space the namespace for the class * \param name class name * \param a1 first string argument to pass * \param a2 second string argument to pass * \param error set on error * * Creates an exception from a constructor that takes two string * arguments. * * \returns the initialized exception instance. On failure returns * NULL and sets \p error. */ MonoExceptionHandle mono_exception_from_name_two_strings_checked (MonoImage *image, const char *name_space, const char *name, MonoStringHandle a1, MonoStringHandle a2, MonoError *error) { HANDLE_FUNCTION_ENTER (); MonoClass *klass; error_init (error); klass = mono_class_load_from_name (image, name_space, name); HANDLE_FUNCTION_RETURN_REF (MonoException, create_exception_two_strings (klass, a1, a2, 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. */ MonoExceptionHandle mono_exception_from_token_two_strings_checked (MonoImage *image, guint32 token, MonoStringHandle a1, MonoStringHandle a2, MonoError *error) { HANDLE_FUNCTION_ENTER (); MonoClass *klass; error_init (error); klass = mono_class_get_checked (image, token, error); mono_error_assert_ok (error); /* FIXME handle the error. */ HANDLE_FUNCTION_RETURN_REF (MonoException, create_exception_two_strings (klass, a1, a2, error)); }
MonoExceptionHandle mono_get_exception_type_initialization_handle (const gchar *type_name, MonoExceptionHandle inner, MonoError *error) { HANDLE_FUNCTION_ENTER (); MonoClass *klass; MonoMethod *method; gpointer iter; error_init (error); klass = mono_class_load_from_name (mono_get_corlib (), "System", "TypeInitializationException"); mono_class_init_internal (klass); iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { if (!strcmp (".ctor", mono_method_get_name (method))) { MonoMethodSignature *sig = mono_method_signature_internal (method); if (sig->param_count == 2 && sig->params [0]->type == MONO_TYPE_STRING && mono_class_from_mono_type_internal (sig->params [1]) == mono_defaults.exception_class) break; } method = NULL; } g_assert (method); MonoDomain * const domain = mono_domain_get (); MonoStringHandle type_name_str = mono_string_new_handle (domain, type_name, error); mono_error_assert_ok (error); gpointer args [ ] = { MONO_HANDLE_RAW (type_name_str), MONO_HANDLE_RAW (inner) }; MonoObjectHandle exc = mono_object_new_handle (domain, klass, error); mono_error_assert_ok (error); mono_runtime_invoke_handle (method, exc, args, error); goto_if_nok (error, return_null); goto exit; return_null: exc = mono_new_null (); exit: HANDLE_FUNCTION_RETURN_REF (MonoException, MONO_HANDLE_CAST (MonoException, exc)); }
MonoExceptionHandle mono_get_exception_reflection_type_load_checked (MonoArrayHandle types, MonoArrayHandle exceptions, MonoError *error) { HANDLE_FUNCTION_ENTER (); MonoClass *klass; MonoMethod *method; gpointer iter; error_init (error); klass = mono_class_load_from_name (mono_get_corlib (), "System.Reflection", "ReflectionTypeLoadException"); mono_class_init_internal (klass); /* Find the Type[], Exception[] ctor */ iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { if (!strcmp (".ctor", mono_method_get_name (method))) { MonoMethodSignature *sig = mono_method_signature_internal (method); if (sig->param_count == 2 && sig->params [0]->type == MONO_TYPE_SZARRAY && sig->params [1]->type == MONO_TYPE_SZARRAY) break; } method = NULL; } g_assert (method); MonoExceptionHandle exc = MONO_HANDLE_CAST (MonoException, MONO_HANDLE_NEW (MonoObject, mono_object_new_checked (mono_domain_get (), klass, error))); mono_error_assert_ok (error); gpointer args [ ] = { MONO_HANDLE_RAW (types), MONO_HANDLE_RAW (exceptions) }; mono_runtime_invoke_checked (method, MONO_HANDLE_RAW (exc), args, error); goto_if_nok (error, return_null); goto exit; return_null: exc = MONO_HANDLE_CAST (MonoException, mono_new_null ()); exit: HANDLE_FUNCTION_RETURN_REF (MonoException, exc); }
static MonoExceptionHandle create_exception_two_strings (MonoClass *klass, MonoStringHandle a1, MonoStringHandle a2, MonoError *error) { HANDLE_FUNCTION_ENTER (); MonoMethod *method = NULL; int const count = 1 + !MONO_HANDLE_IS_NULL (a2); gpointer iter; MonoMethod *m; MonoObjectHandle o = mono_object_new_handle (mono_domain_get (), klass, error); mono_error_assert_ok (error); iter = NULL; while ((m = mono_class_get_methods (klass, &iter))) { MonoMethodSignature *sig; if (strcmp (".ctor", mono_method_get_name (m))) continue; sig = mono_method_signature_internal (m); if (sig->param_count != count) continue; if (sig->params [0]->type != MONO_TYPE_STRING) continue; if (count == 2 && sig->params [1]->type != MONO_TYPE_STRING) continue; method = m; break; } gpointer args [ ] = { MONO_HANDLE_RAW (a1), MONO_HANDLE_RAW (a2) }; mono_runtime_invoke_handle (method, o, args, error); if (!is_ok (error)) o = mono_new_null (); HANDLE_FUNCTION_RETURN_REF (MonoException, MONO_HANDLE_CAST (MonoException, o)); }
static MonoStringHandle get_type_name_as_mono_string (MonoErrorInternal *error, MonoDomain *domain, MonoError *error_out) { HANDLE_FUNCTION_ENTER (); MonoStringHandle res = NULL_HANDLE_STRING; if (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 (m_class_get_byval_arg (klass)); if (name) { res = string_new_cleanup (domain, name); g_free (name); } } } if (MONO_HANDLE_IS_NULL (res)) mono_error_set_out_of_memory (error_out, "Could not allocate type name"); HANDLE_FUNCTION_RETURN_REF (MonoString, res); }
MonoExceptionHandle mono_corlib_exception_new_with_args (const char *name_space, const char *name, const char *arg_0, const char *arg_1, MonoError *error) { HANDLE_FUNCTION_ENTER (); MonoStringHandle str_0 = NULL_HANDLE_STRING; MonoStringHandle str_1 = NULL_HANDLE_STRING; MonoExceptionHandle ex = MONO_HANDLE_CAST (MonoException, NULL_HANDLE); MonoDomain * const domain = mono_domain_get (); str_0 = arg_0 ? mono_string_new_handle (domain, arg_0, error) : NULL_HANDLE_STRING; goto_if_nok (error, return_null); str_1 = arg_1 ? mono_string_new_handle (domain, arg_1, error) : NULL_HANDLE_STRING; goto_if_nok (error, return_null); ex = mono_exception_from_name_two_strings_checked (mono_defaults.corlib, name_space, name, str_0, str_1, error); goto exit; return_null: ex = MONO_HANDLE_CAST (MonoException, mono_new_null ()); exit: HANDLE_FUNCTION_RETURN_REF (MonoException, ex); }