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