Skip to content

Commit f0165d0

Browse files
miss-islingtonchrstphrchvzserhiy-storchaka
authored
[3.13] gh-112672: Fix builtin Tkinter with Tcl 9.0 (GH-112681) (GH-120208)
* Add declaration of Tcl_AppInit(), missing in Tcl 9.0. * Use Tcl_Size instead of int where needed. (cherry picked from commit e079935) Co-authored-by: Christopher Chavez <chrischavez@gmx.us> Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent ffa7d82 commit f0165d0

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Support building :mod:`tkinter` with Tcl 9.0.

Modules/_tkinter.c

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ Copyright (C) 1994 Steen Lumholt.
6969
#define USE_DEPRECATED_TOMMATH_API 1
7070
#endif
7171

72+
// As suggested by https://core.tcl-lang.org/tcl/wiki?name=Migrating+C+extensions+to+Tcl+9
73+
#ifndef TCL_SIZE_MAX
74+
typedef int Tcl_Size;
75+
#define TCL_SIZE_MAX INT_MAX
76+
#endif
77+
7278
#if !(defined(MS_WINDOWS) || defined(__CYGWIN__))
7379
#define HAVE_CREATEFILEHANDLER
7480
#endif
@@ -489,7 +495,7 @@ unicodeFromTclString(const char *s)
489495
static PyObject *
490496
unicodeFromTclObj(Tcl_Obj *value)
491497
{
492-
int len;
498+
Tcl_Size len;
493499
#if USE_TCL_UNICODE
494500
int byteorder = NATIVE_BYTEORDER;
495501
const Tcl_UniChar *u = Tcl_GetUnicodeFromObj(value, &len);
@@ -517,6 +523,10 @@ class _tkinter.tktimertoken "TkttObject *" "&Tktt_Type_spec"
517523

518524
/**** Tkapp Object ****/
519525

526+
#if TK_MAJOR_VERSION >= 9
527+
int Tcl_AppInit(Tcl_Interp *);
528+
#endif
529+
520530
#ifndef WITH_APPINIT
521531
int
522532
Tcl_AppInit(Tcl_Interp *interp)
@@ -1142,7 +1152,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
11421152
}
11431153

11441154
if (value->typePtr == tkapp->ByteArrayType) {
1145-
int size;
1155+
Tcl_Size size;
11461156
char *data = (char*)Tcl_GetByteArrayFromObj(value, &size);
11471157
return PyBytes_FromStringAndSize(data, size);
11481158
}
@@ -1168,8 +1178,8 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
11681178
}
11691179

11701180
if (value->typePtr == tkapp->ListType) {
1171-
int size;
1172-
int i, status;
1181+
Tcl_Size i, size;
1182+
int status;
11731183
PyObject *elem;
11741184
Tcl_Obj *tcl_elem;
11751185

@@ -1225,9 +1235,9 @@ typedef struct Tkapp_CallEvent {
12251235
} Tkapp_CallEvent;
12261236

12271237
static void
1228-
Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
1238+
Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, Tcl_Size objc)
12291239
{
1230-
int i;
1240+
Tcl_Size i;
12311241
for (i = 0; i < objc; i++)
12321242
Tcl_DecrRefCount(objv[i]);
12331243
if (objv != objStore)
@@ -1238,7 +1248,7 @@ Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
12381248
interpreter thread, which may or may not be the calling thread. */
12391249

12401250
static Tcl_Obj**
1241-
Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc)
1251+
Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, Tcl_Size *pobjc)
12421252
{
12431253
Tcl_Obj **objv = objStore;
12441254
Py_ssize_t objc = 0, i;
@@ -1286,10 +1296,10 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc)
12861296
Tcl_IncrRefCount(objv[i]);
12871297
}
12881298
}
1289-
*pobjc = (int)objc;
1299+
*pobjc = (Tcl_Size)objc;
12901300
return objv;
12911301
finally:
1292-
Tkapp_CallDeallocArgs(objv, objStore, (int)objc);
1302+
Tkapp_CallDeallocArgs(objv, objStore, (Tcl_Size)objc);
12931303
return NULL;
12941304
}
12951305

@@ -1356,7 +1366,7 @@ Tkapp_CallProc(Tcl_Event *evPtr, int flags)
13561366
Tkapp_CallEvent *e = (Tkapp_CallEvent *)evPtr;
13571367
Tcl_Obj *objStore[ARGSZ];
13581368
Tcl_Obj **objv;
1359-
int objc;
1369+
Tcl_Size objc;
13601370
int i;
13611371
ENTER_PYTHON
13621372
if (e->self->trace && !Tkapp_Trace(e->self, PyTuple_Pack(1, e->args))) {
@@ -1412,7 +1422,7 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
14121422
{
14131423
Tcl_Obj *objStore[ARGSZ];
14141424
Tcl_Obj **objv = NULL;
1415-
int objc, i;
1425+
Tcl_Size objc;
14161426
PyObject *res = NULL;
14171427
TkappObject *self = (TkappObject*)selfptr;
14181428
int flags = TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL;
@@ -1459,6 +1469,7 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
14591469
{
14601470
TRACE(self, ("(O)", args));
14611471

1472+
int i;
14621473
objv = Tkapp_CallArgs(args, objStore, &objc);
14631474
if (!objv)
14641475
return NULL;
@@ -2193,13 +2204,12 @@ _tkinter_tkapp_splitlist(TkappObject *self, PyObject *arg)
21932204
/*[clinic end generated code: output=13b51d34386d36fb input=2b2e13351e3c0b53]*/
21942205
{
21952206
char *list;
2196-
int argc;
2207+
Tcl_Size argc, i;
21972208
const char **argv;
21982209
PyObject *v;
2199-
int i;
22002210

22012211
if (PyTclObject_Check(arg)) {
2202-
int objc;
2212+
Tcl_Size objc;
22032213
Tcl_Obj **objv;
22042214
if (Tcl_ListObjGetElements(Tkapp_Interp(self),
22052215
((PyTclObject*)arg)->value,

0 commit comments

Comments
 (0)