comparison Python/errors.c @ 61467:f197407bdba2 3.1

Recorded merge of revisions 81032 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r81032 | antoine.pitrou | 2010-05-09 17:52:27 +0200 (dim., 09 mai 2010) | 9 lines Recorded merge of revisions 81029 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r81029 | antoine.pitrou | 2010-05-09 16:46:46 +0200 (dim., 09 mai 2010) | 3 lines Untabify C files. Will watch buildbots. ........ ................
author Antoine Pitrou <solipsis@pitrou.net>
date Sun, 09 May 2010 16:14:21 +0000
parents 77cfef596d33
children c6d86439aa91
comparison
equal deleted inserted replaced
61459:f8c19c5f5dd2 61467:f197407bdba2
22 22
23 23
24 void 24 void
25 PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback) 25 PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
26 { 26 {
27 PyThreadState *tstate = PyThreadState_GET(); 27 PyThreadState *tstate = PyThreadState_GET();
28 PyObject *oldtype, *oldvalue, *oldtraceback; 28 PyObject *oldtype, *oldvalue, *oldtraceback;
29 29
30 if (traceback != NULL && !PyTraceBack_Check(traceback)) { 30 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
31 /* XXX Should never happen -- fatal error instead? */ 31 /* XXX Should never happen -- fatal error instead? */
32 /* Well, it could be None. */ 32 /* Well, it could be None. */
33 Py_DECREF(traceback); 33 Py_DECREF(traceback);
34 traceback = NULL; 34 traceback = NULL;
35 } 35 }
36 36
37 /* Save these in locals to safeguard against recursive 37 /* Save these in locals to safeguard against recursive
38 invocation through Py_XDECREF */ 38 invocation through Py_XDECREF */
39 oldtype = tstate->curexc_type; 39 oldtype = tstate->curexc_type;
40 oldvalue = tstate->curexc_value; 40 oldvalue = tstate->curexc_value;
41 oldtraceback = tstate->curexc_traceback; 41 oldtraceback = tstate->curexc_traceback;
42 42
43 tstate->curexc_type = type; 43 tstate->curexc_type = type;
44 tstate->curexc_value = value; 44 tstate->curexc_value = value;
45 tstate->curexc_traceback = traceback; 45 tstate->curexc_traceback = traceback;
46 46
47 Py_XDECREF(oldtype); 47 Py_XDECREF(oldtype);
48 Py_XDECREF(oldvalue); 48 Py_XDECREF(oldvalue);
49 Py_XDECREF(oldtraceback); 49 Py_XDECREF(oldtraceback);
50 } 50 }
51 51
52 void 52 void
53 PyErr_SetObject(PyObject *exception, PyObject *value) 53 PyErr_SetObject(PyObject *exception, PyObject *value)
54 { 54 {
55 PyThreadState *tstate = PyThreadState_GET(); 55 PyThreadState *tstate = PyThreadState_GET();
56 PyObject *exc_value; 56 PyObject *exc_value;
57 PyObject *tb = NULL; 57 PyObject *tb = NULL;
58 58
59 if (exception != NULL && 59 if (exception != NULL &&
60 !PyExceptionClass_Check(exception)) { 60 !PyExceptionClass_Check(exception)) {
61 PyErr_Format(PyExc_SystemError, 61 PyErr_Format(PyExc_SystemError,
62 "exception %R not a BaseException subclass", 62 "exception %R not a BaseException subclass",
63 exception); 63 exception);
64 return; 64 return;
65 } 65 }
66 Py_XINCREF(value); 66 Py_XINCREF(value);
67 exc_value = tstate->exc_value; 67 exc_value = tstate->exc_value;
68 if (exc_value != NULL && exc_value != Py_None) { 68 if (exc_value != NULL && exc_value != Py_None) {
69 /* Implicit exception chaining */ 69 /* Implicit exception chaining */
70 Py_INCREF(exc_value); 70 Py_INCREF(exc_value);
71 if (value == NULL || !PyExceptionInstance_Check(value)) { 71 if (value == NULL || !PyExceptionInstance_Check(value)) {
72 /* We must normalize the value right now */ 72 /* We must normalize the value right now */
73 PyObject *args, *fixed_value; 73 PyObject *args, *fixed_value;
74 if (value == NULL || value == Py_None) 74 if (value == NULL || value == Py_None)
75 args = PyTuple_New(0); 75 args = PyTuple_New(0);
76 else if (PyTuple_Check(value)) { 76 else if (PyTuple_Check(value)) {
77 Py_INCREF(value); 77 Py_INCREF(value);
78 args = value; 78 args = value;
79 } 79 }
80 else 80 else
81 args = PyTuple_Pack(1, value); 81 args = PyTuple_Pack(1, value);
82 fixed_value = args ? 82 fixed_value = args ?
83 PyEval_CallObject(exception, args) : NULL; 83 PyEval_CallObject(exception, args) : NULL;
84 Py_XDECREF(args); 84 Py_XDECREF(args);
85 Py_XDECREF(value); 85 Py_XDECREF(value);
86 if (fixed_value == NULL) 86 if (fixed_value == NULL)
87 return; 87 return;
88 value = fixed_value; 88 value = fixed_value;
89 } 89 }
90 /* Avoid reference cycles through the context chain. 90 /* Avoid reference cycles through the context chain.
91 This is O(chain length) but context chains are 91 This is O(chain length) but context chains are
92 usually very short. Sensitive readers may try 92 usually very short. Sensitive readers may try
93 to inline the call to PyException_GetContext. */ 93 to inline the call to PyException_GetContext. */
94 if (exc_value != value) { 94 if (exc_value != value) {
95 PyObject *o = exc_value, *context; 95 PyObject *o = exc_value, *context;
96 while ((context = PyException_GetContext(o))) { 96 while ((context = PyException_GetContext(o))) {
97 Py_DECREF(context); 97 Py_DECREF(context);
98 if (context == value) { 98 if (context == value) {
99 PyException_SetContext(o, NULL); 99 PyException_SetContext(o, NULL);
100 break; 100 break;
101 } 101 }
102 o = context; 102 o = context;
103 } 103 }
104 PyException_SetContext(value, exc_value); 104 PyException_SetContext(value, exc_value);
105 } else { 105 } else {
106 Py_DECREF(exc_value); 106 Py_DECREF(exc_value);
107 } 107 }
108 } 108 }
109 if (value != NULL && PyExceptionInstance_Check(value)) 109 if (value != NULL && PyExceptionInstance_Check(value))
110 tb = PyException_GetTraceback(value); 110 tb = PyException_GetTraceback(value);
111 Py_XINCREF(exception); 111 Py_XINCREF(exception);
112 PyErr_Restore(exception, value, tb); 112 PyErr_Restore(exception, value, tb);
113 } 113 }
114 114
115 void 115 void
116 PyErr_SetNone(PyObject *exception) 116 PyErr_SetNone(PyObject *exception)
117 { 117 {
118 PyErr_SetObject(exception, (PyObject *)NULL); 118 PyErr_SetObject(exception, (PyObject *)NULL);
119 } 119 }
120 120
121 void 121 void
122 PyErr_SetString(PyObject *exception, const char *string) 122 PyErr_SetString(PyObject *exception, const char *string)
123 { 123 {
124 PyObject *value = PyUnicode_FromString(string); 124 PyObject *value = PyUnicode_FromString(string);
125 PyErr_SetObject(exception, value); 125 PyErr_SetObject(exception, value);
126 Py_XDECREF(value); 126 Py_XDECREF(value);
127 } 127 }
128 128
129 129
130 PyObject * 130 PyObject *
131 PyErr_Occurred(void) 131 PyErr_Occurred(void)
132 { 132 {
133 PyThreadState *tstate = PyThreadState_GET(); 133 PyThreadState *tstate = PyThreadState_GET();
134 134
135 return tstate->curexc_type; 135 return tstate->curexc_type;
136 } 136 }
137 137
138 138
139 int 139 int
140 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc) 140 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
141 { 141 {
142 if (err == NULL || exc == NULL) { 142 if (err == NULL || exc == NULL) {
143 /* maybe caused by "import exceptions" that failed early on */ 143 /* maybe caused by "import exceptions" that failed early on */
144 return 0; 144 return 0;
145 } 145 }
146 if (PyTuple_Check(exc)) { 146 if (PyTuple_Check(exc)) {
147 Py_ssize_t i, n; 147 Py_ssize_t i, n;
148 n = PyTuple_Size(exc); 148 n = PyTuple_Size(exc);
149 for (i = 0; i < n; i++) { 149 for (i = 0; i < n; i++) {
150 /* Test recursively */ 150 /* Test recursively */
151 if (PyErr_GivenExceptionMatches( 151 if (PyErr_GivenExceptionMatches(
152 err, PyTuple_GET_ITEM(exc, i))) 152 err, PyTuple_GET_ITEM(exc, i)))
153 { 153 {
154 return 1; 154 return 1;
155 } 155 }
156 } 156 }
157 return 0; 157 return 0;
158 } 158 }
159 /* err might be an instance, so check its class. */ 159 /* err might be an instance, so check its class. */
160 if (PyExceptionInstance_Check(err)) 160 if (PyExceptionInstance_Check(err))
161 err = PyExceptionInstance_Class(err); 161 err = PyExceptionInstance_Class(err);
162 162
163 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) { 163 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
164 int res = 0; 164 int res = 0;
165 PyObject *exception, *value, *tb; 165 PyObject *exception, *value, *tb;
166 PyErr_Fetch(&exception, &value, &tb); 166 PyErr_Fetch(&exception, &value, &tb);
167 /* PyObject_IsSubclass() can recurse and therefore is 167 /* PyObject_IsSubclass() can recurse and therefore is
168 not safe (see test_bad_getattr in test.pickletester). */ 168 not safe (see test_bad_getattr in test.pickletester). */
169 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc); 169 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
170 /* This function must not fail, so print the error here */ 170 /* This function must not fail, so print the error here */
171 if (res == -1) { 171 if (res == -1) {
172 PyErr_WriteUnraisable(err); 172 PyErr_WriteUnraisable(err);
173 res = 0; 173 res = 0;
174 } 174 }
175 PyErr_Restore(exception, value, tb); 175 PyErr_Restore(exception, value, tb);
176 return res; 176 return res;
177 } 177 }
178 178
179 return err == exc; 179 return err == exc;
180 } 180 }
181 181
182 182
183 int 183 int
184 PyErr_ExceptionMatches(PyObject *exc) 184 PyErr_ExceptionMatches(PyObject *exc)
185 { 185 {
186 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc); 186 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
187 } 187 }
188 188
189 189
190 /* Used in many places to normalize a raised exception, including in 190 /* Used in many places to normalize a raised exception, including in
191 eval_code2(), do_raise(), and PyErr_Print() 191 eval_code2(), do_raise(), and PyErr_Print()
192 192
193 XXX: should PyErr_NormalizeException() also call 193 XXX: should PyErr_NormalizeException() also call
194 PyException_SetTraceback() with the resulting value and tb? 194 PyException_SetTraceback() with the resulting value and tb?
195 */ 195 */
196 void 196 void
197 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) 197 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
198 { 198 {
199 PyObject *type = *exc; 199 PyObject *type = *exc;
200 PyObject *value = *val; 200 PyObject *value = *val;
201 PyObject *inclass = NULL; 201 PyObject *inclass = NULL;
202 PyObject *initial_tb = NULL; 202 PyObject *initial_tb = NULL;
203 PyThreadState *tstate = NULL; 203 PyThreadState *tstate = NULL;
204 204
205 if (type == NULL) { 205 if (type == NULL) {
206 /* There was no exception, so nothing to do. */ 206 /* There was no exception, so nothing to do. */
207 return; 207 return;
208 } 208 }
209 209
210 /* If PyErr_SetNone() was used, the value will have been actually 210 /* If PyErr_SetNone() was used, the value will have been actually
211 set to NULL. 211 set to NULL.
212 */ 212 */
213 if (!value) { 213 if (!value) {
214 value = Py_None; 214 value = Py_None;
215 Py_INCREF(value); 215 Py_INCREF(value);
216 } 216 }
217 217
218 if (PyExceptionInstance_Check(value)) 218 if (PyExceptionInstance_Check(value))
219 inclass = PyExceptionInstance_Class(value); 219 inclass = PyExceptionInstance_Class(value);
220 220
221 /* Normalize the exception so that if the type is a class, the 221 /* Normalize the exception so that if the type is a class, the
222 value will be an instance. 222 value will be an instance.
223 */ 223 */
224 if (PyExceptionClass_Check(type)) { 224 if (PyExceptionClass_Check(type)) {
225 /* if the value was not an instance, or is not an instance 225 /* if the value was not an instance, or is not an instance
226 whose class is (or is derived from) type, then use the 226 whose class is (or is derived from) type, then use the
227 value as an argument to instantiation of the type 227 value as an argument to instantiation of the type
228 class. 228 class.
229 */ 229 */
230 if (!inclass || !PyObject_IsSubclass(inclass, type)) { 230 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
231 PyObject *args, *res; 231 PyObject *args, *res;
232 232
233 if (value == Py_None) 233 if (value == Py_None)
234 args = PyTuple_New(0); 234 args = PyTuple_New(0);
235 else if (PyTuple_Check(value)) { 235 else if (PyTuple_Check(value)) {
236 Py_INCREF(value); 236 Py_INCREF(value);
237 args = value; 237 args = value;
238 } 238 }
239 else 239 else
240 args = PyTuple_Pack(1, value); 240 args = PyTuple_Pack(1, value);
241 241
242 if (args == NULL) 242 if (args == NULL)
243 goto finally; 243 goto finally;
244 res = PyEval_CallObject(type, args); 244 res = PyEval_CallObject(type, args);
245 Py_DECREF(args); 245 Py_DECREF(args);
246 if (res == NULL) 246 if (res == NULL)
247 goto finally; 247 goto finally;
248 Py_DECREF(value); 248 Py_DECREF(value);
249 value = res; 249 value = res;
250 } 250 }
251 /* if the class of the instance doesn't exactly match the 251 /* if the class of the instance doesn't exactly match the
252 class of the type, believe the instance 252 class of the type, believe the instance
253 */ 253 */
254 else if (inclass != type) { 254 else if (inclass != type) {
255 Py_DECREF(type); 255 Py_DECREF(type);
256 type = inclass; 256 type = inclass;
257 Py_INCREF(type); 257 Py_INCREF(type);
258 } 258 }
259 } 259 }
260 *exc = type; 260 *exc = type;
261 *val = value; 261 *val = value;
262 return; 262 return;
263 finally: 263 finally:
264 Py_DECREF(type); 264 Py_DECREF(type);
265 Py_DECREF(value); 265 Py_DECREF(value);
266 /* If the new exception doesn't set a traceback and the old 266 /* If the new exception doesn't set a traceback and the old
267 exception had a traceback, use the old traceback for the 267 exception had a traceback, use the old traceback for the
268 new exception. It's better than nothing. 268 new exception. It's better than nothing.
269 */ 269 */
270 initial_tb = *tb; 270 initial_tb = *tb;
271 PyErr_Fetch(exc, val, tb); 271 PyErr_Fetch(exc, val, tb);
272 if (initial_tb != NULL) { 272 if (initial_tb != NULL) {
273 if (*tb == NULL) 273 if (*tb == NULL)
274 *tb = initial_tb; 274 *tb = initial_tb;
275 else 275 else
276 Py_DECREF(initial_tb); 276 Py_DECREF(initial_tb);
277 } 277 }
278 /* normalize recursively */ 278 /* normalize recursively */
279 tstate = PyThreadState_GET(); 279 tstate = PyThreadState_GET();
280 if (++tstate->recursion_depth > Py_GetRecursionLimit()) { 280 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
281 --tstate->recursion_depth; 281 --tstate->recursion_depth;
282 /* throw away the old exception... */ 282 /* throw away the old exception... */
283 Py_DECREF(*exc); 283 Py_DECREF(*exc);
284 Py_DECREF(*val); 284 Py_DECREF(*val);
285 /* ... and use the recursion error instead */ 285 /* ... and use the recursion error instead */
286 *exc = PyExc_RuntimeError; 286 *exc = PyExc_RuntimeError;
287 *val = PyExc_RecursionErrorInst; 287 *val = PyExc_RecursionErrorInst;
288 Py_INCREF(*exc); 288 Py_INCREF(*exc);
289 Py_INCREF(*val); 289 Py_INCREF(*val);
290 /* just keeping the old traceback */ 290 /* just keeping the old traceback */
291 return; 291 return;
292 } 292 }
293 PyErr_NormalizeException(exc, val, tb); 293 PyErr_NormalizeException(exc, val, tb);
294 --tstate->recursion_depth; 294 --tstate->recursion_depth;
295 } 295 }
296 296
297 297
298 void 298 void
299 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback) 299 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
300 { 300 {
301 PyThreadState *tstate = PyThreadState_GET(); 301 PyThreadState *tstate = PyThreadState_GET();
302 302
303 *p_type = tstate->curexc_type; 303 *p_type = tstate->curexc_type;
304 *p_value = tstate->curexc_value; 304 *p_value = tstate->curexc_value;
305 *p_traceback = tstate->curexc_traceback; 305 *p_traceback = tstate->curexc_traceback;
306 306
307 tstate->curexc_type = NULL; 307 tstate->curexc_type = NULL;
308 tstate->curexc_value = NULL; 308 tstate->curexc_value = NULL;
309 tstate->curexc_traceback = NULL; 309 tstate->curexc_traceback = NULL;
310 } 310 }
311 311
312 void 312 void
313 PyErr_Clear(void) 313 PyErr_Clear(void)
314 { 314 {
315 PyErr_Restore(NULL, NULL, NULL); 315 PyErr_Restore(NULL, NULL, NULL);
316 } 316 }
317 317
318 /* Convenience functions to set a type error exception and return 0 */ 318 /* Convenience functions to set a type error exception and return 0 */
319 319
320 int 320 int
321 PyErr_BadArgument(void) 321 PyErr_BadArgument(void)
322 { 322 {
323 PyErr_SetString(PyExc_TypeError, 323 PyErr_SetString(PyExc_TypeError,
324 "bad argument type for built-in operation"); 324 "bad argument type for built-in operation");
325 return 0; 325 return 0;
326 } 326 }
327 327
328 PyObject * 328 PyObject *
329 PyErr_NoMemory(void) 329 PyErr_NoMemory(void)
330 { 330 {
331 if (PyErr_ExceptionMatches(PyExc_MemoryError)) 331 if (PyErr_ExceptionMatches(PyExc_MemoryError))
332 /* already current */ 332 /* already current */
333 return NULL; 333 return NULL;
334 334
335 /* raise the pre-allocated instance if it still exists */ 335 /* raise the pre-allocated instance if it still exists */
336 if (PyExc_MemoryErrorInst) 336 if (PyExc_MemoryErrorInst)
337 { 337 {
338 /* Clear the previous traceback, otherwise it will be appended 338 /* Clear the previous traceback, otherwise it will be appended
339 * to the current one. 339 * to the current one.
340 * 340 *
341 * The following statement is not likely to raise any error; 341 * The following statement is not likely to raise any error;
342 * if it does, we simply discard it. 342 * if it does, we simply discard it.
343 */ 343 */
344 PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None); 344 PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None);
345 345
346 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst); 346 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
347 } 347 }
348 else 348 else
349 /* this will probably fail since there's no memory and hee, 349 /* this will probably fail since there's no memory and hee,
350 hee, we have to instantiate this class 350 hee, we have to instantiate this class
351 */ 351 */
352 PyErr_SetNone(PyExc_MemoryError); 352 PyErr_SetNone(PyExc_MemoryError);
353 353
354 return NULL; 354 return NULL;
355 } 355 }
356 356
357 PyObject * 357 PyObject *
358 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) 358 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
359 { 359 {
360 PyObject *message; 360 PyObject *message;
361 PyObject *v; 361 PyObject *v;
362 int i = errno; 362 int i = errno;
363 #ifdef PLAN9 363 #ifdef PLAN9
364 char errbuf[ERRMAX]; 364 char errbuf[ERRMAX];
365 #else 365 #else
366 #ifndef MS_WINDOWS 366 #ifndef MS_WINDOWS
367 char *s; 367 char *s;
368 #else 368 #else
369 WCHAR *s_buf = NULL; 369 WCHAR *s_buf = NULL;
370 #endif /* Unix/Windows */ 370 #endif /* Unix/Windows */
371 #endif /* PLAN 9*/ 371 #endif /* PLAN 9*/
372 372
373 #ifdef EINTR 373 #ifdef EINTR
374 if (i == EINTR && PyErr_CheckSignals()) 374 if (i == EINTR && PyErr_CheckSignals())
375 return NULL; 375 return NULL;
376 #endif 376 #endif
377 377
378 #ifdef PLAN9 378 #ifdef PLAN9
379 rerrstr(errbuf, sizeof errbuf); 379 rerrstr(errbuf, sizeof errbuf);
380 message = PyUnicode_DecodeUTF8(errbuf, strlen(errbuf), "ignore"); 380 message = PyUnicode_DecodeUTF8(errbuf, strlen(errbuf), "ignore");
381 #else 381 #else
382 #ifndef MS_WINDOWS 382 #ifndef MS_WINDOWS
383 if (i == 0) 383 if (i == 0)
384 s = "Error"; /* Sometimes errno didn't get set */ 384 s = "Error"; /* Sometimes errno didn't get set */
385 else 385 else
386 s = strerror(i); 386 s = strerror(i);
387 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore"); 387 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
388 #else 388 #else
389 if (i == 0) 389 if (i == 0)
390 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */ 390 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
391 else 391 else
392 { 392 {
393 /* Note that the Win32 errors do not lineup with the 393 /* Note that the Win32 errors do not lineup with the
394 errno error. So if the error is in the MSVC error 394 errno error. So if the error is in the MSVC error
395 table, we use it, otherwise we assume it really _is_ 395 table, we use it, otherwise we assume it really _is_
396 a Win32 error code 396 a Win32 error code
397 */ 397 */
398 if (i > 0 && i < _sys_nerr) { 398 if (i > 0 && i < _sys_nerr) {
399 message = PyUnicode_FromString(_sys_errlist[i]); 399 message = PyUnicode_FromString(_sys_errlist[i]);
400 } 400 }
401 else { 401 else {
402 int len = FormatMessageW( 402 int len = FormatMessageW(
403 FORMAT_MESSAGE_ALLOCATE_BUFFER | 403 FORMAT_MESSAGE_ALLOCATE_BUFFER |
404 FORMAT_MESSAGE_FROM_SYSTEM | 404 FORMAT_MESSAGE_FROM_SYSTEM |
405 FORMAT_MESSAGE_IGNORE_INSERTS, 405 FORMAT_MESSAGE_IGNORE_INSERTS,
406 NULL, /* no message source */ 406 NULL, /* no message source */
407 i, 407 i,
408 MAKELANGID(LANG_NEUTRAL, 408 MAKELANGID(LANG_NEUTRAL,
409 SUBLANG_DEFAULT), 409 SUBLANG_DEFAULT),
410 /* Default language */ 410 /* Default language */
411 (LPWSTR) &s_buf, 411 (LPWSTR) &s_buf,
412 0, /* size not used */ 412 0, /* size not used */
413 NULL); /* no args */ 413 NULL); /* no args */
414 if (len==0) { 414 if (len==0) {
415 /* Only ever seen this in out-of-mem 415 /* Only ever seen this in out-of-mem
416 situations */ 416 situations */
417 s_buf = NULL; 417 s_buf = NULL;
418 message = PyUnicode_FromFormat("Windows Error 0x%X", i); 418 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
419 } else { 419 } else {
420 /* remove trailing cr/lf and dots */ 420 /* remove trailing cr/lf and dots */
421 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.')) 421 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
422 s_buf[--len] = L'\0'; 422 s_buf[--len] = L'\0';
423 message = PyUnicode_FromUnicode(s_buf, len); 423 message = PyUnicode_FromUnicode(s_buf, len);
424 } 424 }
425 } 425 }
426 } 426 }
427 #endif /* Unix/Windows */ 427 #endif /* Unix/Windows */
428 #endif /* PLAN 9*/ 428 #endif /* PLAN 9*/
429 429
430 if (message == NULL) 430 if (message == NULL)
431 { 431 {
432 #ifdef MS_WINDOWS 432 #ifdef MS_WINDOWS
433 LocalFree(s_buf); 433 LocalFree(s_buf);
434 #endif 434 #endif
435 return NULL; 435 return NULL;
436 } 436 }
437 437
438 if (filenameObject != NULL) 438 if (filenameObject != NULL)
439 v = Py_BuildValue("(iOO)", i, message, filenameObject); 439 v = Py_BuildValue("(iOO)", i, message, filenameObject);
440 else 440 else
441 v = Py_BuildValue("(iO)", i, message); 441 v = Py_BuildValue("(iO)", i, message);
442 Py_DECREF(message); 442 Py_DECREF(message);
443 443
444 if (v != NULL) { 444 if (v != NULL) {
445 PyErr_SetObject(exc, v); 445 PyErr_SetObject(exc, v);
446 Py_DECREF(v); 446 Py_DECREF(v);
447 } 447 }
448 #ifdef MS_WINDOWS 448 #ifdef MS_WINDOWS
449 LocalFree(s_buf); 449 LocalFree(s_buf);
450 #endif 450 #endif
451 return NULL; 451 return NULL;
452 } 452 }
453 453
454 454
455 PyObject * 455 PyObject *
456 PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename) 456 PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
457 { 457 {
458 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL; 458 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
459 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); 459 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
460 Py_XDECREF(name); 460 Py_XDECREF(name);
461 return result; 461 return result;
462 } 462 }
463 463
464 #ifdef MS_WINDOWS 464 #ifdef MS_WINDOWS
465 PyObject * 465 PyObject *
466 PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename) 466 PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
467 { 467 {
468 PyObject *name = filename ? 468 PyObject *name = filename ?
469 PyUnicode_FromUnicode(filename, wcslen(filename)) : 469 PyUnicode_FromUnicode(filename, wcslen(filename)) :
470 NULL; 470 NULL;
471 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name); 471 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
472 Py_XDECREF(name); 472 Py_XDECREF(name);
473 return result; 473 return result;
474 } 474 }
475 #endif /* MS_WINDOWS */ 475 #endif /* MS_WINDOWS */
476 476
477 PyObject * 477 PyObject *
478 PyErr_SetFromErrno(PyObject *exc) 478 PyErr_SetFromErrno(PyObject *exc)
479 { 479 {
480 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL); 480 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
481 } 481 }
482 482
483 #ifdef MS_WINDOWS 483 #ifdef MS_WINDOWS
484 /* Windows specific error code handling */ 484 /* Windows specific error code handling */
485 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( 485 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
486 PyObject *exc, 486 PyObject *exc,
487 int ierr, 487 int ierr,
488 PyObject *filenameObject) 488 PyObject *filenameObject)
489 { 489 {
490 int len; 490 int len;
491 WCHAR *s_buf = NULL; /* Free via LocalFree */ 491 WCHAR *s_buf = NULL; /* Free via LocalFree */
492 PyObject *message; 492 PyObject *message;
493 PyObject *v; 493 PyObject *v;
494 DWORD err = (DWORD)ierr; 494 DWORD err = (DWORD)ierr;
495 if (err==0) err = GetLastError(); 495 if (err==0) err = GetLastError();
496 len = FormatMessageW( 496 len = FormatMessageW(
497 /* Error API error */ 497 /* Error API error */
498 FORMAT_MESSAGE_ALLOCATE_BUFFER | 498 FORMAT_MESSAGE_ALLOCATE_BUFFER |
499 FORMAT_MESSAGE_FROM_SYSTEM | 499 FORMAT_MESSAGE_FROM_SYSTEM |
500 FORMAT_MESSAGE_IGNORE_INSERTS, 500 FORMAT_MESSAGE_IGNORE_INSERTS,
501 NULL, /* no message source */ 501 NULL, /* no message source */
502 err, 502 err,
503 MAKELANGID(LANG_NEUTRAL, 503 MAKELANGID(LANG_NEUTRAL,
504 SUBLANG_DEFAULT), /* Default language */ 504 SUBLANG_DEFAULT), /* Default language */
505 (LPWSTR) &s_buf, 505 (LPWSTR) &s_buf,
506 0, /* size not used */ 506 0, /* size not used */
507 NULL); /* no args */ 507 NULL); /* no args */
508 if (len==0) { 508 if (len==0) {
509 /* Only seen this in out of mem situations */ 509 /* Only seen this in out of mem situations */
510 message = PyUnicode_FromFormat("Windows Error 0x%X", err); 510 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
511 s_buf = NULL; 511 s_buf = NULL;
512 } else { 512 } else {
513 /* remove trailing cr/lf and dots */ 513 /* remove trailing cr/lf and dots */
514 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.')) 514 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
515 s_buf[--len] = L'\0'; 515 s_buf[--len] = L'\0';
516 message = PyUnicode_FromUnicode(s_buf, len); 516 message = PyUnicode_FromUnicode(s_buf, len);
517 } 517 }
518 518
519 if (message == NULL) 519 if (message == NULL)
520 { 520 {
521 LocalFree(s_buf); 521 LocalFree(s_buf);
522 return NULL; 522 return NULL;
523 } 523 }
524 524
525 if (filenameObject != NULL) 525 if (filenameObject != NULL)
526 v = Py_BuildValue("(iOO)", err, message, filenameObject); 526 v = Py_BuildValue("(iOO)", err, message, filenameObject);
527 else 527 else
528 v = Py_BuildValue("(iO)", err, message); 528 v = Py_BuildValue("(iO)", err, message);
529 Py_DECREF(message); 529 Py_DECREF(message);
530 530
531 if (v != NULL) { 531 if (v != NULL) {
532 PyErr_SetObject(exc, v); 532 PyErr_SetObject(exc, v);
533 Py_DECREF(v); 533 Py_DECREF(v);
534 } 534 }
535 LocalFree(s_buf); 535 LocalFree(s_buf);
536 return NULL; 536 return NULL;
537 } 537 }
538 538
539 PyObject *PyErr_SetExcFromWindowsErrWithFilename( 539 PyObject *PyErr_SetExcFromWindowsErrWithFilename(
540 PyObject *exc, 540 PyObject *exc,
541 int ierr, 541 int ierr,
542 const char *filename) 542 const char *filename)
543 { 543 {
544 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL; 544 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
545 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, 545 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
546 ierr, 546 ierr,
547 name); 547 name);
548 Py_XDECREF(name); 548 Py_XDECREF(name);
549 return ret; 549 return ret;
550 } 550 }
551 551
552 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename( 552 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
553 PyObject *exc, 553 PyObject *exc,
554 int ierr, 554 int ierr,
555 const Py_UNICODE *filename) 555 const Py_UNICODE *filename)
556 { 556 {
557 PyObject *name = filename ? 557 PyObject *name = filename ?
558 PyUnicode_FromUnicode(filename, wcslen(filename)) : 558 PyUnicode_FromUnicode(filename, wcslen(filename)) :
559 NULL; 559 NULL;
560 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc, 560 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
561 ierr, 561 ierr,
562 name); 562 name);
563 Py_XDECREF(name); 563 Py_XDECREF(name);
564 return ret; 564 return ret;
565 } 565 }
566 566
567 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr) 567 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
568 { 568 {
569 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL); 569 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
570 } 570 }
571 571
572 PyObject *PyErr_SetFromWindowsErr(int ierr) 572 PyObject *PyErr_SetFromWindowsErr(int ierr)
573 { 573 {
574 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError, 574 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
575 ierr, NULL); 575 ierr, NULL);
576 } 576 }
577 PyObject *PyErr_SetFromWindowsErrWithFilename( 577 PyObject *PyErr_SetFromWindowsErrWithFilename(
578 int ierr, 578 int ierr,
579 const char *filename) 579 const char *filename)
580 { 580 {
581 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL; 581 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
582 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( 582 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
583 PyExc_WindowsError, 583 PyExc_WindowsError,
584 ierr, name); 584 ierr, name);
585 Py_XDECREF(name); 585 Py_XDECREF(name);
586 return result; 586 return result;
587 } 587 }
588 588
589 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename( 589 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
590 int ierr, 590 int ierr,
591 const Py_UNICODE *filename) 591 const Py_UNICODE *filename)
592 { 592 {
593 PyObject *name = filename ? 593 PyObject *name = filename ?
594 PyUnicode_FromUnicode(filename, wcslen(filename)) : 594 PyUnicode_FromUnicode(filename, wcslen(filename)) :
595 NULL; 595 NULL;
596 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject( 596 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
597 PyExc_WindowsError, 597 PyExc_WindowsError,
598 ierr, name); 598 ierr, name);
599 Py_XDECREF(name); 599 Py_XDECREF(name);
600 return result; 600 return result;
601 } 601 }
602 #endif /* MS_WINDOWS */ 602 #endif /* MS_WINDOWS */
603 603
604 void 604 void
605 _PyErr_BadInternalCall(const char *filename, int lineno) 605 _PyErr_BadInternalCall(const char *filename, int lineno)
606 { 606 {
607 PyErr_Format(PyExc_SystemError, 607 PyErr_Format(PyExc_SystemError,
608 "%s:%d: bad argument to internal function", 608 "%s:%d: bad argument to internal function",
609 filename, lineno); 609 filename, lineno);
610 } 610 }
611 611
612 /* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can 612 /* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
613 export the entry point for existing object code: */ 613 export the entry point for existing object code: */
614 #undef PyErr_BadInternalCall 614 #undef PyErr_BadInternalCall
615 void 615 void
616 PyErr_BadInternalCall(void) 616 PyErr_BadInternalCall(void)
617 { 617 {
618 PyErr_Format(PyExc_SystemError, 618 PyErr_Format(PyExc_SystemError,
619 "bad argument to internal function"); 619 "bad argument to internal function");
620 } 620 }
621 #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) 621 #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
622 622
623 623
624 624
625 PyObject * 625 PyObject *
626 PyErr_Format(PyObject *exception, const char *format, ...) 626 PyErr_Format(PyObject *exception, const char *format, ...)
627 { 627 {
628 va_list vargs; 628 va_list vargs;
629 PyObject* string; 629 PyObject* string;
630 630
631 #ifdef HAVE_STDARG_PROTOTYPES 631 #ifdef HAVE_STDARG_PROTOTYPES
632 va_start(vargs, format); 632 va_start(vargs, format);
633 #else 633 #else
634 va_start(vargs); 634 va_start(vargs);
635 #endif 635 #endif
636 636
637 string = PyUnicode_FromFormatV(format, vargs); 637 string = PyUnicode_FromFormatV(format, vargs);
638 PyErr_SetObject(exception, string); 638 PyErr_SetObject(exception, string);
639 Py_XDECREF(string); 639 Py_XDECREF(string);
640 va_end(vargs); 640 va_end(vargs);
641 return NULL; 641 return NULL;
642 } 642 }
643 643
644 644
645 645
646 PyObject * 646 PyObject *
647 PyErr_NewException(const char *name, PyObject *base, PyObject *dict) 647 PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
648 { 648 {
649 const char *dot; 649 const char *dot;
650 PyObject *modulename = NULL; 650 PyObject *modulename = NULL;
651 PyObject *classname = NULL; 651 PyObject *classname = NULL;
652 PyObject *mydict = NULL; 652 PyObject *mydict = NULL;
653 PyObject *bases = NULL; 653 PyObject *bases = NULL;
654 PyObject *result = NULL; 654 PyObject *result = NULL;
655 dot = strrchr(name, '.'); 655 dot = strrchr(name, '.');
656 if (dot == NULL) { 656 if (dot == NULL) {
657 PyErr_SetString(PyExc_SystemError, 657 PyErr_SetString(PyExc_SystemError,
658 "PyErr_NewException: name must be module.class"); 658 "PyErr_NewException: name must be module.class");
659 return NULL; 659 return NULL;
660 } 660 }
661 if (base == NULL) 661 if (base == NULL)
662 base = PyExc_Exception; 662 base = PyExc_Exception;
663 if (dict == NULL) { 663 if (dict == NULL) {
664 dict = mydict = PyDict_New(); 664 dict = mydict = PyDict_New();
665 if (dict == NULL) 665 if (dict == NULL)
666 goto failure; 666 goto failure;
667 } 667 }
668 if (PyDict_GetItemString(dict, "__module__") == NULL) { 668 if (PyDict_GetItemString(dict, "__module__") == NULL) {
669 modulename = PyUnicode_FromStringAndSize(name, 669 modulename = PyUnicode_FromStringAndSize(name,
670 (Py_ssize_t)(dot-name)); 670 (Py_ssize_t)(dot-name));
671 if (modulename == NULL) 671 if (modulename == NULL)
672 goto failure; 672 goto failure;
673 if (PyDict_SetItemString(dict, "__module__", modulename) != 0) 673 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
674 goto failure; 674 goto failure;
675 } 675 }
676 if (PyTuple_Check(base)) { 676 if (PyTuple_Check(base)) {
677 bases = base; 677 bases = base;
678 /* INCREF as we create a new ref in the else branch */ 678 /* INCREF as we create a new ref in the else branch */
679 Py_INCREF(bases); 679 Py_INCREF(bases);
680 } else { 680 } else {
681 bases = PyTuple_Pack(1, base); 681 bases = PyTuple_Pack(1, base);
682 if (bases == NULL) 682 if (bases == NULL)
683 goto failure; 683 goto failure;
684 } 684 }
685 /* Create a real new-style class. */ 685 /* Create a real new-style class. */
686 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO", 686 result = PyObject_CallFunction((PyObject *)&PyType_Type, "UOO",
687 dot+1, bases, dict); 687 dot+1, bases, dict);
688 failure: 688 failure:
689 Py_XDECREF(bases); 689 Py_XDECREF(bases);
690 Py_XDECREF(mydict); 690 Py_XDECREF(mydict);
691 Py_XDECREF(classname); 691 Py_XDECREF(classname);
692 Py_XDECREF(modulename); 692 Py_XDECREF(modulename);
693 return result; 693 return result;
694 } 694 }
695 695
696 /* Call when an exception has occurred but there is no way for Python 696 /* Call when an exception has occurred but there is no way for Python
697 to handle it. Examples: exception in __del__ or during GC. */ 697 to handle it. Examples: exception in __del__ or during GC. */
698 void 698 void
699 PyErr_WriteUnraisable(PyObject *obj) 699 PyErr_WriteUnraisable(PyObject *obj)
700 { 700 {
701 PyObject *f, *t, *v, *tb; 701 PyObject *f, *t, *v, *tb;
702 PyErr_Fetch(&t, &v, &tb); 702 PyErr_Fetch(&t, &v, &tb);
703 f = PySys_GetObject("stderr"); 703 f = PySys_GetObject("stderr");
704 if (f != NULL && f != Py_None) { 704 if (f != NULL && f != Py_None) {
705 PyFile_WriteString("Exception ", f); 705 PyFile_WriteString("Exception ", f);
706 if (t) { 706 if (t) {
707 PyObject* moduleName; 707 PyObject* moduleName;
708 char* className; 708 char* className;
709 assert(PyExceptionClass_Check(t)); 709 assert(PyExceptionClass_Check(t));
710 className = PyExceptionClass_Name(t); 710 className = PyExceptionClass_Name(t);
711 if (className != NULL) { 711 if (className != NULL) {
712 char *dot = strrchr(className, '.'); 712 char *dot = strrchr(className, '.');
713 if (dot != NULL) 713 if (dot != NULL)
714 className = dot+1; 714 className = dot+1;
715 } 715 }
716 716
717 moduleName = PyObject_GetAttrString(t, "__module__"); 717 moduleName = PyObject_GetAttrString(t, "__module__");
718 if (moduleName == NULL) 718 if (moduleName == NULL)
719 PyFile_WriteString("<unknown>", f); 719 PyFile_WriteString("<unknown>", f);
720 else { 720 else {
721 char* modstr = _PyUnicode_AsString(moduleName); 721 char* modstr = _PyUnicode_AsString(moduleName);
722 if (modstr && 722 if (modstr &&
723 strcmp(modstr, "builtins") != 0) 723 strcmp(modstr, "builtins") != 0)
724 { 724 {
725 PyFile_WriteString(modstr, f); 725 PyFile_WriteString(modstr, f);
726 PyFile_WriteString(".", f); 726 PyFile_WriteString(".", f);
727 } 727 }
728 } 728 }
729 if (className == NULL) 729 if (className == NULL)
730 PyFile_WriteString("<unknown>", f); 730 PyFile_WriteString("<unknown>", f);
731 else 731 else
732 PyFile_WriteString(className, f); 732 PyFile_WriteString(className, f);
733 if (v && v != Py_None) { 733 if (v && v != Py_None) {
734 PyFile_WriteString(": ", f); 734 PyFile_WriteString(": ", f);
735 PyFile_WriteObject(v, f, 0); 735 PyFile_WriteObject(v, f, 0);
736 } 736 }
737 Py_XDECREF(moduleName); 737 Py_XDECREF(moduleName);
738 } 738 }
739 PyFile_WriteString(" in ", f); 739 PyFile_WriteString(" in ", f);
740 PyFile_WriteObject(obj, f, 0); 740 PyFile_WriteObject(obj, f, 0);
741 PyFile_WriteString(" ignored\n", f); 741 PyFile_WriteString(" ignored\n", f);
742 PyErr_Clear(); /* Just in case */ 742 PyErr_Clear(); /* Just in case */
743 } 743 }
744 Py_XDECREF(t); 744 Py_XDECREF(t);
745 Py_XDECREF(v); 745 Py_XDECREF(v);
746 Py_XDECREF(tb); 746 Py_XDECREF(tb);
747 } 747 }
748 748
749 extern PyObject *PyModule_GetWarningsModule(void); 749 extern PyObject *PyModule_GetWarningsModule(void);
750 750
751 751
754 to make printing of exceptions believe it is a syntax error. */ 754 to make printing of exceptions believe it is a syntax error. */
755 755
756 void 756 void
757 PyErr_SyntaxLocation(const char *filename, int lineno) 757 PyErr_SyntaxLocation(const char *filename, int lineno)
758 { 758 {
759 PyObject *exc, *v, *tb, *tmp; 759 PyObject *exc, *v, *tb, *tmp;
760 760
761 /* add attributes for the line number and filename for the error */ 761 /* add attributes for the line number and filename for the error */
762 PyErr_Fetch(&exc, &v, &tb); 762 PyErr_Fetch(&exc, &v, &tb);
763 PyErr_NormalizeException(&exc, &v, &tb); 763 PyErr_NormalizeException(&exc, &v, &tb);
764 /* XXX check that it is, indeed, a syntax error. It might not 764 /* XXX check that it is, indeed, a syntax error. It might not
765 * be, though. */ 765 * be, though. */
766 tmp = PyLong_FromLong(lineno); 766 tmp = PyLong_FromLong(lineno);
767 if (tmp == NULL) 767 if (tmp == NULL)
768 PyErr_Clear(); 768 PyErr_Clear();
769 else { 769 else {
770 if (PyObject_SetAttrString(v, "lineno", tmp)) 770 if (PyObject_SetAttrString(v, "lineno", tmp))
771 PyErr_Clear(); 771 PyErr_Clear();
772 Py_DECREF(tmp); 772 Py_DECREF(tmp);
773 } 773 }
774 if (filename != NULL) { 774 if (filename != NULL) {
775 tmp = PyUnicode_FromString(filename); 775 tmp = PyUnicode_FromString(filename);
776 if (tmp == NULL) 776 if (tmp == NULL)
777 PyErr_Clear(); 777 PyErr_Clear();
778 else { 778 else {
779 if (PyObject_SetAttrString(v, "filename", tmp)) 779 if (PyObject_SetAttrString(v, "filename", tmp))
780 PyErr_Clear(); 780 PyErr_Clear();
781 Py_DECREF(tmp); 781 Py_DECREF(tmp);
782 } 782 }
783 783
784 tmp = PyErr_ProgramText(filename, lineno); 784 tmp = PyErr_ProgramText(filename, lineno);
785 if (tmp) { 785 if (tmp) {
786 if (PyObject_SetAttrString(v, "text", tmp)) 786 if (PyObject_SetAttrString(v, "text", tmp))
787 PyErr_Clear(); 787 PyErr_Clear();
788 Py_DECREF(tmp); 788 Py_DECREF(tmp);
789 } 789 }
790 } 790 }
791 if (PyObject_SetAttrString(v, "offset", Py_None)) { 791 if (PyObject_SetAttrString(v, "offset", Py_None)) {
792 PyErr_Clear(); 792 PyErr_Clear();
793 } 793 }
794 if (exc != PyExc_SyntaxError) { 794 if (exc != PyExc_SyntaxError) {
795 if (!PyObject_HasAttrString(v, "msg")) { 795 if (!PyObject_HasAttrString(v, "msg")) {
796 tmp = PyObject_Str(v); 796 tmp = PyObject_Str(v);
797 if (tmp) { 797 if (tmp) {
798 if (PyObject_SetAttrString(v, "msg", tmp)) 798 if (PyObject_SetAttrString(v, "msg", tmp))
799 PyErr_Clear(); 799 PyErr_Clear();
800 Py_DECREF(tmp); 800 Py_DECREF(tmp);
801 } else { 801 } else {
802 PyErr_Clear(); 802 PyErr_Clear();
803 } 803 }
804 } 804 }
805 if (!PyObject_HasAttrString(v, "print_file_and_line")) { 805 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
806 if (PyObject_SetAttrString(v, "print_file_and_line", 806 if (PyObject_SetAttrString(v, "print_file_and_line",
807 Py_None)) 807 Py_None))
808 PyErr_Clear(); 808 PyErr_Clear();
809 } 809 }
810 } 810 }
811 PyErr_Restore(exc, v, tb); 811 PyErr_Restore(exc, v, tb);
812 } 812 }
813 813
814 /* Attempt to load the line of text that the exception refers to. If it 814 /* Attempt to load the line of text that the exception refers to. If it
815 fails, it will return NULL but will not set an exception. 815 fails, it will return NULL but will not set an exception.
816 816
818 functionality in tb_displayline() in traceback.c. */ 818 functionality in tb_displayline() in traceback.c. */
819 819
820 PyObject * 820 PyObject *
821 PyErr_ProgramText(const char *filename, int lineno) 821 PyErr_ProgramText(const char *filename, int lineno)
822 { 822 {
823 FILE *fp; 823 FILE *fp;
824 int i; 824 int i;
825 char linebuf[1000]; 825 char linebuf[1000];
826 826
827 if (filename == NULL || *filename == '\0' || lineno <= 0) 827 if (filename == NULL || *filename == '\0' || lineno <= 0)
828 return NULL; 828 return NULL;
829 fp = fopen(filename, "r" PY_STDIOTEXTMODE); 829 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
830 if (fp == NULL) 830 if (fp == NULL)
831 return NULL; 831 return NULL;
832 for (i = 0; i < lineno; i++) { 832 for (i = 0; i < lineno; i++) {
833 char *pLastChar = &linebuf[sizeof(linebuf) - 2]; 833 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
834 do { 834 do {
835 *pLastChar = '\0'; 835 *pLastChar = '\0';
836 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf, 836 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
837 fp, NULL) == NULL) 837 fp, NULL) == NULL)
838 break; 838 break;
839 /* fgets read *something*; if it didn't get as 839 /* fgets read *something*; if it didn't get as
840 far as pLastChar, it must have found a newline 840 far as pLastChar, it must have found a newline
841 or hit the end of the file; if pLastChar is \n, 841 or hit the end of the file; if pLastChar is \n,
842 it obviously found a newline; else we haven't 842 it obviously found a newline; else we haven't
843 yet seen a newline, so must continue */ 843 yet seen a newline, so must continue */
844 } while (*pLastChar != '\0' && *pLastChar != '\n'); 844 } while (*pLastChar != '\0' && *pLastChar != '\n');
845 } 845 }
846 fclose(fp); 846 fclose(fp);
847 if (i == lineno) { 847 if (i == lineno) {
848 char *p = linebuf; 848 char *p = linebuf;
849 PyObject *res; 849 PyObject *res;
850 while (*p == ' ' || *p == '\t' || *p == '\014') 850 while (*p == ' ' || *p == '\t' || *p == '\014')
851 p++; 851 p++;
852 res = PyUnicode_FromString(p); 852 res = PyUnicode_FromString(p);
853 if (res == NULL) 853 if (res == NULL)
854 PyErr_Clear(); 854 PyErr_Clear();
855 return res; 855 return res;
856 } 856 }
857 return NULL; 857 return NULL;
858 } 858 }
859 859
860 #ifdef __cplusplus 860 #ifdef __cplusplus
861 } 861 }
862 #endif 862 #endif