MonoException * mono_get_exception_runtime_wrapped (MonoObject *wrapped_exception) { MonoError error; MonoClass *klass; MonoObject *o; MonoMethod *method; MonoDomain *domain = mono_domain_get (); gpointer params [16]; klass = mono_class_load_from_name (mono_get_corlib (), "System.Runtime.CompilerServices", "RuntimeWrappedException"); o = mono_object_new_checked (domain, klass, &error); g_assert (o != NULL && mono_error_ok (&error)); /* FIXME don't swallow the error */ method = mono_class_get_method_from_name (klass, ".ctor", 1); g_assert (method); params [0] = wrapped_exception; mono_runtime_invoke_checked (method, o, params, &error); mono_error_raise_exception (&error); /* FIXME don't raise here */ return (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)); }
MonoException * mono_get_exception_runtime_wrapped_checked (MonoObject *wrapped_exception, MonoError *error) { MonoClass *klass; MonoObject *o; MonoMethod *method; MonoDomain *domain = mono_domain_get (); gpointer params [16]; klass = mono_class_load_from_name (mono_get_corlib (), "System.Runtime.CompilerServices", "RuntimeWrappedException"); o = mono_object_new_checked (domain, klass, error); mono_error_assert_ok (error); g_assert (o != NULL); method = mono_class_get_method_from_name (klass, ".ctor", 1); g_assert (method); params [0] = wrapped_exception; mono_runtime_invoke_checked (method, o, params, error); return_val_if_nok (error, NULL); return (MonoException *)o; }
/** * 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)); }
static inline void print_report (const gchar *format, ...) { MonoError error; MonoClass *klass; MonoProperty *prop; MonoString *str; char *stack_trace; va_list ap; fprintf (stdout, "-=-=-=-=-=-=- MONO_IOMAP REPORT -=-=-=-=-=-=-\n"); va_start (ap, format); vfprintf (stdout, format, ap); fprintf (stdout, "\n"); va_end (ap); klass = mono_class_load_from_name (mono_get_corlib (), "System", "Environment"); mono_class_init (klass); prop = mono_class_get_property_from_name (klass, "StackTrace"); str = (MonoString*)mono_property_get_value_checked (prop, NULL, NULL, &error); mono_error_assert_ok (&error); stack_trace = mono_string_to_utf8_checked (str, &error); mono_error_assert_ok (&error); fprintf (stdout, "-= Stack Trace =-\n%s\n\n", stack_trace); g_free (stack_trace); fflush (stdout); }
static void mono_invoke_protected_memory_method (MonoArrayHandle data, MonoObjectHandle scope, const char *method_name, MonoMethod **method, MonoError *error) { if (!*method) { if (system_security_assembly == NULL) { system_security_assembly = mono_image_loaded_internal ("System.Security", FALSE); if (!system_security_assembly) { MonoAssemblyOpenRequest req; mono_assembly_request_prepare (&req.request, sizeof (req), MONO_ASMCTX_DEFAULT); MonoAssembly *sa = mono_assembly_request_open ("System.Security.dll", &req, NULL); g_assert (sa); system_security_assembly = mono_assembly_get_image_internal (sa); } } MonoClass *klass = mono_class_load_from_name (system_security_assembly, "System.Security.Cryptography", "ProtectedMemory"); *method = mono_class_get_method_from_name_checked (klass, method_name, 2, 0, error); mono_error_assert_ok (error); g_assert (*method); } void *params [ ] = { MONO_HANDLE_RAW (data), MONO_HANDLE_RAW (scope) // MemoryProtectionScope.SameProcess }; mono_runtime_invoke_handle_void (*method, NULL_HANDLE, params, error); }
void invoke_protected_memory_method (MonoArray *data, MonoObject *scope, gboolean encrypt, MonoError *error) { MonoClass *klass; MonoMethod *method; void *params [2]; mono_error_init (error); if (system_security_assembly == NULL) { system_security_assembly = mono_image_loaded ("System.Security"); if (!system_security_assembly) { MonoAssembly *sa = mono_assembly_open ("System.Security.dll", NULL); if (!sa) g_assert_not_reached (); system_security_assembly = mono_assembly_get_image (sa); } } klass = mono_class_load_from_name (system_security_assembly, "System.Security.Cryptography", "ProtectedMemory"); method = mono_class_get_method_from_name (klass, encrypt ? "Protect" : "Unprotect", 2); params [0] = data; params [1] = scope; /* MemoryProtectionScope.SameProcess */ mono_runtime_invoke_checked (method, NULL, params, error); }
/** * mono_exception_from_name_two_strings: * @image: the Mono image where to look for the class * @name_space: the namespace for the class * @name: class name * @a1: first string argument to pass * @a2: second string argument to pass * * Creates an exception from a constructor that takes two string * arguments. * * Returns: the initialized exception instance. */ MonoException * mono_exception_from_name_two_strings (MonoImage *image, const char *name_space, const char *name, MonoString *a1, MonoString *a2) { MonoClass *klass = mono_class_load_from_name (image, name_space, name); return create_exception_two_strings (klass, a1, a2); }
/** * mono_exception_from_name_two_strings_checked: * @image: the Mono image where to look for the class * @name_space: the namespace for the class * @name: class name * @a1: first string argument to pass * @a2: second string argument to pass * @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 @error. */ MonoException * mono_exception_from_name_two_strings_checked (MonoImage *image, const char *name_space, const char *name, MonoString *a1, MonoString *a2, MonoError *error) { MonoClass *klass; mono_error_init (error); klass = mono_class_load_from_name (image, name_space, name); return create_exception_two_strings (klass, a1, a2, error); }
/** * 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_name_two_strings: * @image: the Mono image where to look for the class * @name_space: the namespace for the class * @name: class name * @a1: first string argument to pass * @a2: second string argument to pass * * Creates an exception from a constructor that takes two string * arguments. * * Returns: the initialized exception instance. */ MonoException * mono_exception_from_name_two_strings (MonoImage *image, const char *name_space, const char *name, MonoString *a1, MonoString *a2) { MonoError error; MonoClass *klass; MonoException *ret; klass = mono_class_load_from_name (image, name_space, name); ret = create_exception_two_strings (klass, a1, a2, &error); mono_error_raise_exception (&error); /* FIXME don't raise here */ return ret; }
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); }
/** * mono_exception_from_name_domain: * @domain: Domain where the return object will be created. * @image: the Mono image where to look for the class * @name_space: the namespace for the class * @name: class name * * Creates an exception object of the given namespace/name class on * the given domain. * * Returns: the initialized exception instance. */ MonoException * mono_exception_from_name_domain (MonoDomain *domain, MonoImage *image, const char* name_space, const char *name) { MonoError error; MonoClass *klass; MonoObject *o; MonoDomain *caller_domain = mono_domain_get (); klass = mono_class_load_from_name (image, name_space, name); o = mono_object_new_checked (domain, klass, &error); g_assert (o != NULL && mono_error_ok (&error)); /* FIXME don't swallow the error */ if (domain != caller_domain) mono_domain_set_internal (domain); mono_runtime_object_init (o); if (domain != caller_domain) mono_domain_set_internal (caller_domain); return (MonoException *)o; }
/** * mono_get_exception_reflection_type_load: * @types: an array of types that were defined in the moduled loaded. * @exceptions: an array of exceptions that were thrown during the type loading. * * Returns: a new instance of the `System.Reflection.ReflectionTypeLoadException` */ MonoException * mono_get_exception_reflection_type_load (MonoArray *types, MonoArray *exceptions) { MonoError error; MonoClass *klass; gpointer args [2]; MonoObject *exc; MonoMethod *method; gpointer iter; klass = mono_class_load_from_name (mono_get_corlib (), "System.Reflection", "ReflectionTypeLoadException"); mono_class_init (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 (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); args [0] = types; args [1] = exceptions; exc = mono_object_new_checked (mono_domain_get (), klass, &error); mono_error_assert_ok (&error); mono_runtime_invoke_checked (method, exc, args, &error); mono_error_raise_exception (&error); /* FIXME don't raise here */ return (MonoException *) exc; }
/** * mono_get_exception_type_initialization: * @type_name: the name of the type that failed to initialize. * @inner: the inner exception. * * Returns: a new instance of the `System.TypeInitializationException` */ MonoException * mono_get_exception_type_initialization (const gchar *type_name, MonoException *inner) { MonoError error; MonoClass *klass; gpointer args [2]; MonoObject *exc; MonoMethod *method; gpointer iter; klass = mono_class_load_from_name (mono_get_corlib (), "System", "TypeInitializationException"); mono_class_init (klass); iter = NULL; while ((method = mono_class_get_methods (klass, &iter))) { if (!strcmp (".ctor", mono_method_get_name (method))) { MonoMethodSignature *sig = mono_method_signature (method); if (sig->param_count == 2 && sig->params [0]->type == MONO_TYPE_STRING && mono_class_from_mono_type (sig->params [1]) == mono_defaults.exception_class) break; } method = NULL; } g_assert (method); args [0] = mono_string_new (mono_domain_get (), type_name); args [1] = inner; exc = mono_object_new_checked (mono_domain_get (), klass, &error); mono_error_assert_ok (&error); mono_runtime_invoke_checked (method, exc, args, &error); mono_error_raise_exception (&error); /* FIXME don't raise here */ return (MonoException *) exc; }