Fri May 31 15:58:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / metadata / exception.c
1 /*
2  * exception.c: Exception handling
3  *
4  * Authors:
5  *      Paolo Molaro (lupus@ximian.com)
6  *      Dietmar Maurer (dietmar@ximian.com)
7  *      Dick Porter (dick@ximian.com)
8  *
9  * (C) 2001 Ximian, Inc.
10  */
11
12 #include <mono/metadata/exception.h>
13 #include <mono/metadata/class.h>
14 #include <mono/metadata/appdomain.h>
15
16 MonoException *
17 mono_exception_from_name (MonoImage *image, const char *name_space,
18                           const char *name)
19 {
20         MonoDomain *domain = mono_domain_get ();
21         MonoClass *klass;
22         MonoObject *o;
23
24         klass = mono_class_from_name (image, name_space, name);
25
26         o = mono_object_new (domain, klass);
27         g_assert (o != NULL);
28         
29         mono_runtime_object_init (o);
30
31         return (MonoException *)o;
32 }
33
34 MonoException *
35 mono_get_exception_divide_by_zero ()
36 {
37         return mono_exception_from_name (mono_defaults.corlib, "System",
38                                          "DivideByZeroException");
39 }
40
41 MonoException *
42 mono_get_exception_security ()
43 {
44         return mono_exception_from_name (mono_defaults.corlib, "System",
45                                          "SecurityException");
46 }
47
48 MonoException *
49 mono_get_exception_arithmetic ()
50 {
51         return mono_exception_from_name (mono_defaults.corlib, "System",
52                                          "ArithmeticException");
53 }
54
55 MonoException *
56 mono_get_exception_overflow ()
57 {
58         return mono_exception_from_name (mono_defaults.corlib, "System",
59                                          "OverflowException");
60 }
61
62 MonoException *
63 mono_get_exception_null_reference ()
64 {
65         return mono_exception_from_name (mono_defaults.corlib, "System",
66                                          "NullReferenceException");
67 }
68
69 MonoException *
70 mono_get_exception_execution_engine (const guchar *msg)
71 {
72         MonoException *ex;
73         MonoDomain *domain;
74
75         ex = mono_exception_from_name (mono_defaults.corlib, "System",
76                                          "ExecutionEngineException");
77
78         domain = ((MonoObject *)ex)->vtable->domain;
79
80         if (msg)
81                 ex->message = mono_string_new (domain, msg);
82
83         return ex;
84 }
85
86 MonoException *
87 mono_get_exception_invalid_cast ()
88 {
89         return mono_exception_from_name (mono_defaults.corlib, "System",
90                                          "InvalidCastException");
91 }
92
93 MonoException *
94 mono_get_exception_index_out_of_range ()
95 {
96         return mono_exception_from_name (mono_defaults.corlib, "System",
97                                          "IndexOutOfRangeException");
98 }
99
100 MonoException *
101 mono_get_exception_array_type_mismatch ()
102 {
103         return mono_exception_from_name (mono_defaults.corlib, "System",
104                                          "ArrayTypeMismatchException");
105 }
106
107 MonoException *
108 mono_get_exception_type_load ()
109 {
110         return mono_exception_from_name (mono_defaults.corlib, "System",
111                                          "TypeLoadException");
112 }
113
114 MonoException *
115 mono_get_exception_not_implemented ()
116 {
117         return mono_exception_from_name (mono_defaults.corlib, "System",
118                                          "NotImplementedException");
119 }
120
121 MonoException *
122 mono_get_exception_missing_method ()
123 {
124         return mono_exception_from_name (mono_defaults.corlib, "System",
125                                          "MissingMethodException");
126 }
127
128 MonoException*
129 mono_get_exception_argument_null (const guchar *arg)
130 {
131         MonoException *ex;
132         MonoDomain *domain;
133
134         ex = (MonoException *)mono_exception_from_name ( 
135                 mono_defaults.corlib, "System", "ArgumentNullException");
136
137         domain = ((MonoObject *)ex)->vtable->domain;
138
139         if (arg)
140                 ((MonoArgumentException *)ex)->param_name =
141                         mono_string_new (domain, arg);
142         
143         return ex;
144 }
145
146 MonoException *
147 mono_get_exception_argument (const guchar *arg, const guchar *msg)
148 {
149         MonoException *ex;
150         MonoDomain *domain;
151
152         ex = (MonoException *)mono_exception_from_name (
153                 mono_defaults.corlib, "System", "ArgumentException");
154
155         domain = ((MonoObject *)ex)->vtable->domain;
156
157         if (msg)
158                 ex->message = mono_string_new (domain, msg);
159         
160         if (arg)
161                 ((MonoArgumentException *)ex)->param_name =
162                         mono_string_new (domain, arg);
163         
164         return ex;
165 }
166
167 MonoException *
168 mono_get_exception_argument_out_of_range (const guchar *arg)
169 {
170         MonoException *ex;
171         MonoDomain *domain;
172
173         ex = (MonoException *)mono_exception_from_name (
174                 mono_defaults.corlib, "System", "ArgumentOutOfRangeException");
175
176         domain = ((MonoObject *)ex)->vtable->domain;
177
178         if (arg)
179                 ((MonoArgumentException *)ex)->param_name =
180                         mono_string_new (domain, arg);
181         
182         return ex;
183 }
184
185 MonoException *
186 mono_get_exception_io (const guchar *msg)
187 {
188         MonoException *ex;
189         MonoDomain *domain;
190
191         ex=(MonoException *)mono_exception_from_name ( 
192                 mono_defaults.corlib, "System.IO", "IOException");
193
194         domain = ((MonoObject *)ex)->vtable->domain;
195
196         ex->message=mono_string_new (domain, msg);
197         
198         return(ex);
199 }
200
201