Mercurial > cpython-lru_cache-weakref
annotate Python/traceback.c @ 86974:954167ce92a3
Issue #19512: add some common identifiers to only create common strings once,
instead of creating temporary Unicode string objects
Add also more identifiers in pythonrun.c to avoid temporary Unicode string
objets for the interactive interpreter.
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Wed, 06 Nov 2013 22:41:44 +0100 |
| parents | cc8c37b5b449 |
| children | 01c4a0af73cf |
| rev | line source |
|---|---|
| 145 | 1 |
| 86 | 2 /* Traceback implementation */ |
| 3 | |
| 5372 | 4 #include "Python.h" |
| 86 | 5 |
|
35742
1c4d192f1568
Merge ast-branch to head
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
31739
diff
changeset
|
6 #include "code.h" |
| 86 | 7 #include "frameobject.h" |
| 8 #include "structmember.h" | |
|
674
4e2d239dc64c
Move printing of filename and lineno to tb_displayline.
Guido van Rossum <guido@python.org>
parents:
597
diff
changeset
|
9 #include "osdefs.h" |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
10 #ifdef HAVE_FCNTL_H |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
11 #include <fcntl.h> |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
12 #endif |
| 86 | 13 |
|
31739
49ec0d8f08ec
Moved tracebackobject to traceback.h, Closes SF Bug #497067
Nicholas Bastin <nick.bastin@gmail.com>
parents:
30968
diff
changeset
|
14 #define OFF(x) offsetof(PyTracebackObject, x) |
| 86 | 15 |
|
83802
ef5dd5bda323
Fix compilater warnings on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents:
78329
diff
changeset
|
16 #define PUTS(fd, str) write(fd, str, (int)strlen(str)) |
|
78329
ff7fc6a91212
Issue #15463: the faulthandler module truncates strings to 500 characters,
Victor Stinner <victor.stinner@gmail.com>
parents:
78185
diff
changeset
|
17 #define MAX_STRING_LENGTH 500 |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
18 #define MAX_FRAME_DEPTH 100 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
19 #define MAX_NTHREADS 100 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
20 |
|
69148
7b8d625eb6e4
Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69102
diff
changeset
|
21 /* Function from Parser/tokenizer.c */ |
|
7b8d625eb6e4
Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69102
diff
changeset
|
22 extern char * PyTokenizer_FindEncodingFilename(int, PyObject *); |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
23 |
|
42593
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
24 static PyObject * |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
25 tb_dir(PyTracebackObject *self) |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
26 { |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
27 return Py_BuildValue("[ssss]", "tb_frame", "tb_next", |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
28 "tb_lasti", "tb_lineno"); |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
29 } |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
30 |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
31 static PyMethodDef tb_methods[] = { |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
32 {"__dir__", (PyCFunction)tb_dir, METH_NOARGS}, |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
33 {NULL, NULL, 0, NULL}, |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
34 }; |
|
5391b5f8cd7a
Bug #1772489: make dir() work on traceback objects again.
Collin Winter <collinw@gmail.com>
parents:
42591
diff
changeset
|
35 |
|
42537
74a3c6826683
Remove support for __members__ and __methods__. There still might be
Neal Norwitz <nnorwitz@gmail.com>
parents:
42334
diff
changeset
|
36 static PyMemberDef tb_memberlist[] = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
37 {"tb_next", T_OBJECT, OFF(tb_next), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
38 {"tb_frame", T_OBJECT, OFF(tb_frame), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
39 {"tb_lasti", T_INT, OFF(tb_lasti), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
40 {"tb_lineno", T_INT, OFF(tb_lineno), READONLY}, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
41 {NULL} /* Sentinel */ |
| 86 | 42 }; |
| 43 | |
| 44 static void | |
|
31739
49ec0d8f08ec
Moved tracebackobject to traceback.h, Closes SF Bug #497067
Nicholas Bastin <nick.bastin@gmail.com>
parents:
30968
diff
changeset
|
45 tb_dealloc(PyTracebackObject *tb) |
| 86 | 46 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
47 PyObject_GC_UnTrack(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
48 Py_TRASHCAN_SAFE_BEGIN(tb) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
49 Py_XDECREF(tb->tb_next); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
50 Py_XDECREF(tb->tb_frame); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
51 PyObject_GC_Del(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
52 Py_TRASHCAN_SAFE_END(tb) |
| 86 | 53 } |
| 54 | |
|
20623
4fb7727e4f47
Make traceback objects collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20618
diff
changeset
|
55 static int |
|
31739
49ec0d8f08ec
Moved tracebackobject to traceback.h, Closes SF Bug #497067
Nicholas Bastin <nick.bastin@gmail.com>
parents:
30968
diff
changeset
|
56 tb_traverse(PyTracebackObject *tb, visitproc visit, void *arg) |
|
20623
4fb7727e4f47
Make traceback objects collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20618
diff
changeset
|
57 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
58 Py_VISIT(tb->tb_next); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
59 Py_VISIT(tb->tb_frame); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
60 return 0; |
|
20623
4fb7727e4f47
Make traceback objects collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20618
diff
changeset
|
61 } |
|
4fb7727e4f47
Make traceback objects collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20618
diff
changeset
|
62 |
|
4fb7727e4f47
Make traceback objects collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20618
diff
changeset
|
63 static void |
|
31739
49ec0d8f08ec
Moved tracebackobject to traceback.h, Closes SF Bug #497067
Nicholas Bastin <nick.bastin@gmail.com>
parents:
30968
diff
changeset
|
64 tb_clear(PyTracebackObject *tb) |
|
20623
4fb7727e4f47
Make traceback objects collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20618
diff
changeset
|
65 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
66 Py_CLEAR(tb->tb_next); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
67 Py_CLEAR(tb->tb_frame); |
|
20623
4fb7727e4f47
Make traceback objects collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20618
diff
changeset
|
68 } |
|
4fb7727e4f47
Make traceback objects collectable.
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
20618
diff
changeset
|
69 |
|
20618
57b51966a4f1
Removed two pointless and obfuscating macros.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
70 PyTypeObject PyTraceBack_Type = { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
71 PyVarObject_HEAD_INIT(&PyType_Type, 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
72 "traceback", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
73 sizeof(PyTracebackObject), |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
74 0, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
75 (destructor)tb_dealloc, /*tp_dealloc*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
76 0, /*tp_print*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
77 0, /*tp_getattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
78 0, /*tp_setattr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
79 0, /*tp_reserved*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
80 0, /*tp_repr*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
81 0, /*tp_as_number*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
82 0, /*tp_as_sequence*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
83 0, /*tp_as_mapping*/ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
84 0, /* tp_hash */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
85 0, /* tp_call */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
86 0, /* tp_str */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
87 PyObject_GenericGetAttr, /* tp_getattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
88 0, /* tp_setattro */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
89 0, /* tp_as_buffer */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
90 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
91 0, /* tp_doc */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
92 (traverseproc)tb_traverse, /* tp_traverse */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
93 (inquiry)tb_clear, /* tp_clear */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
94 0, /* tp_richcompare */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
95 0, /* tp_weaklistoffset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
96 0, /* tp_iter */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
97 0, /* tp_iternext */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
98 tb_methods, /* tp_methods */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
99 tb_memberlist, /* tp_members */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
100 0, /* tp_getset */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
101 0, /* tp_base */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
102 0, /* tp_dict */ |
| 86 | 103 }; |
| 104 | |
|
31739
49ec0d8f08ec
Moved tracebackobject to traceback.h, Closes SF Bug #497067
Nicholas Bastin <nick.bastin@gmail.com>
parents:
30968
diff
changeset
|
105 static PyTracebackObject * |
|
49ec0d8f08ec
Moved tracebackobject to traceback.h, Closes SF Bug #497067
Nicholas Bastin <nick.bastin@gmail.com>
parents:
30968
diff
changeset
|
106 newtracebackobject(PyTracebackObject *next, PyFrameObject *frame) |
| 86 | 107 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
108 PyTracebackObject *tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
109 if ((next != NULL && !PyTraceBack_Check(next)) || |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
110 frame == NULL || !PyFrame_Check(frame)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
111 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
112 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
113 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
114 tb = PyObject_GC_New(PyTracebackObject, &PyTraceBack_Type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
115 if (tb != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
116 Py_XINCREF(next); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
117 tb->tb_next = next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
118 Py_XINCREF(frame); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
119 tb->tb_frame = frame; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
120 tb->tb_lasti = frame->f_lasti; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
55372
diff
changeset
|
121 tb->tb_lineno = PyFrame_GetLineNumber(frame); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
122 PyObject_GC_Track(tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
123 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
124 return tb; |
| 86 | 125 } |
| 126 | |
| 127 int | |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
128 PyTraceBack_Here(PyFrameObject *frame) |
| 86 | 129 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
130 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
131 PyTracebackObject *oldtb = (PyTracebackObject *) tstate->curexc_traceback; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
132 PyTracebackObject *tb = newtracebackobject(oldtb, frame); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
133 if (tb == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
134 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
135 tstate->curexc_traceback = (PyObject *)tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
136 Py_XDECREF(oldtb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
137 return 0; |
| 86 | 138 } |
| 139 | |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
140 static PyObject * |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
141 _Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *io) |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
142 { |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
143 Py_ssize_t i; |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
144 PyObject *binary; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
145 PyObject *v; |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
146 Py_ssize_t npath; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
147 size_t taillen; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
148 PyObject *syspath; |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
149 PyObject *path; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
150 const char* tail; |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
151 PyObject *filebytes; |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
152 const char* filepath; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
153 Py_ssize_t len; |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
154 PyObject* result; |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72918
diff
changeset
|
155 _Py_IDENTIFIER(open); |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
156 |
|
65399
55ed5c524428
Issue #9713, #10114: Parser functions (eg. PyParser_ASTFromFile) expects
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65331
diff
changeset
|
157 filebytes = PyUnicode_EncodeFSDefault(filename); |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
158 if (filebytes == NULL) { |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
159 PyErr_Clear(); |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
160 return NULL; |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
161 } |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
162 filepath = PyBytes_AS_STRING(filebytes); |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
163 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
164 /* Search tail of filename in sys.path before giving up */ |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
165 tail = strrchr(filepath, SEP); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
166 if (tail == NULL) |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
167 tail = filepath; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
168 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
169 tail++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
170 taillen = strlen(tail); |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
171 |
|
86974
954167ce92a3
Issue #19512: add some common identifiers to only create common strings once,
Victor Stinner <victor.stinner@gmail.com>
parents:
86532
diff
changeset
|
172 syspath = _PySys_GetObjectId(&_PyId_path); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
173 if (syspath == NULL || !PyList_Check(syspath)) |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
174 goto error; |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
175 npath = PyList_Size(syspath); |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
176 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
177 for (i = 0; i < npath; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
178 v = PyList_GetItem(syspath, i); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
179 if (v == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
180 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
181 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
182 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
183 if (!PyUnicode_Check(v)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
184 continue; |
|
65399
55ed5c524428
Issue #9713, #10114: Parser functions (eg. PyParser_ASTFromFile) expects
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65331
diff
changeset
|
185 path = PyUnicode_EncodeFSDefault(v); |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
186 if (path == NULL) { |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
187 PyErr_Clear(); |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
188 continue; |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
189 } |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
190 len = PyBytes_GET_SIZE(path); |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
191 if (len + 1 + (Py_ssize_t)taillen >= (Py_ssize_t)namelen - 1) { |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
192 Py_DECREF(path); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
193 continue; /* Too long */ |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
194 } |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
195 strcpy(namebuf, PyBytes_AS_STRING(path)); |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
196 Py_DECREF(path); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
197 if (strlen(namebuf) != len) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
198 continue; /* v contains '\0' */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
199 if (len > 0 && namebuf[len-1] != SEP) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
200 namebuf[len++] = SEP; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
201 strcpy(namebuf+len, tail); |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
202 |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72710
diff
changeset
|
203 binary = _PyObject_CallMethodId(io, &PyId_open, "ss", namebuf, "rb"); |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
204 if (binary != NULL) { |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
205 result = binary; |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
206 goto finally; |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
207 } |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
208 PyErr_Clear(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
209 } |
|
65536
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
210 goto error; |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
211 |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
212 error: |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
213 result = NULL; |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
214 finally: |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
215 Py_DECREF(filebytes); |
|
42b84d3188d1
Recorded merge of revisions 85569-85570 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
65332
diff
changeset
|
216 return result; |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
217 } |
|
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
218 |
|
46430
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
219 int |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
220 _Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent) |
| 86 | 221 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
222 int err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
223 int fd; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
224 int i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
225 char *found_encoding; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
226 char *encoding; |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
227 PyObject *io; |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
228 PyObject *binary; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
229 PyObject *fob = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
230 PyObject *lineobj = NULL; |
|
65332
6296632ad2cb
Merged revisions 85497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
62393
diff
changeset
|
231 PyObject *res; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
232 char buf[MAXPATHLEN+1]; |
| 72475 | 233 int kind; |
| 234 void *data; | |
|
72925
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72918
diff
changeset
|
235 _Py_IDENTIFIER(close); |
|
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72918
diff
changeset
|
236 _Py_IDENTIFIER(open); |
|
7109f31300fb
Rename _Py_identifier to _Py_IDENTIFIER.
Martin v. Löwis <martin@v.loewis.de>
parents:
72918
diff
changeset
|
237 _Py_IDENTIFIER(TextIOWrapper); |
|
44742
14d4104976fc
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44157
diff
changeset
|
238 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
239 /* open the file */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
240 if (filename == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
241 return 0; |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
242 |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
243 io = PyImport_ImportModuleNoBlock("io"); |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
244 if (io == NULL) |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
245 return -1; |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72710
diff
changeset
|
246 binary = _PyObject_CallMethodId(io, &PyId_open, "Os", filename, "rb"); |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
247 |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
248 if (binary == NULL) { |
|
84647
2e42c0a39321
Issue #18408: Fix _Py_DisplaySourceLine()
Victor Stinner <victor.stinner@gmail.com>
parents:
83802
diff
changeset
|
249 PyErr_Clear(); |
|
2e42c0a39321
Issue #18408: Fix _Py_DisplaySourceLine()
Victor Stinner <victor.stinner@gmail.com>
parents:
83802
diff
changeset
|
250 |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
251 binary = _Py_FindSourceFile(filename, buf, sizeof(buf), io); |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
252 if (binary == NULL) { |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
253 Py_DECREF(io); |
|
84647
2e42c0a39321
Issue #18408: Fix _Py_DisplaySourceLine()
Victor Stinner <victor.stinner@gmail.com>
parents:
83802
diff
changeset
|
254 return -1; |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
255 } |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
256 } |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
257 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
258 /* use the right encoding to decode the file as unicode */ |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
259 fd = PyObject_AsFileDescriptor(binary); |
|
84750
82e9a9f8be3c
Check return value of PyObject_AsFileDescriptor() in _Py_DisplaySourceLine() for error
Christian Heimes <christian@cheimes.de>
parents:
78329
diff
changeset
|
260 if (fd < 0) { |
|
82e9a9f8be3c
Check return value of PyObject_AsFileDescriptor() in _Py_DisplaySourceLine() for error
Christian Heimes <christian@cheimes.de>
parents:
78329
diff
changeset
|
261 Py_DECREF(io); |
|
82e9a9f8be3c
Check return value of PyObject_AsFileDescriptor() in _Py_DisplaySourceLine() for error
Christian Heimes <christian@cheimes.de>
parents:
78329
diff
changeset
|
262 Py_DECREF(binary); |
|
84766
34ca4dd47c54
let's not return NULL from functions that should return ints
Benjamin Peterson <benjamin@python.org>
parents:
84757
diff
changeset
|
263 return 0; |
|
84750
82e9a9f8be3c
Check return value of PyObject_AsFileDescriptor() in _Py_DisplaySourceLine() for error
Christian Heimes <christian@cheimes.de>
parents:
78329
diff
changeset
|
264 } |
|
69148
7b8d625eb6e4
Issue #9319: Include the filename in "Non-UTF8 code ..." syntax error.
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69102
diff
changeset
|
265 found_encoding = PyTokenizer_FindEncodingFilename(fd, filename); |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
266 encoding = (found_encoding != NULL) ? found_encoding : "utf-8"; |
|
84757
8fdb83492a58
Check return value of lseek() in _Py_DisplaySourceLine().
Christian Heimes <christian@cheimes.de>
parents:
84750
diff
changeset
|
267 /* Reset position */ |
|
8fdb83492a58
Check return value of lseek() in _Py_DisplaySourceLine().
Christian Heimes <christian@cheimes.de>
parents:
84750
diff
changeset
|
268 if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { |
|
8fdb83492a58
Check return value of lseek() in _Py_DisplaySourceLine().
Christian Heimes <christian@cheimes.de>
parents:
84750
diff
changeset
|
269 Py_DECREF(io); |
|
8fdb83492a58
Check return value of lseek() in _Py_DisplaySourceLine().
Christian Heimes <christian@cheimes.de>
parents:
84750
diff
changeset
|
270 Py_DECREF(binary); |
|
8fdb83492a58
Check return value of lseek() in _Py_DisplaySourceLine().
Christian Heimes <christian@cheimes.de>
parents:
84750
diff
changeset
|
271 PyMem_FREE(found_encoding); |
|
84766
34ca4dd47c54
let's not return NULL from functions that should return ints
Benjamin Peterson <benjamin@python.org>
parents:
84757
diff
changeset
|
272 return 0; |
|
84757
8fdb83492a58
Check return value of lseek() in _Py_DisplaySourceLine().
Christian Heimes <christian@cheimes.de>
parents:
84750
diff
changeset
|
273 } |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72710
diff
changeset
|
274 fob = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "Os", binary, encoding); |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
275 Py_DECREF(io); |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
276 Py_DECREF(binary); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
277 PyMem_FREE(found_encoding); |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
278 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
279 if (fob == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
280 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
281 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
282 } |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
283 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
284 /* get the line number lineno */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
285 for (i = 0; i < lineno; i++) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
286 Py_XDECREF(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
287 lineobj = PyFile_GetLine(fob, -1); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
288 if (!lineobj) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
289 err = -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
290 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
291 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
292 } |
|
72835
5e33219492bc
Add API for static strings, primarily good for identifiers.
Martin v. Löwis <martin@v.loewis.de>
parents:
72710
diff
changeset
|
293 res = _PyObject_CallMethodId(fob, &PyId_close, ""); |
|
65332
6296632ad2cb
Merged revisions 85497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
62393
diff
changeset
|
294 if (res) |
|
6296632ad2cb
Merged revisions 85497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
62393
diff
changeset
|
295 Py_DECREF(res); |
|
6296632ad2cb
Merged revisions 85497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
62393
diff
changeset
|
296 else |
|
6296632ad2cb
Merged revisions 85497 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
62393
diff
changeset
|
297 PyErr_Clear(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
298 Py_DECREF(fob); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
299 if (!lineobj || !PyUnicode_Check(lineobj)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
300 Py_XDECREF(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
301 return err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
302 } |
|
49484
0b7e023803fb
Issues #2384 and #3975: Tracebacks were not correctly printed when the source file
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents:
48660
diff
changeset
|
303 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
304 /* remove the indentation of the line */ |
| 72475 | 305 kind = PyUnicode_KIND(lineobj); |
| 306 data = PyUnicode_DATA(lineobj); | |
| 307 for (i=0; i < PyUnicode_GET_LENGTH(lineobj); i++) { | |
| 308 Py_UCS4 ch = PyUnicode_READ(kind, data, i); | |
| 309 if (ch != ' ' && ch != '\t' && ch != '\014') | |
| 310 break; | |
| 311 } | |
| 312 if (i) { | |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
313 PyObject *truncated; |
| 72475 | 314 truncated = PyUnicode_Substring(lineobj, i, PyUnicode_GET_LENGTH(lineobj)); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
315 if (truncated) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
316 Py_DECREF(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
317 lineobj = truncated; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
318 } else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
319 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
320 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
321 } |
|
46430
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
322 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
323 /* Write some spaces before the line */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
324 strcpy(buf, " "); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
325 assert (strlen(buf) == 10); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
326 while (indent > 0) { |
| 84768 | 327 if (indent < 10) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
328 buf[indent] = '\0'; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
329 err = PyFile_WriteString(buf, f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
330 if (err != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
331 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
332 indent -= 10; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
333 } |
|
48474
2ee09afee126
implement chained exception tracebacks
Benjamin Peterson <benjamin@python.org>
parents:
47301
diff
changeset
|
334 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
335 /* finally display the line */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
336 if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
337 err = PyFile_WriteObject(lineobj, f, Py_PRINT_RAW); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
338 Py_DECREF(lineobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
339 if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
340 err = PyFile_WriteString("\n", f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
341 return err; |
| 86 | 342 } |
| 343 | |
|
5608
79e49cbce2ef
PyFile_WriteString now returns an error indicator instead of calling
Guido van Rossum <guido@python.org>
parents:
5405
diff
changeset
|
344 static int |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
345 tb_displayline(PyObject *f, PyObject *filename, int lineno, PyObject *name) |
| 86 | 346 { |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
347 int err; |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
348 PyObject *line; |
|
46430
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
349 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
350 if (filename == NULL || name == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
351 return -1; |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
352 line = PyUnicode_FromFormat(" File \"%U\", line %d, in %U\n", |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
353 filename, lineno, name); |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
354 if (line == NULL) |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
355 return -1; |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
356 err = PyFile_WriteObject(line, f, Py_PRINT_RAW); |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
357 Py_DECREF(line); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
358 if (err != 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
359 return err; |
|
78185
54524897fafc
Issue #15365: Make traceback reporting ignore any errors when printing out
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
73686
diff
changeset
|
360 /* ignore errors since we can't report them, can we? */ |
|
54524897fafc
Issue #15365: Make traceback reporting ignore any errors when printing out
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
73686
diff
changeset
|
361 if (_Py_DisplaySourceLine(f, filename, lineno, 4)) |
|
54524897fafc
Issue #15365: Make traceback reporting ignore any errors when printing out
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
73686
diff
changeset
|
362 PyErr_Clear(); |
|
54524897fafc
Issue #15365: Make traceback reporting ignore any errors when printing out
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
73686
diff
changeset
|
363 return err; |
|
46430
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
364 } |
|
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
365 |
|
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
366 static int |
|
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
367 tb_printinternal(PyTracebackObject *tb, PyObject *f, long limit) |
|
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44742
diff
changeset
|
368 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
369 int err = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
370 long depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
371 PyTracebackObject *tb1 = tb; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
372 while (tb1 != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
373 depth++; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
374 tb1 = tb1->tb_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
375 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
376 while (tb != NULL && err == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
377 if (depth <= limit) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
378 err = tb_displayline(f, |
|
62393
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
379 tb->tb_frame->f_code->co_filename, |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
380 tb->tb_lineno, |
|
fa830371c724
Merged revisions 82059,82061 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
61467
diff
changeset
|
381 tb->tb_frame->f_code->co_name); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
382 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
383 depth--; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
384 tb = tb->tb_next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
385 if (err == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
386 err = PyErr_CheckSignals(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
387 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
388 return err; |
| 86 | 389 } |
| 390 | |
|
44157
565012d1123d
Removed another occurrence of PyInt_ExactCheck()
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
391 #define PyTraceBack_LIMIT 1000 |
|
565012d1123d
Removed another occurrence of PyInt_ExactCheck()
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
392 |
| 86 | 393 int |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
394 PyTraceBack_Print(PyObject *v, PyObject *f) |
| 86 | 395 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
396 int err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
397 PyObject *limitv; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
398 long limit = PyTraceBack_LIMIT; |
|
44157
565012d1123d
Removed another occurrence of PyInt_ExactCheck()
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
399 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
400 if (v == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
401 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
402 if (!PyTraceBack_Check(v)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
403 PyErr_BadInternalCall(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
404 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
405 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
406 limitv = PySys_GetObject("tracebacklimit"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
407 if (limitv) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
408 PyObject *exc_type, *exc_value, *exc_tb; |
|
44157
565012d1123d
Removed another occurrence of PyInt_ExactCheck()
Christian Heimes <christian@cheimes.de>
parents:
44099
diff
changeset
|
409 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
410 PyErr_Fetch(&exc_type, &exc_value, &exc_tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
411 limit = PyLong_AsLong(limitv); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
412 if (limit == -1 && PyErr_Occurred()) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
413 if (PyErr_ExceptionMatches(PyExc_OverflowError)) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
414 limit = PyTraceBack_LIMIT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
415 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
416 else { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
417 Py_XDECREF(exc_type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
418 Py_XDECREF(exc_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
419 Py_XDECREF(exc_tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
420 return 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
421 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
422 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
423 else if (limit <= 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
424 limit = PyTraceBack_LIMIT; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
425 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
426 PyErr_Restore(exc_type, exc_value, exc_tb); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
427 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
428 err = PyFile_WriteString("Traceback (most recent call last):\n", f); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
429 if (!err) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
430 err = tb_printinternal((PyTracebackObject *)v, f, limit); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
51271
diff
changeset
|
431 return err; |
| 86 | 432 } |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
433 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
434 /* Reverse a string. For example, "abcd" becomes "dcba". |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
435 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
436 This function is signal safe. */ |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
437 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
438 static void |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
439 reverse_string(char *text, const size_t len) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
440 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
441 char tmp; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
442 size_t i, j; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
443 if (len == 0) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
444 return; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
445 for (i=0, j=len-1; i < j; i++, j--) { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
446 tmp = text[i]; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
447 text[i] = text[j]; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
448 text[j] = tmp; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
449 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
450 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
451 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
452 /* Format an integer in range [0; 999999] to decimal, |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
453 and write it into the file fd. |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
454 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
455 This function is signal safe. */ |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
456 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
457 static void |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
458 dump_decimal(int fd, int value) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
459 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
460 char buffer[7]; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
461 int len; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
462 if (value < 0 || 999999 < value) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
463 return; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
464 len = 0; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
465 do { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
466 buffer[len] = '0' + (value % 10); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
467 value /= 10; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
468 len++; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
469 } while (value); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
470 reverse_string(buffer, len); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
471 write(fd, buffer, len); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
472 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
473 |
|
86532
cc8c37b5b449
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
Guido van Rossum <guido@dropbox.com>
parents:
84769
diff
changeset
|
474 /* Format an integer in range [0; 0xffffffff] to hexadecimal of 'width' digits, |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
475 and write it into the file fd. |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
476 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
477 This function is signal safe. */ |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
478 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
479 static void |
|
86532
cc8c37b5b449
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
Guido van Rossum <guido@dropbox.com>
parents:
84769
diff
changeset
|
480 dump_hexadecimal(int fd, unsigned long value, int width) |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
481 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
482 int len; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
483 char buffer[sizeof(unsigned long) * 2 + 1]; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
484 len = 0; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
485 do { |
|
72918
d76338eacf7c
Issue #13088: Add shared Py_hexdigits constant to format a number into base 16
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72835
diff
changeset
|
486 buffer[len] = Py_hexdigits[value & 15]; |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
487 value >>= 4; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
488 len++; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
489 } while (len < width || value); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
490 reverse_string(buffer, len); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
491 write(fd, buffer, len); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
492 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
493 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
494 /* Write an unicode object into the file fd using ascii+backslashreplace. |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
495 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
496 This function is signal safe. */ |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
497 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
498 static void |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
499 dump_ascii(int fd, PyObject *text) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
500 { |
| 72475 | 501 PyASCIIObject *ascii = (PyASCIIObject *)text; |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
502 Py_ssize_t i, size; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
503 int truncated; |
| 72475 | 504 int kind; |
|
72710
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
505 void *data = NULL; |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
506 wchar_t *wstr = NULL; |
| 72475 | 507 Py_UCS4 ch; |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
508 |
| 72475 | 509 size = ascii->length; |
| 510 kind = ascii->state.kind; | |
| 511 if (ascii->state.compact) { | |
| 512 if (ascii->state.ascii) | |
| 513 data = ((PyASCIIObject*)text) + 1; | |
| 514 else | |
| 515 data = ((PyCompactUnicodeObject*)text) + 1; | |
| 516 } | |
|
72710
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
517 else if (kind != PyUnicode_WCHAR_KIND) { |
| 72475 | 518 data = ((PyUnicodeObject *)text)->data.any; |
| 519 if (data == NULL) | |
| 520 return; | |
| 521 } | |
|
72710
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
522 else { |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
523 wstr = ((PyASCIIObject *)text)->wstr; |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
524 if (wstr == NULL) |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
525 return; |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
526 size = ((PyCompactUnicodeObject *)text)->wstr_length; |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
527 } |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
528 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
529 if (MAX_STRING_LENGTH < size) { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
530 size = MAX_STRING_LENGTH; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
531 truncated = 1; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
532 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
533 else |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
534 truncated = 0; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
535 |
| 72475 | 536 for (i=0; i < size; i++) { |
|
72710
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
537 if (kind != PyUnicode_WCHAR_KIND) |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
538 ch = PyUnicode_READ(kind, data, i); |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
539 else |
|
2a8ccff8f337
traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72475
diff
changeset
|
540 ch = wstr[i]; |
| 72475 | 541 if (ch < 128) { |
| 542 char c = (char)ch; | |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
543 write(fd, &c, 1); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
544 } |
|
73686
59dcb6249034
Remove "#ifdef Py_UNICODE_WIDE": Python is now always wide
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72925
diff
changeset
|
545 else if (ch < 0xff) { |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
546 PUTS(fd, "\\x"); |
|
86532
cc8c37b5b449
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
Guido van Rossum <guido@dropbox.com>
parents:
84769
diff
changeset
|
547 dump_hexadecimal(fd, ch, 2); |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
548 } |
|
73686
59dcb6249034
Remove "#ifdef Py_UNICODE_WIDE": Python is now always wide
Victor Stinner <victor.stinner@haypocalc.com>
parents:
72925
diff
changeset
|
549 else if (ch < 0xffff) { |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
550 PUTS(fd, "\\u"); |
|
86532
cc8c37b5b449
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
Guido van Rossum <guido@dropbox.com>
parents:
84769
diff
changeset
|
551 dump_hexadecimal(fd, ch, 4); |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
552 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
553 else { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
554 PUTS(fd, "\\U"); |
|
86532
cc8c37b5b449
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
Guido van Rossum <guido@dropbox.com>
parents:
84769
diff
changeset
|
555 dump_hexadecimal(fd, ch, 8); |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
556 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
557 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
558 if (truncated) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
559 PUTS(fd, "..."); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
560 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
561 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
562 /* Write a frame into the file fd: "File "xxx", line xxx in xxx". |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
563 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
564 This function is signal safe. */ |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
565 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
566 static void |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
567 dump_frame(int fd, PyFrameObject *frame) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
568 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
569 PyCodeObject *code; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
570 int lineno; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
571 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
572 code = frame->f_code; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
573 PUTS(fd, " File "); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
574 if (code != NULL && code->co_filename != NULL |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
575 && PyUnicode_Check(code->co_filename)) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
576 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
577 write(fd, "\"", 1); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
578 dump_ascii(fd, code->co_filename); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
579 write(fd, "\"", 1); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
580 } else { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
581 PUTS(fd, "???"); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
582 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
583 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
584 /* PyFrame_GetLineNumber() was introduced in Python 2.7.0 and 3.2.0 */ |
| 72475 | 585 lineno = PyCode_Addr2Line(code, frame->f_lasti); |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
586 PUTS(fd, ", line "); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
587 dump_decimal(fd, lineno); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
588 PUTS(fd, " in "); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
589 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
590 if (code != NULL && code->co_name != NULL |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
591 && PyUnicode_Check(code->co_name)) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
592 dump_ascii(fd, code->co_name); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
593 else |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
594 PUTS(fd, "???"); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
595 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
596 write(fd, "\n", 1); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
597 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
598 |
|
69102
7e3ed426962f
Issue #11393: _Py_DumpTraceback() writes the header even if there is no frame
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69070
diff
changeset
|
599 static void |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
600 dump_traceback(int fd, PyThreadState *tstate, int write_header) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
601 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
602 PyFrameObject *frame; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
603 unsigned int depth; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
604 |
|
69102
7e3ed426962f
Issue #11393: _Py_DumpTraceback() writes the header even if there is no frame
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69070
diff
changeset
|
605 if (write_header) |
|
86532
cc8c37b5b449
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
Guido van Rossum <guido@dropbox.com>
parents:
84769
diff
changeset
|
606 PUTS(fd, "Stack (most recent call first):\n"); |
|
69102
7e3ed426962f
Issue #11393: _Py_DumpTraceback() writes the header even if there is no frame
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69070
diff
changeset
|
607 |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
608 frame = _PyThreadState_GetFrame(tstate); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
609 if (frame == NULL) |
|
69102
7e3ed426962f
Issue #11393: _Py_DumpTraceback() writes the header even if there is no frame
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69070
diff
changeset
|
610 return; |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
611 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
612 depth = 0; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
613 while (frame != NULL) { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
614 if (MAX_FRAME_DEPTH <= depth) { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
615 PUTS(fd, " ...\n"); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
616 break; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
617 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
618 if (!PyFrame_Check(frame)) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
619 break; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
620 dump_frame(fd, frame); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
621 frame = frame->f_back; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
622 depth++; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
623 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
624 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
625 |
|
69102
7e3ed426962f
Issue #11393: _Py_DumpTraceback() writes the header even if there is no frame
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69070
diff
changeset
|
626 void |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
627 _Py_DumpTraceback(int fd, PyThreadState *tstate) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
628 { |
|
69102
7e3ed426962f
Issue #11393: _Py_DumpTraceback() writes the header even if there is no frame
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69070
diff
changeset
|
629 dump_traceback(fd, tstate, 1); |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
630 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
631 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
632 /* Write the thread identifier into the file 'fd': "Current thread 0xHHHH:\" if |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
633 is_current is true, "Thread 0xHHHH:\n" otherwise. |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
634 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
635 This function is signal safe. */ |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
636 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
637 static void |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
638 write_thread_id(int fd, PyThreadState *tstate, int is_current) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
639 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
640 if (is_current) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
641 PUTS(fd, "Current thread 0x"); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
642 else |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
643 PUTS(fd, "Thread 0x"); |
|
86532
cc8c37b5b449
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
Guido van Rossum <guido@dropbox.com>
parents:
84769
diff
changeset
|
644 dump_hexadecimal(fd, (unsigned long)tstate->thread_id, sizeof(long)*2); |
|
cc8c37b5b449
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
Guido van Rossum <guido@dropbox.com>
parents:
84769
diff
changeset
|
645 PUTS(fd, " (most recent call first):\n"); |
|
69070
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
646 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
647 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
648 const char* |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
649 _Py_DumpTracebackThreads(int fd, PyInterpreterState *interp, |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
650 PyThreadState *current_thread) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
651 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
652 PyThreadState *tstate; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
653 unsigned int nthreads; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
654 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
655 /* Get the current interpreter from the current thread */ |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
656 tstate = PyInterpreterState_ThreadHead(interp); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
657 if (tstate == NULL) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
658 return "unable to get the thread head state"; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
659 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
660 /* Dump the traceback of each thread */ |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
661 tstate = PyInterpreterState_ThreadHead(interp); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
662 nthreads = 0; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
663 do |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
664 { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
665 if (nthreads != 0) |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
666 write(fd, "\n", 1); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
667 if (nthreads >= MAX_NTHREADS) { |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
668 PUTS(fd, "...\n"); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
669 break; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
670 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
671 write_thread_id(fd, tstate, tstate == current_thread); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
672 dump_traceback(fd, tstate, 0); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
673 tstate = PyThreadState_Next(tstate); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
674 nthreads++; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
675 } while (tstate != NULL); |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
676 |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
677 return NULL; |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
678 } |
|
b0680b5a5215
Issue #11393: Add the new faulthandler module
Victor Stinner <victor.stinner@haypocalc.com>
parents:
68257
diff
changeset
|
679 |
