Skip to content

Commit 3f4ed3b

Browse files
author
thomas.wouters
committed
Use Py_VISIT in all tp_traverse methods, instead of traversing manually or using a custom, nearly-identical macro. This probably changes how some of these functions are compiled, which may result in fractionally slower (or faster) execution. Considering the nature of traversal, visiting much of the address space in unpredictable patterns, I'd argue the code readability and maintainability is well worth it ;P git-svn-id: http://svn.python.org/projects/python/trunk@45443 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 9c29372 commit 3f4ed3b

20 files changed

Lines changed: 109 additions & 340 deletions

Modules/_csv.c

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,16 @@ module instead.
4848
} \
4949
} while (0)
5050
#endif
51-
51+
#ifndef Py_VISIT
52+
#define Py_VISIT(op) \
53+
do { \
54+
if (op) { \
55+
int vret = visit((PyObject *)(op), arg); \
56+
if (vret) \
57+
return vret; \
58+
} \
59+
} while (0)
60+
#endif
5261

5362
/* end 2.2 compatibility macros */
5463

@@ -825,16 +834,9 @@ Reader_dealloc(ReaderObj *self)
825834
static int
826835
Reader_traverse(ReaderObj *self, visitproc visit, void *arg)
827836
{
828-
int err;
829-
#define VISIT(SLOT) \
830-
if (SLOT) { \
831-
err = visit((PyObject *)(SLOT), arg); \
832-
if (err) \
833-
return err; \
834-
}
835-
VISIT(self->dialect);
836-
VISIT(self->input_iter);
837-
VISIT(self->fields);
837+
Py_VISIT(self->dialect);
838+
Py_VISIT(self->input_iter);
839+
Py_VISIT(self->fields);
838840
return 0;
839841
}
840842

@@ -1255,15 +1257,8 @@ Writer_dealloc(WriterObj *self)
12551257
static int
12561258
Writer_traverse(WriterObj *self, visitproc visit, void *arg)
12571259
{
1258-
int err;
1259-
#define VISIT(SLOT) \
1260-
if (SLOT) { \
1261-
err = visit((PyObject *)(SLOT), arg); \
1262-
if (err) \
1263-
return err; \
1264-
}
1265-
VISIT(self->dialect);
1266-
VISIT(self->writeline);
1260+
Py_VISIT(self->dialect);
1261+
Py_VISIT(self->writeline);
12671262
return 0;
12681263
}
12691264

Modules/arraymodule.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2061,8 +2061,7 @@ arrayiter_dealloc(arrayiterobject *it)
20612061
static int
20622062
arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
20632063
{
2064-
if (it->ao != NULL)
2065-
return visit((PyObject *)(it->ao), arg);
2064+
Py_VISIT(it->ao);
20662065
return 0;
20672066
}
20682067

Modules/cPickle.c

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2909,22 +2909,14 @@ Pickler_dealloc(Picklerobject *self)
29092909
static int
29102910
Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)
29112911
{
2912-
int err;
2913-
#define VISIT(SLOT) \
2914-
if (SLOT) { \
2915-
err = visit((PyObject *)(SLOT), arg); \
2916-
if (err) \
2917-
return err; \
2918-
}
2919-
VISIT(self->write);
2920-
VISIT(self->memo);
2921-
VISIT(self->fast_memo);
2922-
VISIT(self->arg);
2923-
VISIT(self->file);
2924-
VISIT(self->pers_func);
2925-
VISIT(self->inst_pers_func);
2926-
VISIT(self->dispatch_table);
2927-
#undef VISIT
2912+
Py_VISIT(self->write);
2913+
Py_VISIT(self->memo);
2914+
Py_VISIT(self->fast_memo);
2915+
Py_VISIT(self->arg);
2916+
Py_VISIT(self->file);
2917+
Py_VISIT(self->pers_func);
2918+
Py_VISIT(self->inst_pers_func);
2919+
Py_VISIT(self->dispatch_table);
29282920
return 0;
29292921
}
29302922

@@ -5258,24 +5250,15 @@ Unpickler_dealloc(Unpicklerobject *self)
52585250
static int
52595251
Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)
52605252
{
5261-
int err;
5262-
5263-
#define VISIT(SLOT) \
5264-
if (SLOT) { \
5265-
err = visit((PyObject *)(SLOT), arg); \
5266-
if (err) \
5267-
return err; \
5268-
}
5269-
VISIT(self->readline);
5270-
VISIT(self->read);
5271-
VISIT(self->file);
5272-
VISIT(self->memo);
5273-
VISIT(self->stack);
5274-
VISIT(self->pers_func);
5275-
VISIT(self->arg);
5276-
VISIT(self->last_string);
5277-
VISIT(self->find_class);
5278-
#undef VISIT
5253+
Py_VISIT(self->readline);
5254+
Py_VISIT(self->read);
5255+
Py_VISIT(self->file);
5256+
Py_VISIT(self->memo);
5257+
Py_VISIT(self->stack);
5258+
Py_VISIT(self->pers_func);
5259+
Py_VISIT(self->arg);
5260+
Py_VISIT(self->last_string);
5261+
Py_VISIT(self->find_class);
52795262
return 0;
52805263
}
52815264

Modules/operator.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,7 @@ itemgetter_dealloc(itemgetterobject *ig)
358358
static int
359359
itemgetter_traverse(itemgetterobject *ig, visitproc visit, void *arg)
360360
{
361-
if (ig->item)
362-
return visit(ig->item, arg);
361+
Py_VISIT(ig->item);
363362
return 0;
364363
}
365364

@@ -497,8 +496,7 @@ attrgetter_dealloc(attrgetterobject *ag)
497496
static int
498497
attrgetter_traverse(attrgetterobject *ag, visitproc visit, void *arg)
499498
{
500-
if (ag->attr)
501-
return visit(ag->attr, arg);
499+
Py_VISIT(ag->attr);
502500
return 0;
503501
}
504502

Modules/pyexpat.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,13 +1655,8 @@ static int
16551655
xmlparse_traverse(xmlparseobject *op, visitproc visit, void *arg)
16561656
{
16571657
int i, err;
1658-
for (i = 0; handler_info[i].name != NULL; i++) {
1659-
if (!op->handlers[i])
1660-
continue;
1661-
err = visit(op->handlers[i], arg);
1662-
if (err)
1663-
return err;
1664-
}
1658+
for (i = 0; handler_info[i].name != NULL; i++)
1659+
Py_VISIT(op->handlers[i]);
16651660
return 0;
16661661
}
16671662

Modules/zipimport.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,7 @@ static int
170170
zipimporter_traverse(PyObject *obj, visitproc visit, void *arg)
171171
{
172172
ZipImporter *self = (ZipImporter *)obj;
173-
int err;
174-
175-
if (self->files != NULL) {
176-
err = visit(self->files, arg);
177-
if (err)
178-
return err;
179-
}
173+
Py_VISIT(self->files);
180174
return 0;
181175
}
182176

Objects/cellobject.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ cell_repr(PyCellObject *op)
7373
static int
7474
cell_traverse(PyCellObject *op, visitproc visit, void *arg)
7575
{
76-
if (op->ob_ref)
77-
return visit(op->ob_ref, arg);
76+
Py_VISIT(op->ob_ref);
7877
return 0;
7978
}
8079

Objects/classobject.c

Lines changed: 11 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -404,37 +404,12 @@ class_str(PyClassObject *op)
404404
static int
405405
class_traverse(PyClassObject *o, visitproc visit, void *arg)
406406
{
407-
int err;
408-
if (o->cl_bases) {
409-
err = visit(o->cl_bases, arg);
410-
if (err)
411-
return err;
412-
}
413-
if (o->cl_dict) {
414-
err = visit(o->cl_dict, arg);
415-
if (err)
416-
return err;
417-
}
418-
if (o->cl_name) {
419-
err = visit(o->cl_name, arg);
420-
if (err)
421-
return err;
422-
}
423-
if (o->cl_getattr) {
424-
err = visit(o->cl_getattr, arg);
425-
if (err)
426-
return err;
427-
}
428-
if (o->cl_setattr) {
429-
err = visit(o->cl_setattr, arg);
430-
if (err)
431-
return err;
432-
}
433-
if (o->cl_delattr) {
434-
err = visit(o->cl_delattr, arg);
435-
if (err)
436-
return err;
437-
}
407+
Py_VISIT(o->cl_bases);
408+
Py_VISIT(o->cl_dict);
409+
Py_VISIT(o->cl_name);
410+
Py_VISIT(o->cl_getattr);
411+
Py_VISIT(o->cl_setattr);
412+
Py_VISIT(o->cl_delattr);
438413
return 0;
439414
}
440415

@@ -979,17 +954,8 @@ instance_hash(PyInstanceObject *inst)
979954
static int
980955
instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
981956
{
982-
int err;
983-
if (o->in_class) {
984-
err = visit((PyObject *)(o->in_class), arg);
985-
if (err)
986-
return err;
987-
}
988-
if (o->in_dict) {
989-
err = visit(o->in_dict, arg);
990-
if (err)
991-
return err;
992-
}
957+
Py_VISIT(o->in_class);
958+
Py_VISIT(o->in_dict);
993959
return 0;
994960
}
995961

@@ -2348,22 +2314,9 @@ instancemethod_hash(PyMethodObject *a)
23482314
static int
23492315
instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
23502316
{
2351-
int err;
2352-
if (im->im_func) {
2353-
err = visit(im->im_func, arg);
2354-
if (err)
2355-
return err;
2356-
}
2357-
if (im->im_self) {
2358-
err = visit(im->im_self, arg);
2359-
if (err)
2360-
return err;
2361-
}
2362-
if (im->im_class) {
2363-
err = visit(im->im_class, arg);
2364-
if (err)
2365-
return err;
2366-
}
2317+
Py_VISIT(im->im_func);
2318+
Py_VISIT(im->im_self);
2319+
Py_VISIT(im->im_class);
23672320
return 0;
23682321
}
23692322

Objects/descrobject.c

Lines changed: 8 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -377,13 +377,7 @@ static int
377377
descr_traverse(PyObject *self, visitproc visit, void *arg)
378378
{
379379
PyDescrObject *descr = (PyDescrObject *)self;
380-
int err;
381-
382-
if (descr->d_type) {
383-
err = visit((PyObject *)(descr->d_type), arg);
384-
if (err)
385-
return err;
386-
}
380+
Py_VISIT(descr->d_type);
387381
return 0;
388382
}
389383

@@ -814,13 +808,7 @@ static int
814808
proxy_traverse(PyObject *self, visitproc visit, void *arg)
815809
{
816810
proxyobject *pp = (proxyobject *)self;
817-
int err;
818-
819-
if (pp->dict) {
820-
err = visit(pp->dict, arg);
821-
if (err)
822-
return err;
823-
}
811+
Py_VISIT(pp->dict);
824812
return 0;
825813
}
826814

@@ -999,18 +987,8 @@ static int
999987
wrapper_traverse(PyObject *self, visitproc visit, void *arg)
1000988
{
1001989
wrapperobject *wp = (wrapperobject *)self;
1002-
int err;
1003-
1004-
if (wp->descr) {
1005-
err = visit((PyObject *)(wp->descr), arg);
1006-
if (err)
1007-
return err;
1008-
}
1009-
if (wp->self) {
1010-
err = visit(wp->self, arg);
1011-
if (err)
1012-
return err;
1013-
}
990+
Py_VISIT(wp->descr);
991+
Py_VISIT(wp->self);
1014992
return 0;
1015993
}
1016994

@@ -1237,20 +1215,10 @@ static int
12371215
property_traverse(PyObject *self, visitproc visit, void *arg)
12381216
{
12391217
propertyobject *pp = (propertyobject *)self;
1240-
int err;
1241-
1242-
#define VISIT(SLOT) \
1243-
if (pp->SLOT) { \
1244-
err = visit((PyObject *)(pp->SLOT), arg); \
1245-
if (err) \
1246-
return err; \
1247-
}
1248-
1249-
VISIT(prop_get);
1250-
VISIT(prop_set);
1251-
VISIT(prop_del);
1252-
VISIT(prop_doc);
1253-
1218+
Py_VISIT(pp->prop_get);
1219+
Py_VISIT(pp->prop_set);
1220+
Py_VISIT(pp->prop_del);
1221+
Py_VISIT(pp->prop_doc);
12541222
return 0;
12551223
}
12561224

Objects/dictobject.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,17 +1732,12 @@ static int
17321732
dict_traverse(PyObject *op, visitproc visit, void *arg)
17331733
{
17341734
Py_ssize_t i = 0;
1735-
int err;
17361735
PyObject *pk;
17371736
PyObject *pv;
17381737

17391738
while (PyDict_Next(op, &i, &pk, &pv)) {
1740-
err = visit(pk, arg);
1741-
if (err)
1742-
return err;
1743-
err = visit(pv, arg);
1744-
if (err)
1745-
return err;
1739+
Py_VISIT(pk);
1740+
Py_VISIT(pv);
17461741
}
17471742
return 0;
17481743
}

0 commit comments

Comments
 (0)