frame_traverse(): Use the standard Py_VISIT macro.

Py_VISIT:  cast the `op` argument to PyObject* when calling
`visit()`.  Else the caller has to pay too much attention to
this silly detail (e.g., frame_traverse needs to traverse
`struct _frame *` and `PyCodeObject *` pointers too).
This commit is contained in:
Tim Peters 2006-04-15 03:22:46 +00:00
parent a13131cf7f
commit de2acf6512
2 changed files with 20 additions and 22 deletions

View File

@ -303,13 +303,13 @@ PyAPI_FUNC(void) PyObject_GC_Del(void *);
* "visit" and "arg". This is intended to keep tp_traverse functions * "visit" and "arg". This is intended to keep tp_traverse functions
* looking as much alike as possible. * looking as much alike as possible.
*/ */
#define Py_VISIT(op) \ #define Py_VISIT(op) \
do { \ do { \
if (op) { \ if (op) { \
int vret = visit((op), arg); \ int vret = visit((PyObject *)(op), arg); \
if (vret) \ if (vret) \
return vret; \ return vret; \
} \ } \
} while (0) } while (0)
/* This is here for the sake of backwards compatibility. Extensions that /* This is here for the sake of backwards compatibility. Extensions that

View File

@ -422,30 +422,28 @@ static int
frame_traverse(PyFrameObject *f, visitproc visit, void *arg) frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
{ {
PyObject **fastlocals, **p; PyObject **fastlocals, **p;
int i, err, slots; int i, slots;
#define VISIT(o) if (o) {if ((err = visit((PyObject *)(o), arg))) return err;}
VISIT(f->f_back); Py_VISIT(f->f_back);
VISIT(f->f_code); Py_VISIT(f->f_code);
VISIT(f->f_builtins); Py_VISIT(f->f_builtins);
VISIT(f->f_globals); Py_VISIT(f->f_globals);
VISIT(f->f_locals); Py_VISIT(f->f_locals);
VISIT(f->f_trace); Py_VISIT(f->f_trace);
VISIT(f->f_exc_type); Py_VISIT(f->f_exc_type);
VISIT(f->f_exc_value); Py_VISIT(f->f_exc_value);
VISIT(f->f_exc_traceback); Py_VISIT(f->f_exc_traceback);
/* locals */ /* locals */
slots = f->f_nlocals + f->f_ncells + f->f_nfreevars; slots = f->f_nlocals + f->f_ncells + f->f_nfreevars;
fastlocals = f->f_localsplus; fastlocals = f->f_localsplus;
for (i = slots; --i >= 0; ++fastlocals) { for (i = slots; --i >= 0; ++fastlocals)
VISIT(*fastlocals); Py_VISIT(*fastlocals);
}
/* stack */ /* stack */
if (f->f_stacktop != NULL) { if (f->f_stacktop != NULL) {
for (p = f->f_valuestack; p < f->f_stacktop; p++) for (p = f->f_valuestack; p < f->f_stacktop; p++)
VISIT(*p); Py_VISIT(*p);
} }
return 0; return 0;
} }