@@ -589,10 +589,11 @@ Tkapp_New(const char *screenName, const char *className,
589
589
int interactive , int wantobjects , int wantTk , int sync ,
590
590
const char * use )
591
591
{
592
+ PyTypeObject * type = (PyTypeObject * )Tkapp_Type ;
592
593
TkappObject * v ;
593
594
char * argv0 ;
594
595
595
- v = PyObject_New (TkappObject , ( PyTypeObject * ) Tkapp_Type );
596
+ v = (TkappObject * ) type -> tp_alloc ( type , 0 );
596
597
if (v == NULL )
597
598
return NULL ;
598
599
@@ -2745,9 +2746,10 @@ _tkinter_tktimertoken_deletetimerhandler_impl(TkttObject *self)
2745
2746
static TkttObject *
2746
2747
Tktt_New (PyObject * func )
2747
2748
{
2749
+ PyTypeObject * type = (PyTypeObject * )Tktt_Type ;
2748
2750
TkttObject * v ;
2749
2751
2750
- v = PyObject_New (TkttObject , ( PyTypeObject * ) Tktt_Type );
2752
+ v = (TkttObject * ) type -> tp_alloc ( type , 0 );
2751
2753
if (v == NULL )
2752
2754
return NULL ;
2753
2755
@@ -2758,19 +2760,33 @@ Tktt_New(PyObject *func)
2758
2760
return (TkttObject * )Py_NewRef (v );
2759
2761
}
2760
2762
2761
- static void
2762
- Tktt_Dealloc (PyObject * self )
2763
+ static int
2764
+ Tktt_Clear (PyObject * op )
2763
2765
{
2764
- TkttObject * v = TkttObject_CAST (self );
2765
- PyObject * func = v -> func ;
2766
- PyObject * tp = (PyObject * ) Py_TYPE (self );
2767
-
2768
- Py_XDECREF (func );
2766
+ TkttObject * self = TkttObject_CAST (op );
2767
+ Py_CLEAR (self -> func );
2768
+ return 0 ;
2769
+ }
2769
2770
2770
- PyObject_Free (self );
2771
+ static void
2772
+ Tktt_Dealloc (PyObject * op )
2773
+ {
2774
+ PyTypeObject * tp = Py_TYPE (op );
2775
+ PyObject_GC_UnTrack (op );
2776
+ (void )Tktt_Clear (op );
2777
+ tp -> tp_free (op );
2771
2778
Py_DECREF (tp );
2772
2779
}
2773
2780
2781
+ static int
2782
+ Tktt_Traverse (PyObject * op , visitproc visit , void * arg )
2783
+ {
2784
+ TkttObject * self = TkttObject_CAST (op );
2785
+ Py_VISIT (Py_TYPE (op ));
2786
+ Py_VISIT (self -> func );
2787
+ return 0 ;
2788
+ }
2789
+
2774
2790
static PyObject *
2775
2791
Tktt_Repr (PyObject * self )
2776
2792
{
@@ -3061,21 +3077,38 @@ _tkinter_tkapp_willdispatch_impl(TkappObject *self)
3061
3077
3062
3078
/**** Tkapp Type Methods ****/
3063
3079
3080
+ static int
3081
+ Tkapp_Clear (PyObject * op )
3082
+ {
3083
+ TkappObject * self = TkappObject_CAST (op );
3084
+ Py_CLEAR (self -> trace );
3085
+ return 0 ;
3086
+ }
3087
+
3064
3088
static void
3065
3089
Tkapp_Dealloc (PyObject * op )
3066
3090
{
3091
+ PyTypeObject * tp = Py_TYPE (op );
3092
+ PyObject_GC_UnTrack (op );
3067
3093
TkappObject * self = TkappObject_CAST (op );
3068
- PyTypeObject * tp = Py_TYPE (self );
3069
3094
/*CHECK_TCL_APPARTMENT;*/
3070
3095
ENTER_TCL
3071
3096
Tcl_DeleteInterp (Tkapp_Interp (self ));
3072
3097
LEAVE_TCL
3073
- Py_XDECREF ( self -> trace );
3074
- PyObject_Free (self );
3098
+ ( void ) Tkapp_Clear ( op );
3099
+ tp -> tp_free (self );
3075
3100
Py_DECREF (tp );
3076
3101
DisableEventHook ();
3077
3102
}
3078
3103
3104
+ static int
3105
+ Tkapp_Traverse (PyObject * op , visitproc visit , void * arg )
3106
+ {
3107
+ TkappObject * self = TkappObject_CAST (op );
3108
+ Py_VISIT (Py_TYPE (op ));
3109
+ Py_VISIT (self -> trace );
3110
+ return 0 ;
3111
+ }
3079
3112
3080
3113
3081
3114
/**** Tkinter Module ****/
@@ -3263,7 +3296,9 @@ static PyMethodDef Tktt_methods[] =
3263
3296
};
3264
3297
3265
3298
static PyType_Slot Tktt_Type_slots [] = {
3299
+ {Py_tp_clear , Tktt_Clear },
3266
3300
{Py_tp_dealloc , Tktt_Dealloc },
3301
+ {Py_tp_traverse , Tktt_Traverse },
3267
3302
{Py_tp_repr , Tktt_Repr },
3268
3303
{Py_tp_methods , Tktt_methods },
3269
3304
{0 , 0 }
@@ -3276,6 +3311,7 @@ static PyType_Spec Tktt_Type_spec = {
3276
3311
Py_TPFLAGS_DEFAULT
3277
3312
| Py_TPFLAGS_DISALLOW_INSTANTIATION
3278
3313
| Py_TPFLAGS_IMMUTABLETYPE
3314
+ | Py_TPFLAGS_HAVE_GC
3279
3315
),
3280
3316
.slots = Tktt_Type_slots ,
3281
3317
};
@@ -3322,7 +3358,9 @@ static PyMethodDef Tkapp_methods[] =
3322
3358
};
3323
3359
3324
3360
static PyType_Slot Tkapp_Type_slots [] = {
3361
+ {Py_tp_clear , Tkapp_Clear },
3325
3362
{Py_tp_dealloc , Tkapp_Dealloc },
3363
+ {Py_tp_traverse , Tkapp_Traverse },
3326
3364
{Py_tp_methods , Tkapp_methods },
3327
3365
{0 , 0 }
3328
3366
};
@@ -3335,6 +3373,7 @@ static PyType_Spec Tkapp_Type_spec = {
3335
3373
Py_TPFLAGS_DEFAULT
3336
3374
| Py_TPFLAGS_DISALLOW_INSTANTIATION
3337
3375
| Py_TPFLAGS_IMMUTABLETYPE
3376
+ | Py_TPFLAGS_HAVE_GC
3338
3377
),
3339
3378
.slots = Tkapp_Type_slots ,
3340
3379
};
0 commit comments