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