annotate Python/errors.c @ 62570:32651ee779ed

Merged revisions 81380 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r81380 | brett.cannon | 2010-05-20 13:37:55 -0500 (Thu, 20 May 2010) | 8 lines Turned out that if you used explicit relative import syntax (e.g. from .os import sep) and it failed, import would still try the implicit relative import semantics of an absolute import (from os import sep). That's not right, so when level is negative, only do explicit relative import semantics. Fixes issue #7902. Thanks to Meador Inge for the patch. ........
author Benjamin Peterson <benjamin@python.org>
date Sun, 27 Jun 2010 22:37:28 +0000
parents 600c23127207
children 00e4ce31d404
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
853b736a6a9e Added copyright notice.
Guido van Rossum <guido@python.org>
parents: 90
diff changeset
1
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
2 /* Error handling */
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
4 #include "Python.h"
86
a6934380c6e7 "Compiling" version
Guido van Rossum <guido@python.org>
parents: 66
diff changeset
5
2502
d5978238e3ba changes in NT tests
Guido van Rossum <guido@python.org>
parents: 2376
diff changeset
6 #ifndef __STDC__
5318
2c4b802a3b5d Keep Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5312
diff changeset
7 #ifndef MS_WINDOWS
13447
a89f7f268de4 Nuke all remaining occurrences of Py_PROTO and Py_FPROTO.
Tim Peters <tim.peters@gmail.com>
parents: 13256
diff changeset
8 extern char *strerror(int);
2502
d5978238e3ba changes in NT tests
Guido van Rossum <guido@python.org>
parents: 2376
diff changeset
9 #endif
5318
2c4b802a3b5d Keep Microsoft VC happy.
Guido van Rossum <guido@python.org>
parents: 5312
diff changeset
10 #endif
59
433f52d1d958 Added prototype for strerror.
Guido van Rossum <guido@python.org>
parents: 37
diff changeset
11
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
12 #ifdef MS_WINDOWS
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
13 #include <windows.h>
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
14 #include <winbase.h>
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
15 #endif
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
16
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
17 #include <ctype.h>
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
18
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
19 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
20 extern "C" {
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
21 #endif
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
22
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
23
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
25 PyErr_Restore(PyObject *type, PyObject *value, PyObject *traceback)
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
26 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
27 PyThreadState *tstate = PyThreadState_GET();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
28 PyObject *oldtype, *oldvalue, *oldtraceback;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
29
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
30 if (traceback != NULL && !PyTraceBack_Check(traceback)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
31 /* XXX Should never happen -- fatal error instead? */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
32 /* Well, it could be None. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
33 Py_DECREF(traceback);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
34 traceback = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
35 }
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
36
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
37 /* Save these in locals to safeguard against recursive
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
38 invocation through Py_XDECREF */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
39 oldtype = tstate->curexc_type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
40 oldvalue = tstate->curexc_value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
41 oldtraceback = tstate->curexc_traceback;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
42
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
43 tstate->curexc_type = type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
44 tstate->curexc_value = value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
45 tstate->curexc_traceback = traceback;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
46
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
47 Py_XDECREF(oldtype);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
48 Py_XDECREF(oldvalue);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
49 Py_XDECREF(oldtraceback);
2052
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
50 }
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
51
d7e91437f0a2 Lots of changes, most minor (fatal() instead of abort(), use of
Guido van Rossum <guido@python.org>
parents: 2019
diff changeset
52 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
53 PyErr_SetObject(PyObject *exception, PyObject *value)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
55 PyThreadState *tstate = PyThreadState_GET();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
56 PyObject *exc_value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
57 PyObject *tb = NULL;
47722
7ba7901dad7f Implicit exception chaining via __context__ (PEP 3134).
Guido van Rossum <guido@python.org>
parents: 46430
diff changeset
58
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
59 if (exception != NULL &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
60 !PyExceptionClass_Check(exception)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
61 PyErr_Format(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
62 "exception %R not a BaseException subclass",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
63 exception);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
64 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
65 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
66 Py_XINCREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
67 exc_value = tstate->exc_value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
68 if (exc_value != NULL && exc_value != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
69 /* Implicit exception chaining */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
70 Py_INCREF(exc_value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
71 if (value == NULL || !PyExceptionInstance_Check(value)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
72 /* We must normalize the value right now */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
73 PyObject *args, *fixed_value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
74 if (value == NULL || value == Py_None)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
75 args = PyTuple_New(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
76 else if (PyTuple_Check(value)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
77 Py_INCREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
78 args = value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
79 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
80 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
81 args = PyTuple_Pack(1, value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
82 fixed_value = args ?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
83 PyEval_CallObject(exception, args) : NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
84 Py_XDECREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
85 Py_XDECREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
86 if (fixed_value == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
87 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
88 value = fixed_value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
89 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
90 /* Avoid reference cycles through the context chain.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
91 This is O(chain length) but context chains are
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
92 usually very short. Sensitive readers may try
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
93 to inline the call to PyException_GetContext. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
94 if (exc_value != value) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
95 PyObject *o = exc_value, *context;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
96 while ((context = PyException_GetContext(o))) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
97 Py_DECREF(context);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
98 if (context == value) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
99 PyException_SetContext(o, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
100 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
101 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
102 o = context;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
103 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
104 PyException_SetContext(value, exc_value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
105 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
106 Py_DECREF(exc_value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
107 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
108 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
109 if (value != NULL && PyExceptionInstance_Check(value))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
110 tb = PyException_GetTraceback(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
111 Py_XINCREF(exception);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
112 PyErr_Restore(exception, value, tb);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
116 PyErr_SetNone(PyObject *exception)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
118 PyErr_SetObject(exception, (PyObject *)NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
122 PyErr_SetString(PyObject *exception, const char *string)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
124 PyObject *value = PyUnicode_FromString(string);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
125 PyErr_SetObject(exception, value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
126 Py_XDECREF(value);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128
1832
79e420805c67 err_clear: clear interpreter stack trace
Guido van Rossum <guido@python.org>
parents: 1319
diff changeset
129
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
130 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
131 PyErr_Occurred(void)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 {
61555
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
133 /* If there is no thread state, PyThreadState_GET calls
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
134 Py_FatalError, which calls PyErr_Occurred. To avoid the
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
135 resulting infinite loop, we inline PyThreadState_GET here and
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
136 treat no thread as no error. */
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
137 PyThreadState *tstate =
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
138 ((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current));
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
139
61555
1698c55b2af9 Make PyErr_Occurred return NULL if there is no current thread. Previously it
Jeffrey Yasskin <jyasskin@gmail.com>
parents: 61466
diff changeset
140 return tstate == NULL ? NULL : tstate->curexc_type;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
143
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
144 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
145 PyErr_GivenExceptionMatches(PyObject *err, PyObject *exc)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
146 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
147 if (err == NULL || exc == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
148 /* maybe caused by "import exceptions" that failed early on */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
149 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
150 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
151 if (PyTuple_Check(exc)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
152 Py_ssize_t i, n;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
153 n = PyTuple_Size(exc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
154 for (i = 0; i < n; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
155 /* Test recursively */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
156 if (PyErr_GivenExceptionMatches(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
157 err, PyTuple_GET_ITEM(exc, i)))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
158 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
159 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
160 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
161 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
162 return 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
163 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
164 /* err might be an instance, so check its class. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
165 if (PyExceptionInstance_Check(err))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
166 err = PyExceptionInstance_Class(err);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
167
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
168 if (PyExceptionClass_Check(err) && PyExceptionClass_Check(exc)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
169 int res = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
170 PyObject *exception, *value, *tb;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
171 PyErr_Fetch(&exception, &value, &tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
172 /* PyObject_IsSubclass() can recurse and therefore is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
173 not safe (see test_bad_getattr in test.pickletester). */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
174 res = PyType_IsSubtype((PyTypeObject *)err, (PyTypeObject *)exc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
175 /* This function must not fail, so print the error here */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
176 if (res == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
177 PyErr_WriteUnraisable(err);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
178 res = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
179 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
180 PyErr_Restore(exception, value, tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
181 return res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
182 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
183
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
184 return err == exc;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
185 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
186
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
187
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
188 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
189 PyErr_ExceptionMatches(PyObject *exc)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
190 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
191 return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
192 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
193
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
194
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
195 /* Used in many places to normalize a raised exception, including in
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
196 eval_code2(), do_raise(), and PyErr_Print()
48474
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
197
2ee09afee126 implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents: 47722
diff changeset
198 XXX: should PyErr_NormalizeException() also call
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
199 PyException_SetTraceback() with the resulting value and tb?
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
200 */
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
201 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
202 PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb)
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
203 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
204 PyObject *type = *exc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
205 PyObject *value = *val;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
206 PyObject *inclass = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
207 PyObject *initial_tb = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
208 PyThreadState *tstate = NULL;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
209
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
210 if (type == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
211 /* There was no exception, so nothing to do. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
212 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
213 }
13883
15ad4088a700 Avoid dumping core when PyErr_NormalizeException() is called without
Guido van Rossum <guido@python.org>
parents: 13658
diff changeset
214
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
215 /* If PyErr_SetNone() was used, the value will have been actually
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
216 set to NULL.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
217 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
218 if (!value) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
219 value = Py_None;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
220 Py_INCREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
221 }
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
222
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
223 if (PyExceptionInstance_Check(value))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
224 inclass = PyExceptionInstance_Class(value);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
225
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
226 /* Normalize the exception so that if the type is a class, the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
227 value will be an instance.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
228 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
229 if (PyExceptionClass_Check(type)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
230 /* if the value was not an instance, or is not an instance
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
231 whose class is (or is derived from) type, then use the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
232 value as an argument to instantiation of the type
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
233 class.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
234 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
235 if (!inclass || !PyObject_IsSubclass(inclass, type)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
236 PyObject *args, *res;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
237
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
238 if (value == Py_None)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
239 args = PyTuple_New(0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
240 else if (PyTuple_Check(value)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
241 Py_INCREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
242 args = value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
243 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
244 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
245 args = PyTuple_Pack(1, value);
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
246
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
247 if (args == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
248 goto finally;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
249 res = PyEval_CallObject(type, args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
250 Py_DECREF(args);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
251 if (res == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
252 goto finally;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
253 Py_DECREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
254 value = res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
255 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
256 /* if the class of the instance doesn't exactly match the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
257 class of the type, believe the instance
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
258 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
259 else if (inclass != type) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
260 Py_DECREF(type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
261 type = inclass;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
262 Py_INCREF(type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
263 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
264 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
265 *exc = type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
266 *val = value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
267 return;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
268 finally:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
269 Py_DECREF(type);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
270 Py_DECREF(value);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
271 /* If the new exception doesn't set a traceback and the old
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
272 exception had a traceback, use the old traceback for the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
273 new exception. It's better than nothing.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
274 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
275 initial_tb = *tb;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
276 PyErr_Fetch(exc, val, tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
277 if (initial_tb != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
278 if (*tb == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
279 *tb = initial_tb;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
280 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
281 Py_DECREF(initial_tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
282 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
283 /* normalize recursively */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
284 tstate = PyThreadState_GET();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
285 if (++tstate->recursion_depth > Py_GetRecursionLimit()) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
286 --tstate->recursion_depth;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
287 /* throw away the old exception... */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
288 Py_DECREF(*exc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
289 Py_DECREF(*val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
290 /* ... and use the recursion error instead */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
291 *exc = PyExc_RuntimeError;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
292 *val = PyExc_RecursionErrorInst;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
293 Py_INCREF(*exc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
294 Py_INCREF(*val);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
295 /* just keeping the old traceback */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
296 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
297 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
298 PyErr_NormalizeException(exc, val, tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
299 --tstate->recursion_depth;
6146
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
300 }
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
301
a2a1df0ca808 Three new C API functions:
Barry Warsaw <barry@python.org>
parents: 5979
diff changeset
302
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
304 PyErr_Fetch(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
306 PyThreadState *tstate = PyThreadState_GET();
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
307
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
308 *p_type = tstate->curexc_type;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
309 *p_value = tstate->curexc_value;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
310 *p_traceback = tstate->curexc_traceback;
5405
b7871ca930ad Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents: 5370
diff changeset
311
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
312 tstate->curexc_type = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
313 tstate->curexc_value = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
314 tstate->curexc_traceback = NULL;
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 }
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
318 PyErr_Clear(void)
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
320 PyErr_Restore(NULL, NULL, NULL);
6
fc6fcd7df4f7 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 }
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
322
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
323 /* Convenience functions to set a type error exception and return 0 */
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
324
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
325 int
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
326 PyErr_BadArgument(void)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
327 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
328 PyErr_SetString(PyExc_TypeError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
329 "bad argument type for built-in operation");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
330 return 0;
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
331 }
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
332
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
333 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
334 PyErr_NoMemory(void)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
335 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
336 if (PyErr_ExceptionMatches(PyExc_MemoryError))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
337 /* already current */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
338 return NULL;
14066
25eea88047e9 Do not set a MemoryError exception over another MemoryError exception,
Vladimir Marangozov <vladimir.marangozov@t-online.de>
parents: 13883
diff changeset
339
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
340 /* raise the pre-allocated instance if it still exists */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
341 if (PyExc_MemoryErrorInst)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
342 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
343 /* Clear the previous traceback, otherwise it will be appended
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
344 * to the current one.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
345 *
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
346 * The following statement is not likely to raise any error;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
347 * if it does, we simply discard it.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
348 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
349 PyException_SetTraceback(PyExc_MemoryErrorInst, Py_None);
48598
de75e7280b7a Correct one of the "MemoryError oddities":
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48589
diff changeset
350
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
351 PyErr_SetObject(PyExc_MemoryError, PyExc_MemoryErrorInst);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
352 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
353 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
354 /* this will probably fail since there's no memory and hee,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
355 hee, we have to instantiate this class
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
356 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
357 PyErr_SetNone(PyExc_MemoryError);
6190
b5757e87eb32 PyErr_NoMemory(): If the pre-instantiated memory exception is non-null
Barry Warsaw <barry@python.org>
parents: 6146
diff changeset
358
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
359 return NULL;
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
360 }
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
361
5370
1ea1f019268d Quickly renamed. Also removed the long comment explaining why this is
Guido van Rossum <guido@python.org>
parents: 5318
diff changeset
362 PyObject *
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
363 PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject)
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
364 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
365 PyObject *message;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
366 PyObject *v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
367 int i = errno;
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
368 #ifndef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
369 char *s;
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
370 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
371 WCHAR *s_buf = NULL;
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
372 #endif /* Unix/Windows */
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
373
2376
c31eaed7798b rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents: 2190
diff changeset
374 #ifdef EINTR
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
375 if (i == EINTR && PyErr_CheckSignals())
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
376 return NULL;
2376
c31eaed7798b rename macstrerror to PyMac_StrError; no EINTR test in CW
Guido van Rossum <guido@python.org>
parents: 2190
diff changeset
377 #endif
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
378
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
379 #ifndef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
380 if (i == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
381 s = "Error"; /* Sometimes errno didn't get set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
382 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
383 s = strerror(i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
384 message = PyUnicode_DecodeUTF8(s, strlen(s), "ignore");
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
385 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
386 if (i == 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
387 message = PyUnicode_FromString("Error"); /* Sometimes errno didn't get set */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
388 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
389 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
390 /* Note that the Win32 errors do not lineup with the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
391 errno error. So if the error is in the MSVC error
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
392 table, we use it, otherwise we assume it really _is_
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
393 a Win32 error code
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
394 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
395 if (i > 0 && i < _sys_nerr) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
396 message = PyUnicode_FromString(_sys_errlist[i]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
397 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
398 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
399 int len = FormatMessageW(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
400 FORMAT_MESSAGE_ALLOCATE_BUFFER |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
401 FORMAT_MESSAGE_FROM_SYSTEM |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
402 FORMAT_MESSAGE_IGNORE_INSERTS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
403 NULL, /* no message source */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
404 i,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
405 MAKELANGID(LANG_NEUTRAL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
406 SUBLANG_DEFAULT),
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
407 /* Default language */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
408 (LPWSTR) &s_buf,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
409 0, /* size not used */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
410 NULL); /* no args */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
411 if (len==0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
412 /* Only ever seen this in out-of-mem
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
413 situations */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
414 s_buf = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
415 message = PyUnicode_FromFormat("Windows Error 0x%X", i);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
416 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
417 /* remove trailing cr/lf and dots */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
418 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
419 s_buf[--len] = L'\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
420 message = PyUnicode_FromUnicode(s_buf, len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
421 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
422 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
423 }
22205
f4487350c537 Patch #494045: patches errno and stat to cope on plan9.
Martin v. Löwis <martin@v.loewis.de>
parents: 22121
diff changeset
424 #endif /* Unix/Windows */
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
425
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
426 if (message == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
427 {
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
428 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
429 LocalFree(s_buf);
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
430 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
431 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
432 }
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
433
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
434 if (filenameObject != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
435 v = Py_BuildValue("(iOO)", i, message, filenameObject);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
436 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
437 v = Py_BuildValue("(iO)", i, message);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
438 Py_DECREF(message);
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
439
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
440 if (v != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
441 PyErr_SetObject(exc, v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
442 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
443 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 23029
diff changeset
444 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
445 LocalFree(s_buf);
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
446 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
447 return NULL;
9
33701db4ea55 Adde dconvenience functions.
Guido van Rossum <guido@python.org>
parents: 6
diff changeset
448 }
10638
df8a1c281ad7 Patch by Christian Tismer for Win32, to use FormatMessage() instead of
Guido van Rossum <guido@python.org>
parents: 9671
diff changeset
449
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
450
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
451 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
452 PyErr_SetFromErrnoWithFilename(PyObject *exc, const char *filename)
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
453 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
454 PyObject *name = filename ? PyUnicode_DecodeFSDefault(filename) : NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
455 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
456 Py_XDECREF(name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
457 return result;
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
458 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
459
54129
77cfef596d33 Merged revisions 72698-72699 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 53079
diff changeset
460 #ifdef MS_WINDOWS
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
461 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
462 PyErr_SetFromErrnoWithUnicodeFilename(PyObject *exc, const Py_UNICODE *filename)
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
463 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
464 PyObject *name = filename ?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
465 PyUnicode_FromUnicode(filename, wcslen(filename)) :
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
466 NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
467 PyObject *result = PyErr_SetFromErrnoWithFilenameObject(exc, name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
468 Py_XDECREF(name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
469 return result;
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
470 }
54129
77cfef596d33 Merged revisions 72698-72699 via svnmerge from
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 53079
diff changeset
471 #endif /* MS_WINDOWS */
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
472
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
473 PyObject *
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
474 PyErr_SetFromErrno(PyObject *exc)
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
475 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
476 return PyErr_SetFromErrnoWithFilenameObject(exc, NULL);
8706
ca1c669bb041 PyErr_SetFromErrnoWithFilename(): New function which supports setting
Barry Warsaw <barry@python.org>
parents: 6789
diff changeset
477 }
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
478
36751
8e04de2480e4 PEP 352 implementation. Creates a new base class, BaseException, which has an
Brett Cannon <bcannon@gmail.com>
parents: 36737
diff changeset
479 #ifdef MS_WINDOWS
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
480 /* Windows specific error code handling */
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
481 PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject(
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
482 PyObject *exc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
483 int ierr,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
484 PyObject *filenameObject)
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
485 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
486 int len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
487 WCHAR *s_buf = NULL; /* Free via LocalFree */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
488 PyObject *message;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
489 PyObject *v;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
490 DWORD err = (DWORD)ierr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
491 if (err==0) err = GetLastError();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
492 len = FormatMessageW(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
493 /* Error API error */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
494 FORMAT_MESSAGE_ALLOCATE_BUFFER |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
495 FORMAT_MESSAGE_FROM_SYSTEM |
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
496 FORMAT_MESSAGE_IGNORE_INSERTS,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
497 NULL, /* no message source */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
498 err,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
499 MAKELANGID(LANG_NEUTRAL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
500 SUBLANG_DEFAULT), /* Default language */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
501 (LPWSTR) &s_buf,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
502 0, /* size not used */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
503 NULL); /* no args */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
504 if (len==0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
505 /* Only seen this in out of mem situations */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
506 message = PyUnicode_FromFormat("Windows Error 0x%X", err);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
507 s_buf = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
508 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
509 /* remove trailing cr/lf and dots */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
510 while (len > 0 && (s_buf[len-1] <= L' ' || s_buf[len-1] == L'.'))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
511 s_buf[--len] = L'\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
512 message = PyUnicode_FromUnicode(s_buf, len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
513 }
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
514
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
515 if (message == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
516 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
517 LocalFree(s_buf);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
518 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
519 }
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
520
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
521 if (filenameObject != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
522 v = Py_BuildValue("(iOO)", err, message, filenameObject);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
523 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
524 v = Py_BuildValue("(iO)", err, message);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
525 Py_DECREF(message);
43204
b51ac2d2d538 Patch #1075: Use wide API to format error messages.
Martin v. Löwis <martin@v.loewis.de>
parents: 42794
diff changeset
526
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
527 if (v != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
528 PyErr_SetObject(exc, v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
529 Py_DECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
530 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
531 LocalFree(s_buf);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
532 return NULL;
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
533 }
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
534
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
535 PyObject *PyErr_SetExcFromWindowsErrWithFilename(
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
536 PyObject *exc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
537 int ierr,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
538 const char *filename)
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
539 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
540 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
541 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
542 ierr,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
543 name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
544 Py_XDECREF(name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
545 return ret;
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
546 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
547
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
548 PyObject *PyErr_SetExcFromWindowsErrWithUnicodeFilename(
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
549 PyObject *exc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
550 int ierr,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
551 const Py_UNICODE *filename)
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
552 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
553 PyObject *name = filename ?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
554 PyUnicode_FromUnicode(filename, wcslen(filename)) :
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
555 NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
556 PyObject *ret = PyErr_SetExcFromWindowsErrWithFilenameObject(exc,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
557 ierr,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
558 name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
559 Py_XDECREF(name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
560 return ret;
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
561 }
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
562
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
563 PyObject *PyErr_SetExcFromWindowsErr(PyObject *exc, int ierr)
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
564 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
565 return PyErr_SetExcFromWindowsErrWithFilename(exc, ierr, NULL);
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
566 }
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
567
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
568 PyObject *PyErr_SetFromWindowsErr(int ierr)
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
569 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
570 return PyErr_SetExcFromWindowsErrWithFilename(PyExc_WindowsError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
571 ierr, NULL);
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
572 }
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
573 PyObject *PyErr_SetFromWindowsErrWithFilename(
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
574 int ierr,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
575 const char *filename)
24423
3db261a93a5b New functions for extension writers on Windows:
Thomas Heller <theller@ctypes.org>
parents: 24071
diff changeset
576 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
577 PyObject *name = filename ? PyUnicode_FromString(filename) : NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
578 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
579 PyExc_WindowsError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
580 ierr, name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
581 Py_XDECREF(name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
582 return result;
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
583 }
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
584
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
585 PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename(
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
586 int ierr,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
587 const Py_UNICODE *filename)
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
588 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
589 PyObject *name = filename ?
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
590 PyUnicode_FromUnicode(filename, wcslen(filename)) :
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
591 NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
592 PyObject *result = PyErr_SetExcFromWindowsErrWithFilenameObject(
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
593 PyExc_WindowsError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
594 ierr, name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
595 Py_XDECREF(name);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
596 return result;
25535
861065256487 Patch 594001: PEP 277 - Unicode file name support for Windows NT.
Mark Hammond <mhammond@skippinet.com.au>
parents: 24423
diff changeset
597 }
11801
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
598 #endif /* MS_WINDOWS */
fe960ad3db65 Patch by Mark Hammond:
Guido van Rossum <guido@python.org>
parents: 10638
diff changeset
599
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
600 void
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
601 _PyErr_BadInternalCall(const char *filename, int lineno)
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
602 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
603 PyErr_Format(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
604 "%s:%d: bad argument to internal function",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
605 filename, lineno);
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
606 }
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
607
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
608 /* Remove the preprocessor macro for PyErr_BadInternalCall() so that we can
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
609 export the entry point for existing object code: */
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
610 #undef PyErr_BadInternalCall
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
611 void
13658
f79434ee41fa Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents: 13578
diff changeset
612 PyErr_BadInternalCall(void)
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
613 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
614 PyErr_Format(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
615 "bad argument to internal function");
22
2d3eb717a00d Added err_badcall().
Guido van Rossum <guido@python.org>
parents: 9
diff changeset
616 }
14170
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
617 #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
019265b3a856 Improve the exceptions raised by PyErr_BadInternalCall(); adding the
Fred Drake <fdrake@acm.org>
parents: 14066
diff changeset
618
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
619
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
620
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
621 PyObject *
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
622 PyErr_Format(PyObject *exception, const char *format, ...)
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
623 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
624 va_list vargs;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
625 PyObject* string;
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
626
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
627 #ifdef HAVE_STDARG_PROTOTYPES
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
628 va_start(vargs, format);
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
629 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
630 va_start(vargs);
14335
951eb3af3494 code part of patch #100895 by Fredrik Lundh
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14330
diff changeset
631 #endif
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
632
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
633 string = PyUnicode_FromFormatV(format, vargs);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
634 PyErr_SetObject(exception, string);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
635 Py_XDECREF(string);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
636 va_end(vargs);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
637 return NULL;
5105
00fd6857f76b Added convenience function PyErr_Format(exception, formatstring, ...) -> NULL.
Guido van Rossum <guido@python.org>
parents: 4654
diff changeset
638 }
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
639
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
640
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
641
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
642 PyObject *
42794
84618b2064c1 Add const to some strings that are not modified
Neal Norwitz <nnorwitz@gmail.com>
parents: 42793
diff changeset
643 PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
644 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
645 const char *dot;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
646 PyObject *modulename = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
647 PyObject *classname = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
648 PyObject *mydict = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
649 PyObject *bases = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
650 PyObject *result = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
651 dot = strrchr(name, '.');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
652 if (dot == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
653 PyErr_SetString(PyExc_SystemError,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
654 "PyErr_NewException: name must be module.class");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
655 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
656 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
657 if (base == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
658 base = PyExc_Exception;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
659 if (dict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
660 dict = mydict = PyDict_New();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
661 if (dict == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
662 goto failure;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
663 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
664 if (PyDict_GetItemString(dict, "__module__") == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
665 modulename = PyUnicode_FromStringAndSize(name,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
666 (Py_ssize_t)(dot-name));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
667 if (modulename == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
668 goto failure;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
669 if (PyDict_SetItemString(dict, "__module__", modulename) != 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
670 goto failure;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
671 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
672 if (PyTuple_Check(base)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
673 bases = base;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
674 /* INCREF as we create a new ref in the else branch */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
675 Py_INCREF(bases);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
676 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
677 bases = PyTuple_Pack(1, base);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
678 if (bases == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
679 goto failure;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
680 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
681 /* Create a real new-style class. */
62155
600c23127207 Issue #8848: U / U# formats of Py_BuildValue() are just alias to s / s#
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61555
diff changeset
682 result = PyObject_CallFunction((PyObject *)&PyType_Type, "sOO",
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
683 dot+1, bases, dict);
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
684 failure:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
685 Py_XDECREF(bases);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
686 Py_XDECREF(mydict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
687 Py_XDECREF(classname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
688 Py_XDECREF(modulename);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
689 return result;
6319
b7f0b98f5325 New API PyErr_NewException(name, base, dict) to create simple new exceptions.
Guido van Rossum <guido@python.org>
parents: 6190
diff changeset
690 }
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
691
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
692
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
693 /* Create an exception with docstring */
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
694 PyObject *
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
695 PyErr_NewExceptionWithDoc(const char *name, const char *doc,
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
696 PyObject *base, PyObject *dict)
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
697 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
698 int result;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
699 PyObject *ret = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
700 PyObject *mydict = NULL; /* points to the dict only if we create it */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
701 PyObject *docobj;
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
702
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
703 if (dict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
704 dict = mydict = PyDict_New();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
705 if (dict == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
706 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
707 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
708 }
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
709
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
710 if (doc != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
711 docobj = PyUnicode_FromString(doc);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
712 if (docobj == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
713 goto failure;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
714 result = PyDict_SetItemString(dict, "__doc__", docobj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
715 Py_DECREF(docobj);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
716 if (result < 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
717 goto failure;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
718 }
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
719
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
720 ret = PyErr_NewException(name, base, dict);
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
721 failure:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
722 Py_XDECREF(mydict);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
723 return ret;
57962
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
724 }
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
725
c1972eef3579 Merged revisions 77088 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54129
diff changeset
726
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
727 /* Call when an exception has occurred but there is no way for Python
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
728 to handle it. Examples: exception in __del__ or during GC. */
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
729 void
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
730 PyErr_WriteUnraisable(PyObject *obj)
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
731 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
732 PyObject *f, *t, *v, *tb;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
733 PyErr_Fetch(&t, &v, &tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
734 f = PySys_GetObject("stderr");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
735 if (f != NULL && f != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
736 PyFile_WriteString("Exception ", f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
737 if (t) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
738 PyObject* moduleName;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
739 char* className;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
740 assert(PyExceptionClass_Check(t));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
741 className = PyExceptionClass_Name(t);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
742 if (className != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
743 char *dot = strrchr(className, '.');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
744 if (dot != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
745 className = dot+1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
746 }
38669
19fd6141940d Partially merge trunk into p3yk. The removal of Mac/Tools is confusing svn
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
747
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
748 moduleName = PyObject_GetAttrString(t, "__module__");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
749 if (moduleName == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
750 PyFile_WriteString("<unknown>", f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
751 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
752 char* modstr = _PyUnicode_AsString(moduleName);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
753 if (modstr &&
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
754 strcmp(modstr, "builtins") != 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
755 {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
756 PyFile_WriteString(modstr, f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
757 PyFile_WriteString(".", f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
758 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
759 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
760 if (className == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
761 PyFile_WriteString("<unknown>", f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
762 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
763 PyFile_WriteString(className, f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
764 if (v && v != Py_None) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
765 PyFile_WriteString(": ", f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
766 PyFile_WriteObject(v, f, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
767 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
768 Py_XDECREF(moduleName);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
769 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
770 PyFile_WriteString(" in ", f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
771 PyFile_WriteObject(obj, f, 0);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
772 PyFile_WriteString(" ignored\n", f);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
773 PyErr_Clear(); /* Just in case */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
774 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
775 Py_XDECREF(t);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
776 Py_XDECREF(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
777 Py_XDECREF(tb);
14330
6dee1985c681 refactor __del__ exception handler into PyErr_WriteUnraisable
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14170
diff changeset
778 }
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
779
30781
74747f62f286 Made function declaration a proper C prototype
Armin Rigo <arigo@tunes.org>
parents: 30683
diff changeset
780 extern PyObject *PyModule_GetWarningsModule(void);
15591
36286632ff3a Add PyErr_Warn().
Guido van Rossum <guido@python.org>
parents: 15318
diff changeset
781
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
782
22121
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
783 /* Set file and line information for the current exception.
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
784 If the exception is not a SyntaxError, also sets additional attributes
d4406fbfcb4e Patch #50002: Display line information for bad \x escapes:
Martin v. Löwis <martin@v.loewis.de>
parents: 20221
diff changeset
785 to make printing of exceptions believe it is a syntax error. */
16850
2d4da6cfee61 Add PyErr_WarnExplicit(), which calls warnings.warn_explicit(), with
Guido van Rossum <guido@python.org>
parents: 16838
diff changeset
786
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
787 void
26601
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
788 PyErr_SyntaxLocation(const char *filename, int lineno)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
789 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
790 PyObject *exc, *v, *tb, *tmp;
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
791
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
792 /* add attributes for the line number and filename for the error */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
793 PyErr_Fetch(&exc, &v, &tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
794 PyErr_NormalizeException(&exc, &v, &tb);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
795 /* XXX check that it is, indeed, a syntax error. It might not
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
796 * be, though. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
797 tmp = PyLong_FromLong(lineno);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
798 if (tmp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
799 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
800 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
801 if (PyObject_SetAttrString(v, "lineno", tmp))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
802 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
803 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
804 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
805 if (filename != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
806 tmp = PyUnicode_FromString(filename);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
807 if (tmp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
808 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
809 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
810 if (PyObject_SetAttrString(v, "filename", tmp))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
811 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
812 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
813 }
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
814
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
815 tmp = PyErr_ProgramText(filename, lineno);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
816 if (tmp) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
817 if (PyObject_SetAttrString(v, "text", tmp))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
818 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
819 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
820 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
821 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
822 if (PyObject_SetAttrString(v, "offset", Py_None)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
823 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
824 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
825 if (exc != PyExc_SyntaxError) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
826 if (!PyObject_HasAttrString(v, "msg")) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
827 tmp = PyObject_Str(v);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
828 if (tmp) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
829 if (PyObject_SetAttrString(v, "msg", tmp))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
830 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
831 Py_DECREF(tmp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
832 } else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
833 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
834 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
835 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
836 if (!PyObject_HasAttrString(v, "print_file_and_line")) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
837 if (PyObject_SetAttrString(v, "print_file_and_line",
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
838 Py_None))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
839 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
840 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
841 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
842 PyErr_Restore(exc, v, tb);
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
843 }
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
844
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
845 /* Attempt to load the line of text that the exception refers to. If it
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
846 fails, it will return NULL but will not set an exception.
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
847
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
848 XXX The functionality of this function is quite similar to the
43524
2f30bfb7c738 Minor cleanup of the comment for PyErr_ProgramText() and a tweak to the code
Guido van Rossum <guido@python.org>
parents: 43292
diff changeset
849 functionality in tb_displayline() in traceback.c. */
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
850
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
851 PyObject *
26601
cc05c2c8660e Constify filenames and scripts. Fixes #651362.
Martin v. Löwis <martin@v.loewis.de>
parents: 25544
diff changeset
852 PyErr_ProgramText(const char *filename, int lineno)
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
853 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
854 FILE *fp;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
855 int i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
856 char linebuf[1000];
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
857
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
858 if (filename == NULL || *filename == '\0' || lineno <= 0)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
859 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
860 fp = fopen(filename, "r" PY_STDIOTEXTMODE);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
861 if (fp == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
862 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
863 for (i = 0; i < lineno; i++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
864 char *pLastChar = &linebuf[sizeof(linebuf) - 2];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
865 do {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
866 *pLastChar = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
867 if (Py_UniversalNewlineFgets(linebuf, sizeof linebuf,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
868 fp, NULL) == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
869 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
870 /* fgets read *something*; if it didn't get as
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
871 far as pLastChar, it must have found a newline
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
872 or hit the end of the file; if pLastChar is \n,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
873 it obviously found a newline; else we haven't
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
874 yet seen a newline, so must continue */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
875 } while (*pLastChar != '\0' && *pLastChar != '\n');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
876 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
877 fclose(fp);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
878 if (i == lineno) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
879 char *p = linebuf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
880 PyObject *res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
881 while (*p == ' ' || *p == '\t' || *p == '\014')
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
882 p++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
883 res = PyUnicode_FromString(p);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
884 if (res == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
885 PyErr_Clear();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
886 return res;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
887 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 61384
diff changeset
888 return NULL;
16838
09f6c1372056 Improve SyntaxErrors for bad future statements. Set file and location
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 15591
diff changeset
889 }
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
890
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
891 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
892 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 37871
diff changeset
893 #endif