@@ -147,18 +147,37 @@ partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)
147
147
return (PyObject * )pto ;
148
148
}
149
149
150
+ static int
151
+ partial_clear (partialobject * pto )
152
+ {
153
+ Py_CLEAR (pto -> fn );
154
+ Py_CLEAR (pto -> args );
155
+ Py_CLEAR (pto -> kw );
156
+ Py_CLEAR (pto -> dict );
157
+ return 0 ;
158
+ }
159
+
160
+ static int
161
+ partial_traverse (partialobject * pto , visitproc visit , void * arg )
162
+ {
163
+ Py_VISIT (Py_TYPE (pto ));
164
+ Py_VISIT (pto -> fn );
165
+ Py_VISIT (pto -> args );
166
+ Py_VISIT (pto -> kw );
167
+ Py_VISIT (pto -> dict );
168
+ return 0 ;
169
+ }
170
+
150
171
static void
151
172
partial_dealloc (partialobject * pto )
152
173
{
153
174
PyTypeObject * tp = Py_TYPE (pto );
154
175
/* bpo-31095: UnTrack is needed before calling any callbacks */
155
176
PyObject_GC_UnTrack (pto );
156
- if (pto -> weakreflist != NULL )
177
+ if (pto -> weakreflist != NULL ) {
157
178
PyObject_ClearWeakRefs ((PyObject * ) pto );
158
- Py_XDECREF (pto -> fn );
159
- Py_XDECREF (pto -> args );
160
- Py_XDECREF (pto -> kw );
161
- Py_XDECREF (pto -> dict );
179
+ }
180
+ (void )partial_clear (pto );
162
181
tp -> tp_free (pto );
163
182
Py_DECREF (tp );
164
183
}
@@ -307,16 +326,6 @@ partial_call(partialobject *pto, PyObject *args, PyObject *kwargs)
307
326
return res ;
308
327
}
309
328
310
- static int
311
- partial_traverse (partialobject * pto , visitproc visit , void * arg )
312
- {
313
- Py_VISIT (pto -> fn );
314
- Py_VISIT (pto -> args );
315
- Py_VISIT (pto -> kw );
316
- Py_VISIT (pto -> dict );
317
- return 0 ;
318
- }
319
-
320
329
PyDoc_STRVAR (partial_doc ,
321
330
"partial(func, *args, **keywords) - new function with partial application\n\
322
331
of the given arguments and keywords.\n" );
@@ -469,6 +478,7 @@ static PyType_Slot partial_type_slots[] = {
469
478
{Py_tp_setattro , PyObject_GenericSetAttr },
470
479
{Py_tp_doc , (void * )partial_doc },
471
480
{Py_tp_traverse , partial_traverse },
481
+ {Py_tp_clear , partial_clear },
472
482
{Py_tp_methods , partial_methods },
473
483
{Py_tp_members , partial_memberlist },
474
484
{Py_tp_getset , partial_getsetlist },
@@ -506,14 +516,16 @@ static void
506
516
keyobject_dealloc (keyobject * ko )
507
517
{
508
518
PyTypeObject * tp = Py_TYPE (ko );
509
- keyobject_clear (ko );
510
- PyObject_Free (ko );
519
+ PyObject_GC_UnTrack (ko );
520
+ (void )keyobject_clear (ko );
521
+ tp -> tp_free (ko );
511
522
Py_DECREF (tp );
512
523
}
513
524
514
525
static int
515
526
keyobject_traverse (keyobject * ko , visitproc visit , void * arg )
516
527
{
528
+ Py_VISIT (Py_TYPE (ko ));
517
529
Py_VISIT (ko -> cmp );
518
530
Py_VISIT (ko -> object );
519
531
return 0 ;
@@ -546,7 +558,8 @@ static PyType_Slot keyobject_type_slots[] = {
546
558
static PyType_Spec keyobject_type_spec = {
547
559
.name = "functools.KeyWrapper" ,
548
560
.basicsize = sizeof (keyobject ),
549
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION ,
561
+ .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION |
562
+ Py_TPFLAGS_HAVE_GC ),
550
563
.slots = keyobject_type_slots
551
564
};
552
565
@@ -560,14 +573,15 @@ keyobject_call(keyobject *ko, PyObject *args, PyObject *kwds)
560
573
if (!PyArg_ParseTupleAndKeywords (args , kwds , "O:K" , kwargs , & object ))
561
574
return NULL ;
562
575
563
- result = PyObject_New (keyobject , Py_TYPE (ko ));
576
+ result = PyObject_GC_New (keyobject , Py_TYPE (ko ));
564
577
if (result == NULL ) {
565
578
return NULL ;
566
579
}
567
580
Py_INCREF (ko -> cmp );
568
581
result -> cmp = ko -> cmp ;
569
582
Py_INCREF (object );
570
583
result -> object = object ;
584
+ PyObject_GC_Track (result );
571
585
return (PyObject * )result ;
572
586
}
573
587
@@ -621,12 +635,13 @@ functools_cmp_to_key(PyObject *self, PyObject *args, PyObject *kwds)
621
635
return NULL ;
622
636
623
637
state = get_functools_state (self );
624
- object = PyObject_New (keyobject , state -> keyobject_type );
638
+ object = PyObject_GC_New (keyobject , state -> keyobject_type );
625
639
if (!object )
626
640
return NULL ;
627
641
Py_INCREF (cmp );
628
642
object -> cmp = cmp ;
629
643
object -> object = NULL ;
644
+ PyObject_GC_Track (object );
630
645
return (PyObject * )object ;
631
646
}
632
647
@@ -754,7 +769,7 @@ lru_list_elem_dealloc(lru_list_elem *link)
754
769
PyTypeObject * tp = Py_TYPE (link );
755
770
Py_XDECREF (link -> key );
756
771
Py_XDECREF (link -> result );
757
- PyObject_Free (link );
772
+ tp -> tp_free (link );
758
773
Py_DECREF (tp );
759
774
}
760
775
@@ -1260,7 +1275,7 @@ lru_cache_dealloc(lru_cache_object *obj)
1260
1275
PyObject_ClearWeakRefs ((PyObject * )obj );
1261
1276
}
1262
1277
1263
- lru_cache_tp_clear (obj );
1278
+ ( void ) lru_cache_tp_clear (obj );
1264
1279
tp -> tp_free (obj );
1265
1280
Py_DECREF (tp );
1266
1281
}
0 commit comments