@@ -38,6 +38,8 @@ class traceback "PyTracebackObject *" "&PyTraceback_Type"
38
38
[clinic start generated code]*/
39
39
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=cf96294b2bebc811]*/
40
40
41
+ #define _PyTracebackObject_CAST (op ) ((PyTracebackObject *)(op))
42
+
41
43
#include "clinic/traceback.c.h"
42
44
43
45
static PyObject *
@@ -91,15 +93,16 @@ tb_new_impl(PyTypeObject *type, PyObject *tb_next, PyFrameObject *tb_frame,
91
93
}
92
94
93
95
static PyObject *
94
- tb_dir (PyTracebackObject * self , PyObject * Py_UNUSED (ignored ))
96
+ tb_dir (PyObject * Py_UNUSED ( self ) , PyObject * Py_UNUSED (ignored ))
95
97
{
96
98
return Py_BuildValue ("[ssss]" , "tb_frame" , "tb_next" ,
97
99
"tb_lasti" , "tb_lineno" );
98
100
}
99
101
100
102
static PyObject *
101
- tb_next_get (PyTracebackObject * self , void * Py_UNUSED (_ ))
103
+ tb_next_get (PyObject * op , void * Py_UNUSED (_ ))
102
104
{
105
+ PyTracebackObject * self = _PyTracebackObject_CAST (op );
103
106
PyObject * ret = (PyObject * )self -> tb_next ;
104
107
if (!ret ) {
105
108
ret = Py_None ;
@@ -108,18 +111,21 @@ tb_next_get(PyTracebackObject *self, void *Py_UNUSED(_))
108
111
}
109
112
110
113
static int
111
- tb_get_lineno (PyTracebackObject * tb ) {
114
+ tb_get_lineno (PyObject * op )
115
+ {
116
+ PyTracebackObject * tb = _PyTracebackObject_CAST (op );
112
117
_PyInterpreterFrame * frame = tb -> tb_frame -> f_frame ;
113
118
assert (frame != NULL );
114
119
return PyCode_Addr2Line (_PyFrame_GetCode (frame ), tb -> tb_lasti );
115
120
}
116
121
117
122
static PyObject *
118
- tb_lineno_get (PyTracebackObject * self , void * Py_UNUSED (_ ))
123
+ tb_lineno_get (PyObject * op , void * Py_UNUSED (_ ))
119
124
{
125
+ PyTracebackObject * self = _PyTracebackObject_CAST (op );
120
126
int lineno = self -> tb_lineno ;
121
127
if (lineno == -1 ) {
122
- lineno = tb_get_lineno (self );
128
+ lineno = tb_get_lineno (op );
123
129
if (lineno < 0 ) {
124
130
Py_RETURN_NONE ;
125
131
}
@@ -128,7 +134,7 @@ tb_lineno_get(PyTracebackObject *self, void *Py_UNUSED(_))
128
134
}
129
135
130
136
static int
131
- tb_next_set (PyTracebackObject * self , PyObject * new_next , void * Py_UNUSED (_ ))
137
+ tb_next_set (PyObject * op , PyObject * new_next , void * Py_UNUSED (_ ))
132
138
{
133
139
if (!new_next ) {
134
140
PyErr_Format (PyExc_TypeError , "can't delete tb_next attribute" );
@@ -147,6 +153,7 @@ tb_next_set(PyTracebackObject *self, PyObject *new_next, void *Py_UNUSED(_))
147
153
}
148
154
149
155
/* Check for loops */
156
+ PyTracebackObject * self = _PyTracebackObject_CAST (op );
150
157
PyTracebackObject * cursor = (PyTracebackObject * )new_next ;
151
158
while (cursor ) {
152
159
if (cursor == self ) {
@@ -163,7 +170,7 @@ tb_next_set(PyTracebackObject *self, PyObject *new_next, void *Py_UNUSED(_))
163
170
164
171
165
172
static PyMethodDef tb_methods [] = {
166
- {"__dir__" , _PyCFunction_CAST ( tb_dir ) , METH_NOARGS },
173
+ {"__dir__" , tb_dir , METH_NOARGS , NULL },
167
174
{NULL , NULL , 0 , NULL },
168
175
};
169
176
@@ -174,14 +181,15 @@ static PyMemberDef tb_memberlist[] = {
174
181
};
175
182
176
183
static PyGetSetDef tb_getsetters [] = {
177
- {"tb_next" , ( getter ) tb_next_get , ( setter ) tb_next_set , NULL , NULL },
178
- {"tb_lineno" , ( getter ) tb_lineno_get , NULL , NULL , NULL },
184
+ {"tb_next" , tb_next_get , tb_next_set , NULL , NULL },
185
+ {"tb_lineno" , tb_lineno_get , NULL , NULL , NULL },
179
186
{NULL } /* Sentinel */
180
187
};
181
188
182
189
static void
183
- tb_dealloc (PyTracebackObject * tb )
190
+ tb_dealloc (PyObject * op )
184
191
{
192
+ PyTracebackObject * tb = _PyTracebackObject_CAST (op );
185
193
PyObject_GC_UnTrack (tb );
186
194
Py_TRASHCAN_BEGIN (tb , tb_dealloc )
187
195
Py_XDECREF (tb -> tb_next );
@@ -191,16 +199,18 @@ tb_dealloc(PyTracebackObject *tb)
191
199
}
192
200
193
201
static int
194
- tb_traverse (PyTracebackObject * tb , visitproc visit , void * arg )
202
+ tb_traverse (PyObject * op , visitproc visit , void * arg )
195
203
{
204
+ PyTracebackObject * tb = _PyTracebackObject_CAST (op );
196
205
Py_VISIT (tb -> tb_next );
197
206
Py_VISIT (tb -> tb_frame );
198
207
return 0 ;
199
208
}
200
209
201
210
static int
202
- tb_clear (PyTracebackObject * tb )
211
+ tb_clear (PyObject * op )
203
212
{
213
+ PyTracebackObject * tb = _PyTracebackObject_CAST (op );
204
214
Py_CLEAR (tb -> tb_next );
205
215
Py_CLEAR (tb -> tb_frame );
206
216
return 0 ;
@@ -211,7 +221,7 @@ PyTypeObject PyTraceBack_Type = {
211
221
"traceback" ,
212
222
sizeof (PyTracebackObject ),
213
223
0 ,
214
- ( destructor ) tb_dealloc , /*tp_dealloc*/
224
+ tb_dealloc , /*tp_dealloc*/
215
225
0 , /*tp_vectorcall_offset*/
216
226
0 , /*tp_getattr*/
217
227
0 , /*tp_setattr*/
@@ -228,8 +238,8 @@ PyTypeObject PyTraceBack_Type = {
228
238
0 , /* tp_as_buffer */
229
239
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC ,/* tp_flags */
230
240
tb_new__doc__ , /* tp_doc */
231
- ( traverseproc ) tb_traverse , /* tp_traverse */
232
- ( inquiry ) tb_clear , /* tp_clear */
241
+ tb_traverse , /* tp_traverse */
242
+ tb_clear , /* tp_clear */
233
243
0 , /* tp_richcompare */
234
244
0 , /* tp_weaklistoffset */
235
245
0 , /* tp_iter */
@@ -663,7 +673,7 @@ tb_printinternal(PyTracebackObject *tb, PyObject *f, long limit)
663
673
code = PyFrame_GetCode (tb -> tb_frame );
664
674
int tb_lineno = tb -> tb_lineno ;
665
675
if (tb_lineno == -1 ) {
666
- tb_lineno = tb_get_lineno (tb );
676
+ tb_lineno = tb_get_lineno (( PyObject * ) tb );
667
677
}
668
678
if (last_file == NULL ||
669
679
code -> co_filename != last_file ||
0 commit comments