@@ -230,7 +230,7 @@ static PyThreadState *tcl_tstate = NULL;
230230
231231/**** Tkapp Object Declaration ****/
232232
233- static PyTypeObject Tkapp_Type ;
233+ static PyObject * Tkapp_Type ;
234234
235235typedef struct {
236236 PyObject_HEAD
@@ -250,7 +250,6 @@ typedef struct {
250250 Tcl_ObjType * StringType ;
251251} TkappObject ;
252252
253- #define Tkapp_Check (v ) (Py_TYPE(v) == &Tkapp_Type)
254253#define Tkapp_Interp (v ) (((TkappObject *) (v))->interp)
255254#define Tkapp_Result (v ) Tcl_GetStringResult(Tkapp_Interp(v))
256255
@@ -487,7 +486,7 @@ Tkapp_New(char *screenName, char *className,
487486 TkappObject * v ;
488487 char * argv0 ;
489488
490- v = PyObject_New (TkappObject , & Tkapp_Type );
489+ v = PyObject_New (TkappObject , ( PyTypeObject * ) Tkapp_Type );
491490 if (v == NULL )
492491 return NULL ;
493492
@@ -637,14 +636,14 @@ typedef struct {
637636 PyObject * string ; /* This cannot cause cycles. */
638637} PyTclObject ;
639638
640- static PyTypeObject PyTclObject_Type ;
641- #define PyTclObject_Check (v ) ((v)->ob_type == & PyTclObject_Type)
639+ static PyObject * PyTclObject_Type ;
640+ #define PyTclObject_Check (v ) ((v)->ob_type == (PyTypeObject *) PyTclObject_Type)
642641
643642static PyObject *
644643newPyTclObject (Tcl_Obj * arg )
645644{
646645 PyTclObject * self ;
647- self = PyObject_New (PyTclObject , & PyTclObject_Type );
646+ self = PyObject_New (PyTclObject , ( PyTypeObject * ) PyTclObject_Type );
648647 if (self == NULL )
649648 return NULL ;
650649 Tcl_IncrRefCount (arg );
@@ -778,50 +777,25 @@ static PyGetSetDef PyTclObject_getsetlist[] = {
778777 {0 },
779778};
780779
781- static PyTypeObject PyTclObject_Type = {
782- PyVarObject_HEAD_INIT (NULL , 0 )
783- "_tkinter.Tcl_Obj" , /*tp_name*/
784- sizeof (PyTclObject ), /*tp_basicsize*/
785- 0 , /*tp_itemsize*/
786- /* methods */
787- (destructor )PyTclObject_dealloc ,/*tp_dealloc*/
788- 0 , /*tp_print*/
789- 0 , /*tp_getattr*/
790- 0 , /*tp_setattr*/
791- 0 , /*tp_reserved*/
792- (reprfunc )PyTclObject_repr , /*tp_repr*/
793- 0 , /*tp_as_number*/
794- 0 , /*tp_as_sequence*/
795- 0 , /*tp_as_mapping*/
796- 0 , /*tp_hash*/
797- 0 , /*tp_call*/
798- (reprfunc )PyTclObject_str , /*tp_str*/
799- PyObject_GenericGetAttr , /*tp_getattro*/
800- 0 , /*tp_setattro*/
801- 0 , /*tp_as_buffer*/
802- Py_TPFLAGS_DEFAULT , /*tp_flags*/
803- 0 , /*tp_doc*/
804- 0 , /*tp_traverse*/
805- 0 , /*tp_clear*/
806- PyTclObject_richcompare , /*tp_richcompare*/
807- 0 , /*tp_weaklistoffset*/
808- 0 , /*tp_iter*/
809- 0 , /*tp_iternext*/
810- 0 , /*tp_methods*/
811- 0 , /*tp_members*/
812- PyTclObject_getsetlist , /*tp_getset*/
813- 0 , /*tp_base*/
814- 0 , /*tp_dict*/
815- 0 , /*tp_descr_get*/
816- 0 , /*tp_descr_set*/
817- 0 , /*tp_dictoffset*/
818- 0 , /*tp_init*/
819- 0 , /*tp_alloc*/
820- 0 , /*tp_new*/
821- 0 , /*tp_free*/
822- 0 , /*tp_is_gc*/
780+ static PyType_Slot PyTclObject_Type_slots [] = {
781+ {Py_tp_dealloc , (destructor )PyTclObject_dealloc },
782+ {Py_tp_repr , (reprfunc )PyTclObject_repr },
783+ {Py_tp_str , (reprfunc )PyTclObject_str },
784+ {Py_tp_getattro , NULL },
785+ {Py_tp_richcompare , PyTclObject_richcompare },
786+ {Py_tp_getset , PyTclObject_getsetlist },
787+ {0 , 0 }
823788};
824789
790+ static PyType_Spec PyTclObject_Type_spec = {
791+ "_tkinter.Tcl_Obj" ,
792+ sizeof (PyTclObject ),
793+ 0 ,
794+ Py_TPFLAGS_DEFAULT ,
795+ PyTclObject_Type_slots ,
796+ };
797+
798+
825799static Tcl_Obj *
826800AsObj (PyObject * value )
827801{
@@ -2150,7 +2124,7 @@ Tkapp_DeleteFileHandler(PyObject *self, PyObject *args)
21502124
21512125/**** Tktt Object (timer token) ****/
21522126
2153- static PyTypeObject Tktt_Type ;
2127+ static PyObject * Tktt_Type ;
21542128
21552129typedef struct {
21562130 PyObject_HEAD
@@ -2189,7 +2163,7 @@ Tktt_New(PyObject *func)
21892163{
21902164 TkttObject * v ;
21912165
2192- v = PyObject_New (TkttObject , & Tktt_Type );
2166+ v = PyObject_New (TkttObject , ( PyTypeObject * ) Tktt_Type );
21932167 if (v == NULL )
21942168 return NULL ;
21952169
@@ -2222,38 +2196,20 @@ Tktt_Repr(PyObject *self)
22222196 v -> func == NULL ? ", handler deleted" : "" );
22232197}
22242198
2225- static PyTypeObject Tktt_Type =
2226- {
2227- PyVarObject_HEAD_INIT (NULL , 0 )
2228- "tktimertoken" , /*tp_name */
2229- sizeof (TkttObject ), /*tp_basicsize */
2230- 0 , /*tp_itemsize */
2231- Tktt_Dealloc , /*tp_dealloc */
2232- 0 , /*tp_print */
2233- 0 , /*tp_getattr */
2234- 0 , /*tp_setattr */
2235- 0 , /*tp_reserved */
2236- Tktt_Repr , /*tp_repr */
2237- 0 , /*tp_as_number */
2238- 0 , /*tp_as_sequence */
2239- 0 , /*tp_as_mapping */
2240- 0 , /*tp_hash */
2241- 0 , /*tp_call*/
2242- 0 , /*tp_str*/
2243- 0 , /*tp_getattro*/
2244- 0 , /*tp_setattro*/
2245- 0 , /*tp_as_buffer*/
2246- Py_TPFLAGS_DEFAULT , /*tp_flags*/
2247- 0 , /*tp_doc*/
2248- 0 , /*tp_traverse*/
2249- 0 , /*tp_clear*/
2250- 0 , /*tp_richcompare*/
2251- 0 , /*tp_weaklistoffset*/
2252- 0 , /*tp_iter*/
2253- 0 , /*tp_iternext*/
2254- Tktt_methods , /*tp_methods*/
2199+ static PyType_Slot Tktt_Type_slots [] = {
2200+ {Py_tp_dealloc , Tktt_Dealloc },
2201+ {Py_tp_repr , Tktt_Repr },
2202+ {Py_tp_methods , Tktt_methods },
2203+ {0 , 0 }
22552204};
22562205
2206+ static PyType_Spec Tktt_Type_spec = {
2207+ "tktimertoken" ,
2208+ sizeof (TkttObject ),
2209+ 0 ,
2210+ Py_TPFLAGS_DEFAULT ,
2211+ Tktt_Type_slots ,
2212+ };
22572213
22582214
22592215/** Timer Handler **/
@@ -2541,36 +2497,19 @@ Tkapp_Dealloc(PyObject *self)
25412497 DisableEventHook ();
25422498}
25432499
2544- static PyTypeObject Tkapp_Type =
2545- {
2546- PyVarObject_HEAD_INIT (NULL , 0 )
2547- "tkapp" , /*tp_name */
2548- sizeof (TkappObject ), /*tp_basicsize */
2549- 0 , /*tp_itemsize */
2550- Tkapp_Dealloc , /*tp_dealloc */
2551- 0 , /*tp_print */
2552- 0 , /*tp_getattr */
2553- 0 , /*tp_setattr */
2554- 0 , /*tp_reserved */
2555- 0 , /*tp_repr */
2556- 0 , /*tp_as_number */
2557- 0 , /*tp_as_sequence */
2558- 0 , /*tp_as_mapping */
2559- 0 , /*tp_hash */
2560- 0 , /*tp_call*/
2561- 0 , /*tp_str*/
2562- 0 , /*tp_getattro*/
2563- 0 , /*tp_setattro*/
2564- 0 , /*tp_as_buffer*/
2565- Py_TPFLAGS_DEFAULT , /*tp_flags*/
2566- 0 , /*tp_doc*/
2567- 0 , /*tp_traverse*/
2568- 0 , /*tp_clear*/
2569- 0 , /*tp_richcompare*/
2570- 0 , /*tp_weaklistoffset*/
2571- 0 , /*tp_iter*/
2572- 0 , /*tp_iternext*/
2573- Tkapp_methods , /*tp_methods*/
2500+ static PyType_Slot Tkapp_Type_slots [] = {
2501+ {Py_tp_dealloc , Tkapp_Dealloc },
2502+ {Py_tp_methods , Tkapp_methods },
2503+ {0 , 0 }
2504+ };
2505+
2506+
2507+ static PyType_Spec Tkapp_Type_spec = {
2508+ "tkapp" ,
2509+ sizeof (TkappObject ),
2510+ 0 ,
2511+ Py_TPFLAGS_DEFAULT ,
2512+ Tkapp_Type_slots ,
25742513};
25752514
25762515
@@ -2874,45 +2813,116 @@ static struct PyModuleDef _tkintermodule = {
28742813PyMODINIT_FUNC
28752814PyInit__tkinter (void )
28762815{
2877- PyObject * m , * uexe , * cexe ;
2816+ PyObject * m , * uexe , * cexe , * o ;
28782817
2879- if (PyType_Ready (& Tkapp_Type ) < 0 )
2880- return NULL ;
2818+ /* Due to cross platform compiler issues the slots must be filled
2819+ * here. It's required for portability to Windows without requiring
2820+ * C++. See xxxlimited.c*/
2821+ PyTclObject_Type_slots [3 ].pfunc = PyObject_GenericGetAttr ;
28812822
28822823#ifdef WITH_THREAD
28832824 tcl_lock = PyThread_allocate_lock ();
2825+ if (tcl_lock == NULL )
2826+ return NULL ;
28842827#endif
28852828
28862829 m = PyModule_Create (& _tkintermodule );
28872830 if (m == NULL )
28882831 return NULL ;
28892832
2890- Tkinter_TclError = PyErr_NewException ("_tkinter.TclError" , NULL , NULL );
2891- Py_INCREF (Tkinter_TclError );
2892- PyModule_AddObject (m , "TclError" , Tkinter_TclError );
2833+ o = PyErr_NewException ("_tkinter.TclError" , NULL , NULL );
2834+ if (o == NULL ) {
2835+ Py_DECREF (m );
2836+ return NULL ;
2837+ }
2838+ Py_INCREF (o );
2839+ if (PyModule_AddObject (m , "TclError" , o )) {
2840+ Py_DECREF (o );
2841+ Py_DECREF (m );
2842+ return NULL ;
2843+ }
2844+ Tkinter_TclError = o ;
28932845
2894- PyModule_AddIntConstant (m , "READABLE" , TCL_READABLE );
2895- PyModule_AddIntConstant (m , "WRITABLE" , TCL_WRITABLE );
2896- PyModule_AddIntConstant (m , "EXCEPTION" , TCL_EXCEPTION );
2897- PyModule_AddIntConstant (m , "WINDOW_EVENTS" , TCL_WINDOW_EVENTS );
2898- PyModule_AddIntConstant (m , "FILE_EVENTS" , TCL_FILE_EVENTS );
2899- PyModule_AddIntConstant (m , "TIMER_EVENTS" , TCL_TIMER_EVENTS );
2900- PyModule_AddIntConstant (m , "IDLE_EVENTS" , TCL_IDLE_EVENTS );
2901- PyModule_AddIntConstant (m , "ALL_EVENTS" , TCL_ALL_EVENTS );
2902- PyModule_AddIntConstant (m , "DONT_WAIT" , TCL_DONT_WAIT );
2903- PyModule_AddStringConstant (m , "TK_VERSION" , TK_VERSION );
2904- PyModule_AddStringConstant (m , "TCL_VERSION" , TCL_VERSION );
2846+ if (PyModule_AddIntConstant (m , "READABLE" , TCL_READABLE )) {
2847+ Py_DECREF (m );
2848+ return NULL ;
2849+ }
2850+ if (PyModule_AddIntConstant (m , "WRITABLE" , TCL_WRITABLE )) {
2851+ Py_DECREF (m );
2852+ return NULL ;
2853+ }
2854+ if (PyModule_AddIntConstant (m , "EXCEPTION" , TCL_EXCEPTION )) {
2855+ Py_DECREF (m );
2856+ return NULL ;
2857+ }
2858+ if (PyModule_AddIntConstant (m , "WINDOW_EVENTS" , TCL_WINDOW_EVENTS )) {
2859+ Py_DECREF (m );
2860+ return NULL ;
2861+ }
2862+ if (PyModule_AddIntConstant (m , "FILE_EVENTS" , TCL_FILE_EVENTS )) {
2863+ Py_DECREF (m );
2864+ return NULL ;
2865+ }
2866+ if (PyModule_AddIntConstant (m , "TIMER_EVENTS" , TCL_TIMER_EVENTS )) {
2867+ Py_DECREF (m );
2868+ return NULL ;
2869+ }
2870+ if (PyModule_AddIntConstant (m , "IDLE_EVENTS" , TCL_IDLE_EVENTS )) {
2871+ Py_DECREF (m );
2872+ return NULL ;
2873+ }
2874+ if (PyModule_AddIntConstant (m , "ALL_EVENTS" , TCL_ALL_EVENTS )) {
2875+ Py_DECREF (m );
2876+ return NULL ;
2877+ }
2878+ if (PyModule_AddIntConstant (m , "DONT_WAIT" , TCL_DONT_WAIT )) {
2879+ Py_DECREF (m );
2880+ return NULL ;
2881+ }
2882+ if (PyModule_AddStringConstant (m , "TK_VERSION" , TK_VERSION )) {
2883+ Py_DECREF (m );
2884+ return NULL ;
2885+ }
2886+ if (PyModule_AddStringConstant (m , "TCL_VERSION" , TCL_VERSION )) {
2887+ Py_DECREF (m );
2888+ return NULL ;
2889+ }
29052890
2906- PyModule_AddObject (m , "TkappType" , (PyObject * )& Tkapp_Type );
2891+ o = PyType_FromSpec (& Tkapp_Type_spec );
2892+ if (o == NULL ) {
2893+ Py_DECREF (m );
2894+ return NULL ;
2895+ }
2896+ if (PyModule_AddObject (m , "TkappType" , o )) {
2897+ Py_DECREF (o );
2898+ Py_DECREF (m );
2899+ return NULL ;
2900+ }
2901+ Tkapp_Type = o ;
29072902
2908- if (PyType_Ready (& Tktt_Type ) < 0 ) {
2903+ o = PyType_FromSpec (& Tktt_Type_spec );
2904+ if (o == NULL ) {
29092905 Py_DECREF (m );
29102906 return NULL ;
29112907 }
2912- PyModule_AddObject (m , "TkttType" , (PyObject * )& Tktt_Type );
2908+ if (PyModule_AddObject (m , "TkttType" , o )) {
2909+ Py_DECREF (o );
2910+ Py_DECREF (m );
2911+ return NULL ;
2912+ }
2913+ Tktt_Type = o ;
29132914
2914- Py_TYPE (& PyTclObject_Type ) = & PyType_Type ;
2915- PyModule_AddObject (m , "Tcl_Obj" , (PyObject * )& PyTclObject_Type );
2915+ o = PyType_FromSpec (& PyTclObject_Type_spec );
2916+ if (o == NULL ) {
2917+ Py_DECREF (m );
2918+ return NULL ;
2919+ }
2920+ if (PyModule_AddObject (m , "Tcl_Obj" , o )) {
2921+ Py_DECREF (o );
2922+ Py_DECREF (m );
2923+ return NULL ;
2924+ }
2925+ PyTclObject_Type = o ;
29162926
29172927#ifdef TK_AQUA
29182928 /* Tk_MacOSXSetupTkNotifier must be called before Tcl's subsystems
0 commit comments