Skip to content

Commit e04a0e2

Browse files
author
mondragon
committed
Moved tracebackobject to traceback.h, Closes SF Bug #497067
git-svn-id: http://svn.python.org/projects/python/trunk@35506 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent cab625e commit e04a0e2

3 files changed

Lines changed: 27 additions & 24 deletions

File tree

Include/traceback.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@
55
extern "C" {
66
#endif
77

8+
struct _frame;
9+
810
/* Traceback interface */
911

10-
struct _frame;
12+
typedef struct _traceback {
13+
PyObject_HEAD
14+
struct _traceback *tb_next;
15+
struct _frame *tb_frame;
16+
int tb_lasti;
17+
int tb_lineno;
18+
} PyTracebackObject;
1119

1220
PyAPI_FUNC(int) PyTraceBack_Here(struct _frame *);
1321
PyAPI_FUNC(int) PyTraceBack_Print(PyObject *, PyObject *);

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ What's New in Python 2.4 alpha 1?
1212
Core and builtins
1313
-----------------
1414

15+
- Moved tracebackobject into traceback.h and renamed to PyTracebackObject
16+
1517
- Optimized the byte coding for multiple assignments like "a,b=b,a" and
1618
"a,b,c=1,2,3". Improves their speed by 25% to 30%.
1719

Python/traceback.c

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,9 @@
77
#include "frameobject.h"
88
#include "structmember.h"
99
#include "osdefs.h"
10+
#include "traceback.h"
1011

11-
typedef struct _tracebackobject {
12-
PyObject_HEAD
13-
struct _tracebackobject *tb_next;
14-
PyFrameObject *tb_frame;
15-
int tb_lasti;
16-
int tb_lineno;
17-
} tracebackobject;
18-
19-
#define OFF(x) offsetof(tracebackobject, x)
12+
#define OFF(x) offsetof(PyTracebackObject, x)
2013

2114
static struct memberlist tb_memberlist[] = {
2215
{"tb_next", T_OBJECT, OFF(tb_next)},
@@ -27,13 +20,13 @@ static struct memberlist tb_memberlist[] = {
2720
};
2821

2922
static PyObject *
30-
tb_getattr(tracebackobject *tb, char *name)
23+
tb_getattr(PyTracebackObject *tb, char *name)
3124
{
3225
return PyMember_Get((char *)tb, tb_memberlist, name);
3326
}
3427

3528
static void
36-
tb_dealloc(tracebackobject *tb)
29+
tb_dealloc(PyTracebackObject *tb)
3730
{
3831
PyObject_GC_UnTrack(tb);
3932
Py_TRASHCAN_SAFE_BEGIN(tb)
@@ -44,7 +37,7 @@ tb_dealloc(tracebackobject *tb)
4437
}
4538

4639
static int
47-
tb_traverse(tracebackobject *tb, visitproc visit, void *arg)
40+
tb_traverse(PyTracebackObject *tb, visitproc visit, void *arg)
4841
{
4942
int err = 0;
5043
if (tb->tb_next) {
@@ -58,7 +51,7 @@ tb_traverse(tracebackobject *tb, visitproc visit, void *arg)
5851
}
5952

6053
static void
61-
tb_clear(tracebackobject *tb)
54+
tb_clear(PyTracebackObject *tb)
6255
{
6356
Py_XDECREF(tb->tb_next);
6457
Py_XDECREF(tb->tb_frame);
@@ -70,7 +63,7 @@ PyTypeObject PyTraceBack_Type = {
7063
PyObject_HEAD_INIT(&PyType_Type)
7164
0,
7265
"traceback",
73-
sizeof(tracebackobject),
66+
sizeof(PyTracebackObject),
7467
0,
7568
(destructor)tb_dealloc, /*tp_dealloc*/
7669
0, /*tp_print*/
@@ -102,16 +95,16 @@ PyTypeObject PyTraceBack_Type = {
10295
0, /* tp_dict */
10396
};
10497

105-
static tracebackobject *
106-
newtracebackobject(tracebackobject *next, PyFrameObject *frame)
98+
static PyTracebackObject *
99+
newtracebackobject(PyTracebackObject *next, PyFrameObject *frame)
107100
{
108-
tracebackobject *tb;
101+
PyTracebackObject *tb;
109102
if ((next != NULL && !PyTraceBack_Check(next)) ||
110103
frame == NULL || !PyFrame_Check(frame)) {
111104
PyErr_BadInternalCall();
112105
return NULL;
113106
}
114-
tb = PyObject_GC_New(tracebackobject, &PyTraceBack_Type);
107+
tb = PyObject_GC_New(PyTracebackObject, &PyTraceBack_Type);
115108
if (tb != NULL) {
116109
Py_XINCREF(next);
117110
tb->tb_next = next;
@@ -129,8 +122,8 @@ int
129122
PyTraceBack_Here(PyFrameObject *frame)
130123
{
131124
PyThreadState *tstate = frame->f_tstate;
132-
tracebackobject *oldtb = (tracebackobject *) tstate->curexc_traceback;
133-
tracebackobject *tb = newtracebackobject(oldtb, frame);
125+
PyTracebackObject *oldtb = (PyTracebackObject *) tstate->curexc_traceback;
126+
PyTracebackObject *tb = newtracebackobject(oldtb, frame);
134127
if (tb == NULL)
135128
return -1;
136129
tstate->curexc_traceback = (PyObject *)tb;
@@ -222,11 +215,11 @@ tb_displayline(PyObject *f, char *filename, int lineno, char *name)
222215
}
223216

224217
static int
225-
tb_printinternal(tracebackobject *tb, PyObject *f, int limit)
218+
tb_printinternal(PyTracebackObject *tb, PyObject *f, int limit)
226219
{
227220
int err = 0;
228221
int depth = 0;
229-
tracebackobject *tb1 = tb;
222+
PyTracebackObject *tb1 = tb;
230223
while (tb1 != NULL) {
231224
depth++;
232225
tb1 = tb1->tb_next;
@@ -267,6 +260,6 @@ PyTraceBack_Print(PyObject *v, PyObject *f)
267260
}
268261
err = PyFile_WriteString("Traceback (most recent call last):\n", f);
269262
if (!err)
270-
err = tb_printinternal((tracebackobject *)v, f, limit);
263+
err = tb_printinternal((PyTracebackObject *)v, f, limit);
271264
return err;
272265
}

0 commit comments

Comments
 (0)