1 /** 2 * \file 3 */ 4 5 #ifndef __MONO_ERROR_INTERNALS_H__ 6 #define __MONO_ERROR_INTERNALS_H__ 7 8 #include "mono/utils/mono-compiler.h" 9 #include "mono/metadata/class-internals.h" 10 11 /*Keep in sync with MonoError*/ 12 typedef struct { 13 unsigned short error_code; 14 unsigned short flags; 15 16 /*These name are suggestions of their content. MonoError internals might use them for something else.*/ 17 const char *type_name; 18 const char *assembly_name; 19 const char *member_name; 20 const char *exception_name_space; 21 const char *exception_name; 22 union { 23 /* Valid if error_code != MONO_ERROR_EXCEPTION_INSTANCE. 24 * Used by type or field load errors and generic error specified by class. 25 */ 26 MonoClass *klass; 27 /* Valid if error_code == MONO_ERROR_EXCEPTION_INSTANCE. 28 * Generic error specified by a managed instance. 29 */ 30 uint32_t instance_handle; 31 } exn; 32 const char *full_message; 33 const char *full_message_with_fields; 34 const char *first_argument; 35 const char *member_signature; 36 37 void *padding [2]; 38 } MonoErrorInternal; 39 40 /* Invariant: the error strings are allocated in the mempool of the given image */ 41 struct _MonoErrorBoxed { 42 MonoError error; 43 MonoImage *image; 44 }; 45 46 #define error_init(error) do { \ 47 ((MonoErrorInternal*)(error))->error_code = MONO_ERROR_NONE; \ 48 ((MonoErrorInternal*)(error))->flags = 0; \ 49 } while (0); 50 51 #define is_ok(error) ((error)->error_code == MONO_ERROR_NONE) 52 53 #define return_if_nok(error) do { if (!is_ok ((error))) return; } while (0) 54 #define return_val_if_nok(error,val) do { if (!is_ok ((error))) return (val); } while (0) 55 56 #define goto_if_nok(error,label) do { if (!is_ok ((error))) goto label; } while (0) 57 58 /* Only use this in icalls */ 59 #define return_val_and_set_pending_if_nok(error,value) \ 60 if (mono_error_set_pending_exception ((error))) \ 61 return (value); 62 63 void 64 mono_error_assert_ok_pos (MonoError *error, const char* filename, int lineno) MONO_LLVM_INTERNAL; 65 66 #define mono_error_assert_ok(e) mono_error_assert_ok_pos (e, __FILE__, __LINE__); 67 68 void 69 mono_error_dup_strings (MonoError *error, gboolean dup_strings); 70 71 /* This function is not very useful as you can't provide any details beyond the message.*/ 72 void 73 mono_error_set_error (MonoError *error, int error_code, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(3,4); 74 75 void 76 mono_error_set_assembly_load (MonoError *error, const char *assembly_name, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(3,4); 77 78 void 79 mono_error_set_assembly_load_simple (MonoError *error, const char *assembly_name, gboolean refection_only); 80 81 void 82 mono_error_set_type_load_class (MonoError *error, MonoClass *klass, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(3,4); 83 84 void 85 mono_error_vset_type_load_class (MonoError *error, MonoClass *klass, const char *msg_format, va_list args); 86 87 void 88 mono_error_set_type_load_name (MonoError *error, const char *type_name, const char *assembly_name, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(4,5); 89 90 void 91 mono_error_set_method_load (MonoError *oerror, MonoClass *klass, const char *method_name, const char *signature, const char *msg_format, ...); 92 93 void 94 mono_error_set_field_load (MonoError *error, MonoClass *klass, const char *field_name, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(4,5); 95 96 void 97 mono_error_set_bad_image (MonoError *error, MonoImage *image, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(3,4); 98 99 void 100 mono_error_set_bad_image_name (MonoError *error, const char *file_name, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(3,4); 101 102 void 103 mono_error_set_out_of_memory (MonoError *error, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(2,3); 104 105 void 106 mono_error_set_argument (MonoError *error, const char *argument, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(3,4); 107 108 void 109 mono_error_set_argument_null (MonoError *oerror, const char *argument, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(3,4); 110 111 void 112 mono_error_set_not_verifiable (MonoError *oerror, MonoMethod *method, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(3,4); 113 114 void 115 mono_error_set_generic_error (MonoError *error, const char * name_space, const char *name, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(4,5); 116 117 void 118 mono_error_set_execution_engine (MonoError *error, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(2,3); 119 120 void 121 mono_error_set_not_implemented (MonoError *error, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(2,3); 122 123 void 124 mono_error_set_not_supported (MonoError *error, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(2,3); 125 126 void 127 mono_error_set_invalid_operation (MonoError *error, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(2,3); 128 129 void 130 mono_error_set_file_not_found (MonoError *error, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(2,3); 131 132 void 133 mono_error_set_exception_instance (MonoError *error, MonoException *exc); 134 135 void 136 mono_error_set_invalid_program (MonoError *oerror, const char *msg_format, ...) MONO_ATTR_FORMAT_PRINTF(2,3); 137 138 void 139 mono_error_set_invalid_cast (MonoError *oerror); 140 141 MonoException* 142 mono_error_prepare_exception (MonoError *error, MonoError *error_out); 143 144 MonoException* 145 mono_error_convert_to_exception (MonoError *error); 146 147 void 148 mono_error_move (MonoError *dest, MonoError *src); 149 150 MonoErrorBoxed* 151 mono_error_box (const MonoError *error, MonoImage *image); 152 153 gboolean 154 mono_error_set_from_boxed (MonoError *error, const MonoErrorBoxed *from); 155 156 const char* 157 mono_error_get_exception_name (MonoError *oerror); 158 159 #endif 160