Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 11dc6c3

Browse files
committed
Issue #15721: make _tkinter module pep384 compatible.
1 parent 1f47650 commit 11dc6c3

1 file changed

Lines changed: 142 additions & 132 deletions

File tree

Modules/_tkinter.c

Lines changed: 142 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -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

235235
typedef 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

643642
static PyObject *
644643
newPyTclObject(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+
825799
static Tcl_Obj*
826800
AsObj(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

21552129
typedef 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 = {
28742813
PyMODINIT_FUNC
28752814
PyInit__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

Comments
 (0)