/** * mono_error_box: * \param ierror The input error that will be boxed. * \param image The mempool of this image will hold the boxed error. * Creates a new boxed error in the given mempool from \c MonoError. * It does not alter \p ierror, so you still have to clean it up with * \c mono_error_cleanup or \c mono_error_convert_to_exception or another such function. * \returns the boxed error, or NULL if the mempool could not allocate. */ MonoErrorBoxed* mono_error_box (const MonoError *ierror, MonoImage *image) { MonoErrorInternal *from = (MonoErrorInternal*)ierror; /* Don't know how to box a gchandle */ g_assert (!is_managed_exception (from)); MonoErrorBoxed* box = (MonoErrorBoxed*)mono_image_alloc (image, sizeof (MonoErrorBoxed)); box->image = image; mono_error_init_flags (&box->error, MONO_ERROR_MEMPOOL_BOXED); MonoErrorInternal *to = (MonoErrorInternal*)&box->error; #define DUP_STR(field) do { \ if (from->field) { \ if (!(to->field = mono_image_strdup (image, from->field))) \ to->flags |= MONO_ERROR_INCOMPLETE; \ } else { \ to->field = NULL; \ } \ } while (0) to->error_code = from->error_code; DUP_STR (type_name); DUP_STR (assembly_name); DUP_STR (member_name); DUP_STR (exception_name_space); DUP_STR (exception_name); DUP_STR (full_message); DUP_STR (full_message_with_fields); DUP_STR (first_argument); to->exn.klass = from->exn.klass; #undef DUP_STR return box; }
/** * mono_error_init: * @error: Pointer to MonoError struct to initialize * * Any function which takes a MonoError for purposes of reporting an error * is required to call either this or mono_error_init_flags on entry. */ void mono_error_init (MonoError *error) { mono_error_init_flags (error, 0); }