1991-02-19 12:39:46 +00:00
|
|
|
|
1990-12-20 15:06:42 +00:00
|
|
|
/* Traceback implementation */
|
|
|
|
|
|
1997-04-29 18:33:38 +00:00
|
|
|
#include "Python.h"
|
1990-12-20 15:06:42 +00:00
|
|
|
|
2005-10-20 19:59:25 +00:00
|
|
|
#include "code.h"
|
1990-12-20 15:06:42 +00:00
|
|
|
#include "frameobject.h"
|
|
|
|
|
#include "structmember.h"
|
1992-02-26 15:17:59 +00:00
|
|
|
#include "osdefs.h"
|
2008-10-09 23:37:48 +00:00
|
|
|
#ifdef HAVE_FCNTL_H
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#endif
|
1990-12-20 15:06:42 +00:00
|
|
|
|
2004-03-21 18:37:23 +00:00
|
|
|
#define OFF(x) offsetof(PyTracebackObject, x)
|
1990-12-20 15:06:42 +00:00
|
|
|
|
2013-05-17 00:12:04 +02:00
|
|
|
#define PUTS(fd, str) write(fd, str, (int)strlen(str))
|
2012-07-30 13:08:58 +02:00
|
|
|
#define MAX_STRING_LENGTH 500
|
2011-03-31 01:31:06 +02:00
|
|
|
#define MAX_FRAME_DEPTH 100
|
|
|
|
|
#define MAX_NTHREADS 100
|
|
|
|
|
|
2011-04-05 01:48:03 +02:00
|
|
|
/* Function from Parser/tokenizer.c */
|
|
|
|
|
extern char * PyTokenizer_FindEncodingFilename(int, PyObject *);
|
2008-10-09 23:37:48 +00:00
|
|
|
|
2013-11-07 23:07:29 +01:00
|
|
|
_Py_IDENTIFIER(TextIOWrapper);
|
|
|
|
|
_Py_IDENTIFIER(close);
|
|
|
|
|
_Py_IDENTIFIER(open);
|
|
|
|
|
_Py_IDENTIFIER(path);
|
|
|
|
|
|
2007-08-14 17:53:54 +00:00
|
|
|
static PyObject *
|
|
|
|
|
tb_dir(PyTracebackObject *self)
|
|
|
|
|
{
|
|
|
|
|
return Py_BuildValue("[ssss]", "tb_frame", "tb_next",
|
|
|
|
|
"tb_lasti", "tb_lineno");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static PyMethodDef tb_methods[] = {
|
|
|
|
|
{"__dir__", (PyCFunction)tb_dir, METH_NOARGS},
|
|
|
|
|
{NULL, NULL, 0, NULL},
|
|
|
|
|
};
|
|
|
|
|
|
2007-08-11 06:39:53 +00:00
|
|
|
static PyMemberDef tb_memberlist[] = {
|
2010-05-09 15:52:27 +00:00
|
|
|
{"tb_next", T_OBJECT, OFF(tb_next), READONLY},
|
|
|
|
|
{"tb_frame", T_OBJECT, OFF(tb_frame), READONLY},
|
|
|
|
|
{"tb_lasti", T_INT, OFF(tb_lasti), READONLY},
|
|
|
|
|
{"tb_lineno", T_INT, OFF(tb_lineno), READONLY},
|
|
|
|
|
{NULL} /* Sentinel */
|
1990-12-20 15:06:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void
|
2004-03-21 18:37:23 +00:00
|
|
|
tb_dealloc(PyTracebackObject *tb)
|
1990-12-20 15:06:42 +00:00
|
|
|
{
|
2010-05-09 15:52:27 +00:00
|
|
|
PyObject_GC_UnTrack(tb);
|
|
|
|
|
Py_TRASHCAN_SAFE_BEGIN(tb)
|
|
|
|
|
Py_XDECREF(tb->tb_next);
|
|
|
|
|
Py_XDECREF(tb->tb_frame);
|
|
|
|
|
PyObject_GC_Del(tb);
|
|
|
|
|
Py_TRASHCAN_SAFE_END(tb)
|
1990-12-20 15:06:42 +00:00
|
|
|
}
|
|
|
|
|
|
2001-10-22 22:17:41 +00:00
|
|
|
static int
|
2004-03-21 18:37:23 +00:00
|
|
|
tb_traverse(PyTracebackObject *tb, visitproc visit, void *arg)
|
2001-10-22 22:17:41 +00:00
|
|
|
{
|
2010-05-09 15:52:27 +00:00
|
|
|
Py_VISIT(tb->tb_next);
|
|
|
|
|
Py_VISIT(tb->tb_frame);
|
|
|
|
|
return 0;
|
2001-10-22 22:17:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
2004-03-21 18:37:23 +00:00
|
|
|
tb_clear(PyTracebackObject *tb)
|
2001-10-22 22:17:41 +00:00
|
|
|
{
|
2010-05-09 15:52:27 +00:00
|
|
|
Py_CLEAR(tb->tb_next);
|
|
|
|
|
Py_CLEAR(tb->tb_frame);
|
2001-10-22 22:17:41 +00:00
|
|
|
}
|
|
|
|
|
|
2001-10-22 19:34:09 +00:00
|
|
|
PyTypeObject PyTraceBack_Type = {
|
2010-05-09 15:52:27 +00:00
|
|
|
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
|
|
|
|
"traceback",
|
|
|
|
|
sizeof(PyTracebackObject),
|
|
|
|
|
0,
|
|
|
|
|
(destructor)tb_dealloc, /*tp_dealloc*/
|
|
|
|
|
0, /*tp_print*/
|
|
|
|
|
0, /*tp_getattr*/
|
|
|
|
|
0, /*tp_setattr*/
|
|
|
|
|
0, /*tp_reserved*/
|
|
|
|
|
0, /*tp_repr*/
|
|
|
|
|
0, /*tp_as_number*/
|
|
|
|
|
0, /*tp_as_sequence*/
|
|
|
|
|
0, /*tp_as_mapping*/
|
|
|
|
|
0, /* tp_hash */
|
|
|
|
|
0, /* tp_call */
|
|
|
|
|
0, /* tp_str */
|
|
|
|
|
PyObject_GenericGetAttr, /* tp_getattro */
|
|
|
|
|
0, /* tp_setattro */
|
|
|
|
|
0, /* tp_as_buffer */
|
|
|
|
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
|
|
|
|
|
0, /* tp_doc */
|
|
|
|
|
(traverseproc)tb_traverse, /* tp_traverse */
|
|
|
|
|
(inquiry)tb_clear, /* tp_clear */
|
|
|
|
|
0, /* tp_richcompare */
|
|
|
|
|
0, /* tp_weaklistoffset */
|
|
|
|
|
0, /* tp_iter */
|
|
|
|
|
0, /* tp_iternext */
|
|
|
|
|
tb_methods, /* tp_methods */
|
|
|
|
|
tb_memberlist, /* tp_members */
|
|
|
|
|
0, /* tp_getset */
|
|
|
|
|
0, /* tp_base */
|
|
|
|
|
0, /* tp_dict */
|
1990-12-20 15:06:42 +00:00
|
|
|
};
|
|
|
|
|
|
2004-03-21 18:37:23 +00:00
|
|
|
static PyTracebackObject *
|
|
|
|
|
newtracebackobject(PyTracebackObject *next, PyFrameObject *frame)
|
1990-12-20 15:06:42 +00:00
|
|
|
{
|
2010-05-09 15:52:27 +00:00
|
|
|
PyTracebackObject *tb;
|
|
|
|
|
if ((next != NULL && !PyTraceBack_Check(next)) ||
|
|
|
|
|
frame == NULL || !PyFrame_Check(frame)) {
|
|
|
|
|
PyErr_BadInternalCall();
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
tb = PyObject_GC_New(PyTracebackObject, &PyTraceBack_Type);
|
|
|
|
|
if (tb != NULL) {
|
|
|
|
|
Py_XINCREF(next);
|
|
|
|
|
tb->tb_next = next;
|
|
|
|
|
Py_XINCREF(frame);
|
|
|
|
|
tb->tb_frame = frame;
|
|
|
|
|
tb->tb_lasti = frame->f_lasti;
|
|
|
|
|
tb->tb_lineno = PyFrame_GetLineNumber(frame);
|
|
|
|
|
PyObject_GC_Track(tb);
|
|
|
|
|
}
|
|
|
|
|
return tb;
|
1990-12-20 15:06:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
2000-07-22 18:47:25 +00:00
|
|
|
PyTraceBack_Here(PyFrameObject *frame)
|
1990-12-20 15:06:42 +00:00
|
|
|
{
|
2010-05-09 15:52:27 +00:00
|
|
|
PyThreadState *tstate = PyThreadState_GET();
|
|
|
|
|
PyTracebackObject *oldtb = (PyTracebackObject *) tstate->curexc_traceback;
|
|
|
|
|
PyTracebackObject *tb = newtracebackobject(oldtb, frame);
|
|
|
|
|
if (tb == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
tstate->curexc_traceback = (PyObject *)tb;
|
|
|
|
|
Py_XDECREF(oldtb);
|
|
|
|
|
return 0;
|
1990-12-20 15:06:42 +00:00
|
|
|
}
|
|
|
|
|
|
2010-06-17 23:08:50 +00:00
|
|
|
static PyObject *
|
|
|
|
|
_Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *io)
|
2008-10-09 23:37:48 +00:00
|
|
|
{
|
2010-06-17 23:08:50 +00:00
|
|
|
Py_ssize_t i;
|
|
|
|
|
PyObject *binary;
|
2010-05-09 15:52:27 +00:00
|
|
|
PyObject *v;
|
2010-06-17 23:08:50 +00:00
|
|
|
Py_ssize_t npath;
|
2010-05-09 15:52:27 +00:00
|
|
|
size_t taillen;
|
|
|
|
|
PyObject *syspath;
|
2010-10-16 13:14:10 +00:00
|
|
|
PyObject *path;
|
2010-05-09 15:52:27 +00:00
|
|
|
const char* tail;
|
2010-10-16 13:14:10 +00:00
|
|
|
PyObject *filebytes;
|
2010-06-17 23:08:50 +00:00
|
|
|
const char* filepath;
|
2010-05-09 15:52:27 +00:00
|
|
|
Py_ssize_t len;
|
2010-10-16 13:14:10 +00:00
|
|
|
PyObject* result;
|
2008-10-09 23:37:48 +00:00
|
|
|
|
2010-10-16 13:14:10 +00:00
|
|
|
filebytes = PyUnicode_EncodeFSDefault(filename);
|
|
|
|
|
if (filebytes == NULL) {
|
2010-06-17 23:08:50 +00:00
|
|
|
PyErr_Clear();
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2010-10-16 13:14:10 +00:00
|
|
|
filepath = PyBytes_AS_STRING(filebytes);
|
2010-06-17 23:08:50 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
/* Search tail of filename in sys.path before giving up */
|
2010-06-17 23:08:50 +00:00
|
|
|
tail = strrchr(filepath, SEP);
|
2010-05-09 15:52:27 +00:00
|
|
|
if (tail == NULL)
|
2010-06-17 23:08:50 +00:00
|
|
|
tail = filepath;
|
2010-05-09 15:52:27 +00:00
|
|
|
else
|
|
|
|
|
tail++;
|
|
|
|
|
taillen = strlen(tail);
|
2008-10-09 23:37:48 +00:00
|
|
|
|
2013-11-07 23:07:29 +01:00
|
|
|
syspath = _PySys_GetObjectId(&PyId_path);
|
2010-05-09 15:52:27 +00:00
|
|
|
if (syspath == NULL || !PyList_Check(syspath))
|
2010-10-16 13:14:10 +00:00
|
|
|
goto error;
|
2010-06-17 23:08:50 +00:00
|
|
|
npath = PyList_Size(syspath);
|
2008-10-09 23:37:48 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
for (i = 0; i < npath; i++) {
|
|
|
|
|
v = PyList_GetItem(syspath, i);
|
|
|
|
|
if (v == NULL) {
|
|
|
|
|
PyErr_Clear();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!PyUnicode_Check(v))
|
|
|
|
|
continue;
|
2010-10-16 13:14:10 +00:00
|
|
|
path = PyUnicode_EncodeFSDefault(v);
|
2010-06-17 23:08:50 +00:00
|
|
|
if (path == NULL) {
|
|
|
|
|
PyErr_Clear();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2010-10-16 13:14:10 +00:00
|
|
|
len = PyBytes_GET_SIZE(path);
|
|
|
|
|
if (len + 1 + (Py_ssize_t)taillen >= (Py_ssize_t)namelen - 1) {
|
|
|
|
|
Py_DECREF(path);
|
2010-05-09 15:52:27 +00:00
|
|
|
continue; /* Too long */
|
2010-10-16 13:14:10 +00:00
|
|
|
}
|
|
|
|
|
strcpy(namebuf, PyBytes_AS_STRING(path));
|
|
|
|
|
Py_DECREF(path);
|
2010-05-09 15:52:27 +00:00
|
|
|
if (strlen(namebuf) != len)
|
|
|
|
|
continue; /* v contains '\0' */
|
|
|
|
|
if (len > 0 && namebuf[len-1] != SEP)
|
|
|
|
|
namebuf[len++] = SEP;
|
|
|
|
|
strcpy(namebuf+len, tail);
|
2010-06-17 23:08:50 +00:00
|
|
|
|
2011-10-09 10:38:36 +02:00
|
|
|
binary = _PyObject_CallMethodId(io, &PyId_open, "ss", namebuf, "rb");
|
2010-10-16 13:14:10 +00:00
|
|
|
if (binary != NULL) {
|
|
|
|
|
result = binary;
|
|
|
|
|
goto finally;
|
|
|
|
|
}
|
2010-06-17 23:08:50 +00:00
|
|
|
PyErr_Clear();
|
2010-05-09 15:52:27 +00:00
|
|
|
}
|
2010-10-16 13:14:10 +00:00
|
|
|
goto error;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
result = NULL;
|
|
|
|
|
finally:
|
|
|
|
|
Py_DECREF(filebytes);
|
|
|
|
|
return result;
|
2008-10-09 23:37:48 +00:00
|
|
|
}
|
|
|
|
|
|
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62260 | gregory.p.smith | 2008-04-10 01:11:56 +0200 (Thu, 10 Apr 2008) | 2 lines
better diagnostics
........
r62261 | gregory.p.smith | 2008-04-10 01:16:37 +0200 (Thu, 10 Apr 2008) | 3 lines
Raise SystemError when size < 0 is passed into PyString_FromStringAndSize,
PyBytes_FromStringAndSize or PyUnicode_FromStringAndSize. [issue2587]
........
r62266 | neal.norwitz | 2008-04-10 07:46:39 +0200 (Thu, 10 Apr 2008) | 5 lines
Remove the test file before writing it in case there is no write permission.
This might help fix some of the failures on Windows box(es). It doesn't hurt
either way and ensure the tests are a little more self contained (ie have
less assumptions).
........
r62271 | gregory.p.smith | 2008-04-10 21:50:36 +0200 (Thu, 10 Apr 2008) | 2 lines
get rid of assert (size >= 0) now that an explicit if (size < 0) is in the code.
........
r62277 | andrew.kuchling | 2008-04-10 23:27:10 +0200 (Thu, 10 Apr 2008) | 1 line
Remove forward-looking statement
........
r62278 | andrew.kuchling | 2008-04-10 23:28:51 +0200 (Thu, 10 Apr 2008) | 1 line
Add punctuation
........
r62279 | andrew.kuchling | 2008-04-10 23:29:01 +0200 (Thu, 10 Apr 2008) | 1 line
Use issue directive
........
r62289 | thomas.heller | 2008-04-11 15:05:38 +0200 (Fri, 11 Apr 2008) | 3 lines
Move backwards compatibility macro to the correct place;
PyIndex_Check() was introduced in Python 2.5.
........
r62290 | thomas.heller | 2008-04-11 16:20:26 +0200 (Fri, 11 Apr 2008) | 2 lines
Performance improvements.
........
r62293 | christian.heimes | 2008-04-12 15:03:03 +0200 (Sat, 12 Apr 2008) | 2 lines
Applied patch #2617 from Frank Wierzbicki wit some extras from me
-J and -X are now reserved for Jython and non-standard arguments (e.g. IronPython). I've added some extra comments to make sure the reservation don't get missed in the future.
........
r62294 | georg.brandl | 2008-04-12 20:11:18 +0200 (Sat, 12 Apr 2008) | 2 lines
Use absolute path in sys.path.
........
r62295 | georg.brandl | 2008-04-12 20:36:09 +0200 (Sat, 12 Apr 2008) | 2 lines
#2615: small consistency update by Jeroen Ruigrok van der Werven.
........
r62296 | georg.brandl | 2008-04-12 21:00:20 +0200 (Sat, 12 Apr 2008) | 2 lines
Add Jeroen.
........
r62297 | georg.brandl | 2008-04-12 21:05:37 +0200 (Sat, 12 Apr 2008) | 2 lines
Don't offend snake lovers.
........
r62298 | gregory.p.smith | 2008-04-12 22:37:48 +0200 (Sat, 12 Apr 2008) | 2 lines
fix compiler warnings
........
r62302 | gregory.p.smith | 2008-04-13 00:24:04 +0200 (Sun, 13 Apr 2008) | 3 lines
socket.error inherits from IOError, it no longer needs listing in
the all_errors tuple.
........
r62303 | brett.cannon | 2008-04-13 01:44:07 +0200 (Sun, 13 Apr 2008) | 8 lines
Re-implement the 'warnings' module in C. This allows for usage of the
'warnings' code in places where it was previously not possible (e.g., the
parser). It could also potentially lead to a speed-up in interpreter start-up
if the C version of the code (_warnings) is imported over the use of the
Python version in key places.
Closes issue #1631171.
........
r62304 | gregory.p.smith | 2008-04-13 02:03:25 +0200 (Sun, 13 Apr 2008) | 3 lines
Adds a profile-opt target for easy compilation of a python binary using
gcc's profile guided optimization.
........
r62305 | brett.cannon | 2008-04-13 02:18:44 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix a bug in PySys_HasWarnOption() where it was not properly checking the
length of the list storing the warning options.
........
r62306 | brett.cannon | 2008-04-13 02:25:15 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix an accidental bug of an non-existent init function.
........
r62308 | andrew.kuchling | 2008-04-13 03:05:59 +0200 (Sun, 13 Apr 2008) | 1 line
Mention -J, -X
........
r62311 | benjamin.peterson | 2008-04-13 04:20:05 +0200 (Sun, 13 Apr 2008) | 2 lines
Give the "Interactive Interpreter Changes" section in 2.6 whatsnew a unique link name
........
r62313 | brett.cannon | 2008-04-13 04:42:36 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix test_warnings by making the state of things more consistent for each test
when it is run.
........
r62314 | skip.montanaro | 2008-04-13 05:17:30 +0200 (Sun, 13 Apr 2008) | 2 lines
spelling
........
r62315 | georg.brandl | 2008-04-13 09:07:44 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix markup.
........
r62319 | christian.heimes | 2008-04-13 11:30:17 +0200 (Sun, 13 Apr 2008) | 1 line
Fix compiler warning Include/warnings.h:19:28: warning: no newline at end of file
........
r62320 | christian.heimes | 2008-04-13 11:33:24 +0200 (Sun, 13 Apr 2008) | 1 line
Use PyString_InternFromString instead of PyString_FromString for static vars
........
r62321 | christian.heimes | 2008-04-13 11:37:05 +0200 (Sun, 13 Apr 2008) | 1 line
Added new files to the pcbuild files
........
2008-04-13 13:53:33 +00:00
|
|
|
int
|
2010-06-17 23:08:50 +00:00
|
|
|
_Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)
|
1990-12-20 15:06:42 +00:00
|
|
|
{
|
2010-05-09 15:52:27 +00:00
|
|
|
int err = 0;
|
|
|
|
|
int fd;
|
|
|
|
|
int i;
|
|
|
|
|
char *found_encoding;
|
|
|
|
|
char *encoding;
|
2010-06-17 23:08:50 +00:00
|
|
|
PyObject *io;
|
|
|
|
|
PyObject *binary;
|
2010-05-09 15:52:27 +00:00
|
|
|
PyObject *fob = NULL;
|
|
|
|
|
PyObject *lineobj = NULL;
|
2010-10-14 21:15:17 +00:00
|
|
|
PyObject *res;
|
2010-05-09 15:52:27 +00:00
|
|
|
char buf[MAXPATHLEN+1];
|
2011-09-28 07:41:54 +02:00
|
|
|
int kind;
|
|
|
|
|
void *data;
|
Merged revisions 59985-60000,60002,60005-60007,60009-60042 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r59987 | raymond.hettinger | 2008-01-15 21:52:42 +0100 (Tue, 15 Jan 2008) | 1 line
Refactor if/elif chain for clarity and speed. Remove dependency on subclasses having to implement _empty and _full.
........
r59988 | raymond.hettinger | 2008-01-15 22:22:47 +0100 (Tue, 15 Jan 2008) | 1 line
Fix-up half-written paragraph in the docs
........
r59989 | amaury.forgeotdarc | 2008-01-15 22:25:11 +0100 (Tue, 15 Jan 2008) | 3 lines
test_doctest fails since r59984.
Not sure if these are the correct values, but save_stdout has to be set before its usage...
........
r59992 | andrew.kuchling | 2008-01-16 01:32:03 +0100 (Wed, 16 Jan 2008) | 1 line
Docstring typos
........
r59993 | andrew.kuchling | 2008-01-16 04:17:25 +0100 (Wed, 16 Jan 2008) | 1 line
Add PEP 3141 section
........
r59998 | andrew.kuchling | 2008-01-16 14:01:51 +0100 (Wed, 16 Jan 2008) | 1 line
Markup fix
........
r59999 | georg.brandl | 2008-01-16 17:56:29 +0100 (Wed, 16 Jan 2008) | 2 lines
Fix MSDN library URL. (#1854)
........
r60006 | georg.brandl | 2008-01-16 21:27:56 +0100 (Wed, 16 Jan 2008) | 3 lines
Add Python-specific content to Doc dir. Update configuration file
to work with the newest Sphinx.
........
r60007 | georg.brandl | 2008-01-16 21:29:00 +0100 (Wed, 16 Jan 2008) | 2 lines
Doc build should work with 2.4 now.
........
r60009 | raymond.hettinger | 2008-01-17 00:38:16 +0100 (Thu, 17 Jan 2008) | 1 line
Minor wordsmithing.
........
r60010 | raymond.hettinger | 2008-01-17 00:40:45 +0100 (Thu, 17 Jan 2008) | 1 line
Add queues will alternative fetch orders (priority based and stack based).
........
r60011 | raymond.hettinger | 2008-01-17 00:49:35 +0100 (Thu, 17 Jan 2008) | 1 line
Add news entry.
........
r60013 | raymond.hettinger | 2008-01-17 04:02:14 +0100 (Thu, 17 Jan 2008) | 1 line
Make starmap() match its pure python definition and accept any itertable input (not just tuples).
........
r60015 | gregory.p.smith | 2008-01-17 08:43:20 +0100 (Thu, 17 Jan 2008) | 3 lines
Comply with RFC 3207.
Fixes issue 829951 - http://bugs.python.org/issue829951
........
r60018 | gregory.p.smith | 2008-01-17 09:03:17 +0100 (Thu, 17 Jan 2008) | 2 lines
entry for r60015
........
r60019 | raymond.hettinger | 2008-01-17 09:07:05 +0100 (Thu, 17 Jan 2008) | 1 line
Note versionadded.
........
r60020 | gregory.p.smith | 2008-01-17 09:35:49 +0100 (Thu, 17 Jan 2008) | 8 lines
Fixes (accepts patch) issue1339 - http://bugs.python.org/issue1339
- Factor out the duplication of EHLO/HELO in login() and sendmail() to
a new function, ehlo_or_helo_if_needed().
- Use ehlo_or_helo_if_needed() in starttls()
- Check for the starttls exception in starttls() in the same way as
login() checks for the auth extension.
Contributed by Bill Fenner.
........
r60021 | andrew.kuchling | 2008-01-17 13:00:15 +0100 (Thu, 17 Jan 2008) | 1 line
Revise 3141 section a bit; add some Windows items
........
r60022 | brett.cannon | 2008-01-17 19:45:10 +0100 (Thu, 17 Jan 2008) | 2 lines
Fix a function pointer declaration to silence the compiler.
........
r60024 | raymond.hettinger | 2008-01-17 20:31:38 +0100 (Thu, 17 Jan 2008) | 1 line
Issue #1861: Add read-only attribute listing upcoming events in the order they will be run.
........
r60025 | andrew.kuchling | 2008-01-17 20:49:24 +0100 (Thu, 17 Jan 2008) | 1 line
Correction from Jordan Lewis: halfdelay() uses tenths of a second, not milliseconds
........
r60026 | raymond.hettinger | 2008-01-17 23:27:49 +0100 (Thu, 17 Jan 2008) | 1 line
Add advice on choosing between scheduler and threading.Timer().
........
r60028 | christian.heimes | 2008-01-18 00:01:44 +0100 (Fri, 18 Jan 2008) | 2 lines
Updated new property syntax. An elaborate example for subclassing and the getter was missing.
Added comment about VS 2008 and PGO builds.
........
r60029 | raymond.hettinger | 2008-01-18 00:32:01 +0100 (Fri, 18 Jan 2008) | 1 line
Fix-up Timer() example.
........
r60030 | raymond.hettinger | 2008-01-18 00:56:56 +0100 (Fri, 18 Jan 2008) | 1 line
Fix markup
........
r60031 | raymond.hettinger | 2008-01-18 01:10:42 +0100 (Fri, 18 Jan 2008) | 1 line
clearcache() needs to remove the dict as well as clear it.
........
r60033 | andrew.kuchling | 2008-01-18 03:26:16 +0100 (Fri, 18 Jan 2008) | 1 line
Bump verson
........
r60034 | andrew.kuchling | 2008-01-18 03:42:52 +0100 (Fri, 18 Jan 2008) | 1 line
Typo fix
........
r60035 | christian.heimes | 2008-01-18 08:30:20 +0100 (Fri, 18 Jan 2008) | 3 lines
Coverity issue CID #197
var_decl: Declared variable "stm" without initializer
ninit_use_in_call: Using uninitialized value "stm" (field "stm".tm_zone uninitialized) in call to function "mktime"
........
r60036 | christian.heimes | 2008-01-18 08:45:30 +0100 (Fri, 18 Jan 2008) | 11 lines
Coverity issue CID #167
Event alloc_fn: Called allocation function "metacompile" [model]
Event var_assign: Assigned variable "gr" to storage returned from "metacompile"
gr = metacompile(n);
Event pass_arg: Variable "gr" not freed or pointed-to in function "maketables" [model]
g = maketables(gr);
translatelabels(g);
addfirstsets(g);
Event leaked_storage: Returned without freeing storage "gr"
return g;
........
r60038 | christian.heimes | 2008-01-18 09:04:57 +0100 (Fri, 18 Jan 2008) | 3 lines
Coverity issue CID #182
size_error: Allocating 1 bytes to pointer "children", which needs at least 4 bytes
........
r60041 | christian.heimes | 2008-01-18 09:47:59 +0100 (Fri, 18 Jan 2008) | 4 lines
Coverity issue CID #169
local_ptr_assign_local: Assigning address of stack variable "namebuf" to pointer "filename"
out_of_scope: Variable "namebuf" goes out of scope
use_invalid: Used "filename" pointing to out-of-scope variable "namebuf"
........
r60042 | christian.heimes | 2008-01-18 09:53:45 +0100 (Fri, 18 Jan 2008) | 2 lines
Coverity CID #168
leaked_storage: Returned without freeing storage "fp"
........
2008-01-18 09:56:22 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
/* open the file */
|
|
|
|
|
if (filename == NULL)
|
|
|
|
|
return 0;
|
2010-06-17 23:08:50 +00:00
|
|
|
|
|
|
|
|
io = PyImport_ImportModuleNoBlock("io");
|
|
|
|
|
if (io == NULL)
|
|
|
|
|
return -1;
|
2011-10-09 10:38:36 +02:00
|
|
|
binary = _PyObject_CallMethodId(io, &PyId_open, "Os", filename, "rb");
|
2010-06-17 23:08:50 +00:00
|
|
|
|
|
|
|
|
if (binary == NULL) {
|
2013-07-16 00:32:14 +02:00
|
|
|
PyErr_Clear();
|
|
|
|
|
|
2010-06-17 23:08:50 +00:00
|
|
|
binary = _Py_FindSourceFile(filename, buf, sizeof(buf), io);
|
|
|
|
|
if (binary == NULL) {
|
|
|
|
|
Py_DECREF(io);
|
2013-07-16 00:32:14 +02:00
|
|
|
return -1;
|
2010-06-17 23:08:50 +00:00
|
|
|
}
|
2010-05-09 15:52:27 +00:00
|
|
|
}
|
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62260 | gregory.p.smith | 2008-04-10 01:11:56 +0200 (Thu, 10 Apr 2008) | 2 lines
better diagnostics
........
r62261 | gregory.p.smith | 2008-04-10 01:16:37 +0200 (Thu, 10 Apr 2008) | 3 lines
Raise SystemError when size < 0 is passed into PyString_FromStringAndSize,
PyBytes_FromStringAndSize or PyUnicode_FromStringAndSize. [issue2587]
........
r62266 | neal.norwitz | 2008-04-10 07:46:39 +0200 (Thu, 10 Apr 2008) | 5 lines
Remove the test file before writing it in case there is no write permission.
This might help fix some of the failures on Windows box(es). It doesn't hurt
either way and ensure the tests are a little more self contained (ie have
less assumptions).
........
r62271 | gregory.p.smith | 2008-04-10 21:50:36 +0200 (Thu, 10 Apr 2008) | 2 lines
get rid of assert (size >= 0) now that an explicit if (size < 0) is in the code.
........
r62277 | andrew.kuchling | 2008-04-10 23:27:10 +0200 (Thu, 10 Apr 2008) | 1 line
Remove forward-looking statement
........
r62278 | andrew.kuchling | 2008-04-10 23:28:51 +0200 (Thu, 10 Apr 2008) | 1 line
Add punctuation
........
r62279 | andrew.kuchling | 2008-04-10 23:29:01 +0200 (Thu, 10 Apr 2008) | 1 line
Use issue directive
........
r62289 | thomas.heller | 2008-04-11 15:05:38 +0200 (Fri, 11 Apr 2008) | 3 lines
Move backwards compatibility macro to the correct place;
PyIndex_Check() was introduced in Python 2.5.
........
r62290 | thomas.heller | 2008-04-11 16:20:26 +0200 (Fri, 11 Apr 2008) | 2 lines
Performance improvements.
........
r62293 | christian.heimes | 2008-04-12 15:03:03 +0200 (Sat, 12 Apr 2008) | 2 lines
Applied patch #2617 from Frank Wierzbicki wit some extras from me
-J and -X are now reserved for Jython and non-standard arguments (e.g. IronPython). I've added some extra comments to make sure the reservation don't get missed in the future.
........
r62294 | georg.brandl | 2008-04-12 20:11:18 +0200 (Sat, 12 Apr 2008) | 2 lines
Use absolute path in sys.path.
........
r62295 | georg.brandl | 2008-04-12 20:36:09 +0200 (Sat, 12 Apr 2008) | 2 lines
#2615: small consistency update by Jeroen Ruigrok van der Werven.
........
r62296 | georg.brandl | 2008-04-12 21:00:20 +0200 (Sat, 12 Apr 2008) | 2 lines
Add Jeroen.
........
r62297 | georg.brandl | 2008-04-12 21:05:37 +0200 (Sat, 12 Apr 2008) | 2 lines
Don't offend snake lovers.
........
r62298 | gregory.p.smith | 2008-04-12 22:37:48 +0200 (Sat, 12 Apr 2008) | 2 lines
fix compiler warnings
........
r62302 | gregory.p.smith | 2008-04-13 00:24:04 +0200 (Sun, 13 Apr 2008) | 3 lines
socket.error inherits from IOError, it no longer needs listing in
the all_errors tuple.
........
r62303 | brett.cannon | 2008-04-13 01:44:07 +0200 (Sun, 13 Apr 2008) | 8 lines
Re-implement the 'warnings' module in C. This allows for usage of the
'warnings' code in places where it was previously not possible (e.g., the
parser). It could also potentially lead to a speed-up in interpreter start-up
if the C version of the code (_warnings) is imported over the use of the
Python version in key places.
Closes issue #1631171.
........
r62304 | gregory.p.smith | 2008-04-13 02:03:25 +0200 (Sun, 13 Apr 2008) | 3 lines
Adds a profile-opt target for easy compilation of a python binary using
gcc's profile guided optimization.
........
r62305 | brett.cannon | 2008-04-13 02:18:44 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix a bug in PySys_HasWarnOption() where it was not properly checking the
length of the list storing the warning options.
........
r62306 | brett.cannon | 2008-04-13 02:25:15 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix an accidental bug of an non-existent init function.
........
r62308 | andrew.kuchling | 2008-04-13 03:05:59 +0200 (Sun, 13 Apr 2008) | 1 line
Mention -J, -X
........
r62311 | benjamin.peterson | 2008-04-13 04:20:05 +0200 (Sun, 13 Apr 2008) | 2 lines
Give the "Interactive Interpreter Changes" section in 2.6 whatsnew a unique link name
........
r62313 | brett.cannon | 2008-04-13 04:42:36 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix test_warnings by making the state of things more consistent for each test
when it is run.
........
r62314 | skip.montanaro | 2008-04-13 05:17:30 +0200 (Sun, 13 Apr 2008) | 2 lines
spelling
........
r62315 | georg.brandl | 2008-04-13 09:07:44 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix markup.
........
r62319 | christian.heimes | 2008-04-13 11:30:17 +0200 (Sun, 13 Apr 2008) | 1 line
Fix compiler warning Include/warnings.h:19:28: warning: no newline at end of file
........
r62320 | christian.heimes | 2008-04-13 11:33:24 +0200 (Sun, 13 Apr 2008) | 1 line
Use PyString_InternFromString instead of PyString_FromString for static vars
........
r62321 | christian.heimes | 2008-04-13 11:37:05 +0200 (Sun, 13 Apr 2008) | 1 line
Added new files to the pcbuild files
........
2008-04-13 13:53:33 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
/* use the right encoding to decode the file as unicode */
|
2010-06-17 23:08:50 +00:00
|
|
|
fd = PyObject_AsFileDescriptor(binary);
|
2013-07-21 01:53:10 +02:00
|
|
|
if (fd < 0) {
|
|
|
|
|
Py_DECREF(io);
|
|
|
|
|
Py_DECREF(binary);
|
2013-07-21 13:26:13 -07:00
|
|
|
return 0;
|
2013-07-21 01:53:10 +02:00
|
|
|
}
|
2011-04-05 01:48:03 +02:00
|
|
|
found_encoding = PyTokenizer_FindEncodingFilename(fd, filename);
|
2013-12-19 13:39:32 +01:00
|
|
|
if (found_encoding == NULL)
|
|
|
|
|
PyErr_Clear();
|
2010-06-17 23:08:50 +00:00
|
|
|
encoding = (found_encoding != NULL) ? found_encoding : "utf-8";
|
2013-07-21 02:12:35 +02:00
|
|
|
/* Reset position */
|
|
|
|
|
if (lseek(fd, 0, SEEK_SET) == (off_t)-1) {
|
|
|
|
|
Py_DECREF(io);
|
|
|
|
|
Py_DECREF(binary);
|
|
|
|
|
PyMem_FREE(found_encoding);
|
2013-07-21 13:26:13 -07:00
|
|
|
return 0;
|
2013-07-21 02:12:35 +02:00
|
|
|
}
|
2011-10-09 10:38:36 +02:00
|
|
|
fob = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "Os", binary, encoding);
|
2010-06-17 23:08:50 +00:00
|
|
|
Py_DECREF(io);
|
|
|
|
|
Py_DECREF(binary);
|
2010-05-09 15:52:27 +00:00
|
|
|
PyMem_FREE(found_encoding);
|
2010-06-17 23:08:50 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
if (fob == NULL) {
|
|
|
|
|
PyErr_Clear();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62260 | gregory.p.smith | 2008-04-10 01:11:56 +0200 (Thu, 10 Apr 2008) | 2 lines
better diagnostics
........
r62261 | gregory.p.smith | 2008-04-10 01:16:37 +0200 (Thu, 10 Apr 2008) | 3 lines
Raise SystemError when size < 0 is passed into PyString_FromStringAndSize,
PyBytes_FromStringAndSize or PyUnicode_FromStringAndSize. [issue2587]
........
r62266 | neal.norwitz | 2008-04-10 07:46:39 +0200 (Thu, 10 Apr 2008) | 5 lines
Remove the test file before writing it in case there is no write permission.
This might help fix some of the failures on Windows box(es). It doesn't hurt
either way and ensure the tests are a little more self contained (ie have
less assumptions).
........
r62271 | gregory.p.smith | 2008-04-10 21:50:36 +0200 (Thu, 10 Apr 2008) | 2 lines
get rid of assert (size >= 0) now that an explicit if (size < 0) is in the code.
........
r62277 | andrew.kuchling | 2008-04-10 23:27:10 +0200 (Thu, 10 Apr 2008) | 1 line
Remove forward-looking statement
........
r62278 | andrew.kuchling | 2008-04-10 23:28:51 +0200 (Thu, 10 Apr 2008) | 1 line
Add punctuation
........
r62279 | andrew.kuchling | 2008-04-10 23:29:01 +0200 (Thu, 10 Apr 2008) | 1 line
Use issue directive
........
r62289 | thomas.heller | 2008-04-11 15:05:38 +0200 (Fri, 11 Apr 2008) | 3 lines
Move backwards compatibility macro to the correct place;
PyIndex_Check() was introduced in Python 2.5.
........
r62290 | thomas.heller | 2008-04-11 16:20:26 +0200 (Fri, 11 Apr 2008) | 2 lines
Performance improvements.
........
r62293 | christian.heimes | 2008-04-12 15:03:03 +0200 (Sat, 12 Apr 2008) | 2 lines
Applied patch #2617 from Frank Wierzbicki wit some extras from me
-J and -X are now reserved for Jython and non-standard arguments (e.g. IronPython). I've added some extra comments to make sure the reservation don't get missed in the future.
........
r62294 | georg.brandl | 2008-04-12 20:11:18 +0200 (Sat, 12 Apr 2008) | 2 lines
Use absolute path in sys.path.
........
r62295 | georg.brandl | 2008-04-12 20:36:09 +0200 (Sat, 12 Apr 2008) | 2 lines
#2615: small consistency update by Jeroen Ruigrok van der Werven.
........
r62296 | georg.brandl | 2008-04-12 21:00:20 +0200 (Sat, 12 Apr 2008) | 2 lines
Add Jeroen.
........
r62297 | georg.brandl | 2008-04-12 21:05:37 +0200 (Sat, 12 Apr 2008) | 2 lines
Don't offend snake lovers.
........
r62298 | gregory.p.smith | 2008-04-12 22:37:48 +0200 (Sat, 12 Apr 2008) | 2 lines
fix compiler warnings
........
r62302 | gregory.p.smith | 2008-04-13 00:24:04 +0200 (Sun, 13 Apr 2008) | 3 lines
socket.error inherits from IOError, it no longer needs listing in
the all_errors tuple.
........
r62303 | brett.cannon | 2008-04-13 01:44:07 +0200 (Sun, 13 Apr 2008) | 8 lines
Re-implement the 'warnings' module in C. This allows for usage of the
'warnings' code in places where it was previously not possible (e.g., the
parser). It could also potentially lead to a speed-up in interpreter start-up
if the C version of the code (_warnings) is imported over the use of the
Python version in key places.
Closes issue #1631171.
........
r62304 | gregory.p.smith | 2008-04-13 02:03:25 +0200 (Sun, 13 Apr 2008) | 3 lines
Adds a profile-opt target for easy compilation of a python binary using
gcc's profile guided optimization.
........
r62305 | brett.cannon | 2008-04-13 02:18:44 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix a bug in PySys_HasWarnOption() where it was not properly checking the
length of the list storing the warning options.
........
r62306 | brett.cannon | 2008-04-13 02:25:15 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix an accidental bug of an non-existent init function.
........
r62308 | andrew.kuchling | 2008-04-13 03:05:59 +0200 (Sun, 13 Apr 2008) | 1 line
Mention -J, -X
........
r62311 | benjamin.peterson | 2008-04-13 04:20:05 +0200 (Sun, 13 Apr 2008) | 2 lines
Give the "Interactive Interpreter Changes" section in 2.6 whatsnew a unique link name
........
r62313 | brett.cannon | 2008-04-13 04:42:36 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix test_warnings by making the state of things more consistent for each test
when it is run.
........
r62314 | skip.montanaro | 2008-04-13 05:17:30 +0200 (Sun, 13 Apr 2008) | 2 lines
spelling
........
r62315 | georg.brandl | 2008-04-13 09:07:44 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix markup.
........
r62319 | christian.heimes | 2008-04-13 11:30:17 +0200 (Sun, 13 Apr 2008) | 1 line
Fix compiler warning Include/warnings.h:19:28: warning: no newline at end of file
........
r62320 | christian.heimes | 2008-04-13 11:33:24 +0200 (Sun, 13 Apr 2008) | 1 line
Use PyString_InternFromString instead of PyString_FromString for static vars
........
r62321 | christian.heimes | 2008-04-13 11:37:05 +0200 (Sun, 13 Apr 2008) | 1 line
Added new files to the pcbuild files
........
2008-04-13 13:53:33 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
/* get the line number lineno */
|
|
|
|
|
for (i = 0; i < lineno; i++) {
|
|
|
|
|
Py_XDECREF(lineobj);
|
|
|
|
|
lineobj = PyFile_GetLine(fob, -1);
|
|
|
|
|
if (!lineobj) {
|
|
|
|
|
err = -1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-10-09 10:38:36 +02:00
|
|
|
res = _PyObject_CallMethodId(fob, &PyId_close, "");
|
2010-10-14 21:15:17 +00:00
|
|
|
if (res)
|
|
|
|
|
Py_DECREF(res);
|
|
|
|
|
else
|
|
|
|
|
PyErr_Clear();
|
2010-05-09 15:52:27 +00:00
|
|
|
Py_DECREF(fob);
|
|
|
|
|
if (!lineobj || !PyUnicode_Check(lineobj)) {
|
|
|
|
|
Py_XDECREF(lineobj);
|
|
|
|
|
return err;
|
|
|
|
|
}
|
2008-10-09 23:37:48 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
/* remove the indentation of the line */
|
2011-09-28 07:41:54 +02:00
|
|
|
kind = PyUnicode_KIND(lineobj);
|
|
|
|
|
data = PyUnicode_DATA(lineobj);
|
|
|
|
|
for (i=0; i < PyUnicode_GET_LENGTH(lineobj); i++) {
|
|
|
|
|
Py_UCS4 ch = PyUnicode_READ(kind, data, i);
|
|
|
|
|
if (ch != ' ' && ch != '\t' && ch != '\014')
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (i) {
|
2010-05-09 15:52:27 +00:00
|
|
|
PyObject *truncated;
|
2011-09-28 07:41:54 +02:00
|
|
|
truncated = PyUnicode_Substring(lineobj, i, PyUnicode_GET_LENGTH(lineobj));
|
2010-05-09 15:52:27 +00:00
|
|
|
if (truncated) {
|
|
|
|
|
Py_DECREF(lineobj);
|
|
|
|
|
lineobj = truncated;
|
|
|
|
|
} else {
|
|
|
|
|
PyErr_Clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
2008-10-09 23:37:48 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
/* Write some spaces before the line */
|
|
|
|
|
strcpy(buf, " ");
|
|
|
|
|
assert (strlen(buf) == 10);
|
|
|
|
|
while (indent > 0) {
|
2013-07-21 13:29:37 -07:00
|
|
|
if (indent < 10)
|
2010-05-09 15:52:27 +00:00
|
|
|
buf[indent] = '\0';
|
|
|
|
|
err = PyFile_WriteString(buf, f);
|
|
|
|
|
if (err != 0)
|
|
|
|
|
break;
|
|
|
|
|
indent -= 10;
|
|
|
|
|
}
|
2008-10-09 23:37:48 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
/* finally display the line */
|
|
|
|
|
if (err == 0)
|
|
|
|
|
err = PyFile_WriteObject(lineobj, f, Py_PRINT_RAW);
|
|
|
|
|
Py_DECREF(lineobj);
|
|
|
|
|
if (err == 0)
|
|
|
|
|
err = PyFile_WriteString("\n", f);
|
|
|
|
|
return err;
|
1990-12-20 15:06:42 +00:00
|
|
|
}
|
|
|
|
|
|
1997-05-22 22:35:47 +00:00
|
|
|
static int
|
2010-06-17 23:08:50 +00:00
|
|
|
tb_displayline(PyObject *f, PyObject *filename, int lineno, PyObject *name)
|
1990-12-20 15:06:42 +00:00
|
|
|
{
|
2010-06-17 23:08:50 +00:00
|
|
|
int err;
|
|
|
|
|
PyObject *line;
|
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62260 | gregory.p.smith | 2008-04-10 01:11:56 +0200 (Thu, 10 Apr 2008) | 2 lines
better diagnostics
........
r62261 | gregory.p.smith | 2008-04-10 01:16:37 +0200 (Thu, 10 Apr 2008) | 3 lines
Raise SystemError when size < 0 is passed into PyString_FromStringAndSize,
PyBytes_FromStringAndSize or PyUnicode_FromStringAndSize. [issue2587]
........
r62266 | neal.norwitz | 2008-04-10 07:46:39 +0200 (Thu, 10 Apr 2008) | 5 lines
Remove the test file before writing it in case there is no write permission.
This might help fix some of the failures on Windows box(es). It doesn't hurt
either way and ensure the tests are a little more self contained (ie have
less assumptions).
........
r62271 | gregory.p.smith | 2008-04-10 21:50:36 +0200 (Thu, 10 Apr 2008) | 2 lines
get rid of assert (size >= 0) now that an explicit if (size < 0) is in the code.
........
r62277 | andrew.kuchling | 2008-04-10 23:27:10 +0200 (Thu, 10 Apr 2008) | 1 line
Remove forward-looking statement
........
r62278 | andrew.kuchling | 2008-04-10 23:28:51 +0200 (Thu, 10 Apr 2008) | 1 line
Add punctuation
........
r62279 | andrew.kuchling | 2008-04-10 23:29:01 +0200 (Thu, 10 Apr 2008) | 1 line
Use issue directive
........
r62289 | thomas.heller | 2008-04-11 15:05:38 +0200 (Fri, 11 Apr 2008) | 3 lines
Move backwards compatibility macro to the correct place;
PyIndex_Check() was introduced in Python 2.5.
........
r62290 | thomas.heller | 2008-04-11 16:20:26 +0200 (Fri, 11 Apr 2008) | 2 lines
Performance improvements.
........
r62293 | christian.heimes | 2008-04-12 15:03:03 +0200 (Sat, 12 Apr 2008) | 2 lines
Applied patch #2617 from Frank Wierzbicki wit some extras from me
-J and -X are now reserved for Jython and non-standard arguments (e.g. IronPython). I've added some extra comments to make sure the reservation don't get missed in the future.
........
r62294 | georg.brandl | 2008-04-12 20:11:18 +0200 (Sat, 12 Apr 2008) | 2 lines
Use absolute path in sys.path.
........
r62295 | georg.brandl | 2008-04-12 20:36:09 +0200 (Sat, 12 Apr 2008) | 2 lines
#2615: small consistency update by Jeroen Ruigrok van der Werven.
........
r62296 | georg.brandl | 2008-04-12 21:00:20 +0200 (Sat, 12 Apr 2008) | 2 lines
Add Jeroen.
........
r62297 | georg.brandl | 2008-04-12 21:05:37 +0200 (Sat, 12 Apr 2008) | 2 lines
Don't offend snake lovers.
........
r62298 | gregory.p.smith | 2008-04-12 22:37:48 +0200 (Sat, 12 Apr 2008) | 2 lines
fix compiler warnings
........
r62302 | gregory.p.smith | 2008-04-13 00:24:04 +0200 (Sun, 13 Apr 2008) | 3 lines
socket.error inherits from IOError, it no longer needs listing in
the all_errors tuple.
........
r62303 | brett.cannon | 2008-04-13 01:44:07 +0200 (Sun, 13 Apr 2008) | 8 lines
Re-implement the 'warnings' module in C. This allows for usage of the
'warnings' code in places where it was previously not possible (e.g., the
parser). It could also potentially lead to a speed-up in interpreter start-up
if the C version of the code (_warnings) is imported over the use of the
Python version in key places.
Closes issue #1631171.
........
r62304 | gregory.p.smith | 2008-04-13 02:03:25 +0200 (Sun, 13 Apr 2008) | 3 lines
Adds a profile-opt target for easy compilation of a python binary using
gcc's profile guided optimization.
........
r62305 | brett.cannon | 2008-04-13 02:18:44 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix a bug in PySys_HasWarnOption() where it was not properly checking the
length of the list storing the warning options.
........
r62306 | brett.cannon | 2008-04-13 02:25:15 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix an accidental bug of an non-existent init function.
........
r62308 | andrew.kuchling | 2008-04-13 03:05:59 +0200 (Sun, 13 Apr 2008) | 1 line
Mention -J, -X
........
r62311 | benjamin.peterson | 2008-04-13 04:20:05 +0200 (Sun, 13 Apr 2008) | 2 lines
Give the "Interactive Interpreter Changes" section in 2.6 whatsnew a unique link name
........
r62313 | brett.cannon | 2008-04-13 04:42:36 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix test_warnings by making the state of things more consistent for each test
when it is run.
........
r62314 | skip.montanaro | 2008-04-13 05:17:30 +0200 (Sun, 13 Apr 2008) | 2 lines
spelling
........
r62315 | georg.brandl | 2008-04-13 09:07:44 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix markup.
........
r62319 | christian.heimes | 2008-04-13 11:30:17 +0200 (Sun, 13 Apr 2008) | 1 line
Fix compiler warning Include/warnings.h:19:28: warning: no newline at end of file
........
r62320 | christian.heimes | 2008-04-13 11:33:24 +0200 (Sun, 13 Apr 2008) | 1 line
Use PyString_InternFromString instead of PyString_FromString for static vars
........
r62321 | christian.heimes | 2008-04-13 11:37:05 +0200 (Sun, 13 Apr 2008) | 1 line
Added new files to the pcbuild files
........
2008-04-13 13:53:33 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
if (filename == NULL || name == NULL)
|
|
|
|
|
return -1;
|
2010-06-17 23:08:50 +00:00
|
|
|
line = PyUnicode_FromFormat(" File \"%U\", line %d, in %U\n",
|
|
|
|
|
filename, lineno, name);
|
|
|
|
|
if (line == NULL)
|
|
|
|
|
return -1;
|
|
|
|
|
err = PyFile_WriteObject(line, f, Py_PRINT_RAW);
|
|
|
|
|
Py_DECREF(line);
|
2010-05-09 15:52:27 +00:00
|
|
|
if (err != 0)
|
|
|
|
|
return err;
|
2012-07-19 21:02:03 +00:00
|
|
|
/* ignore errors since we can't report them, can we? */
|
|
|
|
|
if (_Py_DisplaySourceLine(f, filename, lineno, 4))
|
|
|
|
|
PyErr_Clear();
|
|
|
|
|
return err;
|
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r62260 | gregory.p.smith | 2008-04-10 01:11:56 +0200 (Thu, 10 Apr 2008) | 2 lines
better diagnostics
........
r62261 | gregory.p.smith | 2008-04-10 01:16:37 +0200 (Thu, 10 Apr 2008) | 3 lines
Raise SystemError when size < 0 is passed into PyString_FromStringAndSize,
PyBytes_FromStringAndSize or PyUnicode_FromStringAndSize. [issue2587]
........
r62266 | neal.norwitz | 2008-04-10 07:46:39 +0200 (Thu, 10 Apr 2008) | 5 lines
Remove the test file before writing it in case there is no write permission.
This might help fix some of the failures on Windows box(es). It doesn't hurt
either way and ensure the tests are a little more self contained (ie have
less assumptions).
........
r62271 | gregory.p.smith | 2008-04-10 21:50:36 +0200 (Thu, 10 Apr 2008) | 2 lines
get rid of assert (size >= 0) now that an explicit if (size < 0) is in the code.
........
r62277 | andrew.kuchling | 2008-04-10 23:27:10 +0200 (Thu, 10 Apr 2008) | 1 line
Remove forward-looking statement
........
r62278 | andrew.kuchling | 2008-04-10 23:28:51 +0200 (Thu, 10 Apr 2008) | 1 line
Add punctuation
........
r62279 | andrew.kuchling | 2008-04-10 23:29:01 +0200 (Thu, 10 Apr 2008) | 1 line
Use issue directive
........
r62289 | thomas.heller | 2008-04-11 15:05:38 +0200 (Fri, 11 Apr 2008) | 3 lines
Move backwards compatibility macro to the correct place;
PyIndex_Check() was introduced in Python 2.5.
........
r62290 | thomas.heller | 2008-04-11 16:20:26 +0200 (Fri, 11 Apr 2008) | 2 lines
Performance improvements.
........
r62293 | christian.heimes | 2008-04-12 15:03:03 +0200 (Sat, 12 Apr 2008) | 2 lines
Applied patch #2617 from Frank Wierzbicki wit some extras from me
-J and -X are now reserved for Jython and non-standard arguments (e.g. IronPython). I've added some extra comments to make sure the reservation don't get missed in the future.
........
r62294 | georg.brandl | 2008-04-12 20:11:18 +0200 (Sat, 12 Apr 2008) | 2 lines
Use absolute path in sys.path.
........
r62295 | georg.brandl | 2008-04-12 20:36:09 +0200 (Sat, 12 Apr 2008) | 2 lines
#2615: small consistency update by Jeroen Ruigrok van der Werven.
........
r62296 | georg.brandl | 2008-04-12 21:00:20 +0200 (Sat, 12 Apr 2008) | 2 lines
Add Jeroen.
........
r62297 | georg.brandl | 2008-04-12 21:05:37 +0200 (Sat, 12 Apr 2008) | 2 lines
Don't offend snake lovers.
........
r62298 | gregory.p.smith | 2008-04-12 22:37:48 +0200 (Sat, 12 Apr 2008) | 2 lines
fix compiler warnings
........
r62302 | gregory.p.smith | 2008-04-13 00:24:04 +0200 (Sun, 13 Apr 2008) | 3 lines
socket.error inherits from IOError, it no longer needs listing in
the all_errors tuple.
........
r62303 | brett.cannon | 2008-04-13 01:44:07 +0200 (Sun, 13 Apr 2008) | 8 lines
Re-implement the 'warnings' module in C. This allows for usage of the
'warnings' code in places where it was previously not possible (e.g., the
parser). It could also potentially lead to a speed-up in interpreter start-up
if the C version of the code (_warnings) is imported over the use of the
Python version in key places.
Closes issue #1631171.
........
r62304 | gregory.p.smith | 2008-04-13 02:03:25 +0200 (Sun, 13 Apr 2008) | 3 lines
Adds a profile-opt target for easy compilation of a python binary using
gcc's profile guided optimization.
........
r62305 | brett.cannon | 2008-04-13 02:18:44 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix a bug in PySys_HasWarnOption() where it was not properly checking the
length of the list storing the warning options.
........
r62306 | brett.cannon | 2008-04-13 02:25:15 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix an accidental bug of an non-existent init function.
........
r62308 | andrew.kuchling | 2008-04-13 03:05:59 +0200 (Sun, 13 Apr 2008) | 1 line
Mention -J, -X
........
r62311 | benjamin.peterson | 2008-04-13 04:20:05 +0200 (Sun, 13 Apr 2008) | 2 lines
Give the "Interactive Interpreter Changes" section in 2.6 whatsnew a unique link name
........
r62313 | brett.cannon | 2008-04-13 04:42:36 +0200 (Sun, 13 Apr 2008) | 3 lines
Fix test_warnings by making the state of things more consistent for each test
when it is run.
........
r62314 | skip.montanaro | 2008-04-13 05:17:30 +0200 (Sun, 13 Apr 2008) | 2 lines
spelling
........
r62315 | georg.brandl | 2008-04-13 09:07:44 +0200 (Sun, 13 Apr 2008) | 2 lines
Fix markup.
........
r62319 | christian.heimes | 2008-04-13 11:30:17 +0200 (Sun, 13 Apr 2008) | 1 line
Fix compiler warning Include/warnings.h:19:28: warning: no newline at end of file
........
r62320 | christian.heimes | 2008-04-13 11:33:24 +0200 (Sun, 13 Apr 2008) | 1 line
Use PyString_InternFromString instead of PyString_FromString for static vars
........
r62321 | christian.heimes | 2008-04-13 11:37:05 +0200 (Sun, 13 Apr 2008) | 1 line
Added new files to the pcbuild files
........
2008-04-13 13:53:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
tb_printinternal(PyTracebackObject *tb, PyObject *f, long limit)
|
|
|
|
|
{
|
2010-05-09 15:52:27 +00:00
|
|
|
int err = 0;
|
|
|
|
|
long depth = 0;
|
|
|
|
|
PyTracebackObject *tb1 = tb;
|
|
|
|
|
while (tb1 != NULL) {
|
|
|
|
|
depth++;
|
|
|
|
|
tb1 = tb1->tb_next;
|
|
|
|
|
}
|
|
|
|
|
while (tb != NULL && err == 0) {
|
|
|
|
|
if (depth <= limit) {
|
|
|
|
|
err = tb_displayline(f,
|
2010-06-17 23:08:50 +00:00
|
|
|
tb->tb_frame->f_code->co_filename,
|
|
|
|
|
tb->tb_lineno,
|
|
|
|
|
tb->tb_frame->f_code->co_name);
|
2010-05-09 15:52:27 +00:00
|
|
|
}
|
|
|
|
|
depth--;
|
|
|
|
|
tb = tb->tb_next;
|
|
|
|
|
if (err == 0)
|
|
|
|
|
err = PyErr_CheckSignals();
|
|
|
|
|
}
|
|
|
|
|
return err;
|
1990-12-20 15:06:42 +00:00
|
|
|
}
|
|
|
|
|
|
2007-12-04 21:55:18 +00:00
|
|
|
#define PyTraceBack_LIMIT 1000
|
|
|
|
|
|
1990-12-20 15:06:42 +00:00
|
|
|
int
|
2000-07-22 18:47:25 +00:00
|
|
|
PyTraceBack_Print(PyObject *v, PyObject *f)
|
1990-12-20 15:06:42 +00:00
|
|
|
{
|
2010-05-09 15:52:27 +00:00
|
|
|
int err;
|
|
|
|
|
PyObject *limitv;
|
|
|
|
|
long limit = PyTraceBack_LIMIT;
|
2007-12-04 21:55:18 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
if (v == NULL)
|
|
|
|
|
return 0;
|
|
|
|
|
if (!PyTraceBack_Check(v)) {
|
|
|
|
|
PyErr_BadInternalCall();
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
limitv = PySys_GetObject("tracebacklimit");
|
|
|
|
|
if (limitv) {
|
|
|
|
|
PyObject *exc_type, *exc_value, *exc_tb;
|
2007-12-04 21:55:18 +00:00
|
|
|
|
2010-05-09 15:52:27 +00:00
|
|
|
PyErr_Fetch(&exc_type, &exc_value, &exc_tb);
|
|
|
|
|
limit = PyLong_AsLong(limitv);
|
|
|
|
|
if (limit == -1 && PyErr_Occurred()) {
|
|
|
|
|
if (PyErr_ExceptionMatches(PyExc_OverflowError)) {
|
|
|
|
|
limit = PyTraceBack_LIMIT;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
Py_XDECREF(exc_type);
|
|
|
|
|
Py_XDECREF(exc_value);
|
|
|
|
|
Py_XDECREF(exc_tb);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (limit <= 0) {
|
|
|
|
|
limit = PyTraceBack_LIMIT;
|
|
|
|
|
}
|
|
|
|
|
PyErr_Restore(exc_type, exc_value, exc_tb);
|
|
|
|
|
}
|
|
|
|
|
err = PyFile_WriteString("Traceback (most recent call last):\n", f);
|
|
|
|
|
if (!err)
|
|
|
|
|
err = tb_printinternal((PyTracebackObject *)v, f, limit);
|
|
|
|
|
return err;
|
1990-12-20 15:06:42 +00:00
|
|
|
}
|
2011-03-31 01:31:06 +02:00
|
|
|
|
|
|
|
|
/* Reverse a string. For example, "abcd" becomes "dcba".
|
|
|
|
|
|
|
|
|
|
This function is signal safe. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
reverse_string(char *text, const size_t len)
|
|
|
|
|
{
|
|
|
|
|
char tmp;
|
|
|
|
|
size_t i, j;
|
|
|
|
|
if (len == 0)
|
|
|
|
|
return;
|
|
|
|
|
for (i=0, j=len-1; i < j; i++, j--) {
|
|
|
|
|
tmp = text[i];
|
|
|
|
|
text[i] = text[j];
|
|
|
|
|
text[j] = tmp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Format an integer in range [0; 999999] to decimal,
|
|
|
|
|
and write it into the file fd.
|
|
|
|
|
|
|
|
|
|
This function is signal safe. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
dump_decimal(int fd, int value)
|
|
|
|
|
{
|
|
|
|
|
char buffer[7];
|
|
|
|
|
int len;
|
|
|
|
|
if (value < 0 || 999999 < value)
|
|
|
|
|
return;
|
|
|
|
|
len = 0;
|
|
|
|
|
do {
|
|
|
|
|
buffer[len] = '0' + (value % 10);
|
|
|
|
|
value /= 10;
|
|
|
|
|
len++;
|
|
|
|
|
} while (value);
|
|
|
|
|
reverse_string(buffer, len);
|
|
|
|
|
write(fd, buffer, len);
|
|
|
|
|
}
|
|
|
|
|
|
2013-10-20 18:21:02 -07:00
|
|
|
/* Format an integer in range [0; 0xffffffff] to hexadecimal of 'width' digits,
|
2011-03-31 01:31:06 +02:00
|
|
|
and write it into the file fd.
|
|
|
|
|
|
|
|
|
|
This function is signal safe. */
|
|
|
|
|
|
|
|
|
|
static void
|
2013-10-20 18:21:02 -07:00
|
|
|
dump_hexadecimal(int fd, unsigned long value, int width)
|
2011-03-31 01:31:06 +02:00
|
|
|
{
|
|
|
|
|
int len;
|
|
|
|
|
char buffer[sizeof(unsigned long) * 2 + 1];
|
|
|
|
|
len = 0;
|
|
|
|
|
do {
|
2011-10-14 02:13:11 +02:00
|
|
|
buffer[len] = Py_hexdigits[value & 15];
|
2011-03-31 01:31:06 +02:00
|
|
|
value >>= 4;
|
|
|
|
|
len++;
|
|
|
|
|
} while (len < width || value);
|
|
|
|
|
reverse_string(buffer, len);
|
|
|
|
|
write(fd, buffer, len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Write an unicode object into the file fd using ascii+backslashreplace.
|
|
|
|
|
|
|
|
|
|
This function is signal safe. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
dump_ascii(int fd, PyObject *text)
|
|
|
|
|
{
|
2011-09-28 07:41:54 +02:00
|
|
|
PyASCIIObject *ascii = (PyASCIIObject *)text;
|
2011-03-31 01:31:06 +02:00
|
|
|
Py_ssize_t i, size;
|
|
|
|
|
int truncated;
|
2011-09-28 07:41:54 +02:00
|
|
|
int kind;
|
2011-10-05 22:44:12 +02:00
|
|
|
void *data = NULL;
|
|
|
|
|
wchar_t *wstr = NULL;
|
2011-09-28 07:41:54 +02:00
|
|
|
Py_UCS4 ch;
|
2011-03-31 01:31:06 +02:00
|
|
|
|
2011-09-28 07:41:54 +02:00
|
|
|
size = ascii->length;
|
|
|
|
|
kind = ascii->state.kind;
|
|
|
|
|
if (ascii->state.compact) {
|
|
|
|
|
if (ascii->state.ascii)
|
|
|
|
|
data = ((PyASCIIObject*)text) + 1;
|
|
|
|
|
else
|
|
|
|
|
data = ((PyCompactUnicodeObject*)text) + 1;
|
|
|
|
|
}
|
2011-10-05 22:44:12 +02:00
|
|
|
else if (kind != PyUnicode_WCHAR_KIND) {
|
2011-09-28 07:41:54 +02:00
|
|
|
data = ((PyUnicodeObject *)text)->data.any;
|
|
|
|
|
if (data == NULL)
|
|
|
|
|
return;
|
|
|
|
|
}
|
2011-10-05 22:44:12 +02:00
|
|
|
else {
|
|
|
|
|
wstr = ((PyASCIIObject *)text)->wstr;
|
|
|
|
|
if (wstr == NULL)
|
|
|
|
|
return;
|
|
|
|
|
size = ((PyCompactUnicodeObject *)text)->wstr_length;
|
|
|
|
|
}
|
2011-03-31 01:31:06 +02:00
|
|
|
|
|
|
|
|
if (MAX_STRING_LENGTH < size) {
|
|
|
|
|
size = MAX_STRING_LENGTH;
|
|
|
|
|
truncated = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
truncated = 0;
|
|
|
|
|
|
2011-09-28 07:41:54 +02:00
|
|
|
for (i=0; i < size; i++) {
|
2011-10-05 22:44:12 +02:00
|
|
|
if (kind != PyUnicode_WCHAR_KIND)
|
|
|
|
|
ch = PyUnicode_READ(kind, data, i);
|
|
|
|
|
else
|
|
|
|
|
ch = wstr[i];
|
2011-09-28 07:41:54 +02:00
|
|
|
if (ch < 128) {
|
|
|
|
|
char c = (char)ch;
|
2011-03-31 01:31:06 +02:00
|
|
|
write(fd, &c, 1);
|
|
|
|
|
}
|
2011-11-22 03:31:20 +01:00
|
|
|
else if (ch < 0xff) {
|
2011-03-31 01:31:06 +02:00
|
|
|
PUTS(fd, "\\x");
|
2013-10-20 18:21:02 -07:00
|
|
|
dump_hexadecimal(fd, ch, 2);
|
2011-03-31 01:31:06 +02:00
|
|
|
}
|
2011-11-22 03:31:20 +01:00
|
|
|
else if (ch < 0xffff) {
|
2011-03-31 01:31:06 +02:00
|
|
|
PUTS(fd, "\\u");
|
2013-10-20 18:21:02 -07:00
|
|
|
dump_hexadecimal(fd, ch, 4);
|
2011-03-31 01:31:06 +02:00
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
PUTS(fd, "\\U");
|
2013-10-20 18:21:02 -07:00
|
|
|
dump_hexadecimal(fd, ch, 8);
|
2011-03-31 01:31:06 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (truncated)
|
|
|
|
|
PUTS(fd, "...");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Write a frame into the file fd: "File "xxx", line xxx in xxx".
|
|
|
|
|
|
|
|
|
|
This function is signal safe. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
dump_frame(int fd, PyFrameObject *frame)
|
|
|
|
|
{
|
|
|
|
|
PyCodeObject *code;
|
|
|
|
|
int lineno;
|
|
|
|
|
|
|
|
|
|
code = frame->f_code;
|
|
|
|
|
PUTS(fd, " File ");
|
|
|
|
|
if (code != NULL && code->co_filename != NULL
|
|
|
|
|
&& PyUnicode_Check(code->co_filename))
|
|
|
|
|
{
|
|
|
|
|
write(fd, "\"", 1);
|
|
|
|
|
dump_ascii(fd, code->co_filename);
|
|
|
|
|
write(fd, "\"", 1);
|
|
|
|
|
} else {
|
|
|
|
|
PUTS(fd, "???");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* PyFrame_GetLineNumber() was introduced in Python 2.7.0 and 3.2.0 */
|
2011-09-28 07:41:54 +02:00
|
|
|
lineno = PyCode_Addr2Line(code, frame->f_lasti);
|
2011-03-31 01:31:06 +02:00
|
|
|
PUTS(fd, ", line ");
|
|
|
|
|
dump_decimal(fd, lineno);
|
|
|
|
|
PUTS(fd, " in ");
|
|
|
|
|
|
|
|
|
|
if (code != NULL && code->co_name != NULL
|
|
|
|
|
&& PyUnicode_Check(code->co_name))
|
|
|
|
|
dump_ascii(fd, code->co_name);
|
|
|
|
|
else
|
|
|
|
|
PUTS(fd, "???");
|
|
|
|
|
|
|
|
|
|
write(fd, "\n", 1);
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 15:34:01 +02:00
|
|
|
static void
|
2011-03-31 01:31:06 +02:00
|
|
|
dump_traceback(int fd, PyThreadState *tstate, int write_header)
|
|
|
|
|
{
|
|
|
|
|
PyFrameObject *frame;
|
|
|
|
|
unsigned int depth;
|
|
|
|
|
|
|
|
|
|
if (write_header)
|
2013-10-20 18:21:02 -07:00
|
|
|
PUTS(fd, "Stack (most recent call first):\n");
|
2011-04-01 15:34:01 +02:00
|
|
|
|
|
|
|
|
frame = _PyThreadState_GetFrame(tstate);
|
|
|
|
|
if (frame == NULL)
|
|
|
|
|
return;
|
|
|
|
|
|
2011-03-31 01:31:06 +02:00
|
|
|
depth = 0;
|
|
|
|
|
while (frame != NULL) {
|
|
|
|
|
if (MAX_FRAME_DEPTH <= depth) {
|
|
|
|
|
PUTS(fd, " ...\n");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (!PyFrame_Check(frame))
|
|
|
|
|
break;
|
|
|
|
|
dump_frame(fd, frame);
|
|
|
|
|
frame = frame->f_back;
|
|
|
|
|
depth++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-04-01 15:34:01 +02:00
|
|
|
void
|
2011-03-31 01:31:06 +02:00
|
|
|
_Py_DumpTraceback(int fd, PyThreadState *tstate)
|
|
|
|
|
{
|
2011-04-01 15:34:01 +02:00
|
|
|
dump_traceback(fd, tstate, 1);
|
2011-03-31 01:31:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Write the thread identifier into the file 'fd': "Current thread 0xHHHH:\" if
|
|
|
|
|
is_current is true, "Thread 0xHHHH:\n" otherwise.
|
|
|
|
|
|
|
|
|
|
This function is signal safe. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
write_thread_id(int fd, PyThreadState *tstate, int is_current)
|
|
|
|
|
{
|
|
|
|
|
if (is_current)
|
|
|
|
|
PUTS(fd, "Current thread 0x");
|
|
|
|
|
else
|
|
|
|
|
PUTS(fd, "Thread 0x");
|
2013-10-20 18:21:02 -07:00
|
|
|
dump_hexadecimal(fd, (unsigned long)tstate->thread_id, sizeof(long)*2);
|
|
|
|
|
PUTS(fd, " (most recent call first):\n");
|
2011-03-31 01:31:06 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char*
|
|
|
|
|
_Py_DumpTracebackThreads(int fd, PyInterpreterState *interp,
|
|
|
|
|
PyThreadState *current_thread)
|
|
|
|
|
{
|
|
|
|
|
PyThreadState *tstate;
|
|
|
|
|
unsigned int nthreads;
|
|
|
|
|
|
|
|
|
|
/* Get the current interpreter from the current thread */
|
|
|
|
|
tstate = PyInterpreterState_ThreadHead(interp);
|
|
|
|
|
if (tstate == NULL)
|
|
|
|
|
return "unable to get the thread head state";
|
|
|
|
|
|
|
|
|
|
/* Dump the traceback of each thread */
|
|
|
|
|
tstate = PyInterpreterState_ThreadHead(interp);
|
|
|
|
|
nthreads = 0;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
if (nthreads != 0)
|
|
|
|
|
write(fd, "\n", 1);
|
|
|
|
|
if (nthreads >= MAX_NTHREADS) {
|
|
|
|
|
PUTS(fd, "...\n");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
write_thread_id(fd, tstate, tstate == current_thread);
|
|
|
|
|
dump_traceback(fd, tstate, 0);
|
|
|
|
|
tstate = PyThreadState_Next(tstate);
|
|
|
|
|
nthreads++;
|
|
|
|
|
} while (tstate != NULL);
|
|
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|