Skip to content

Commit ec139c8

Browse files
miss-islingtonchrstphrchvzserhiy-storchaka
authored
[3.12] gh-112672: Fix builtin Tkinter with Tcl 9.0 (GH-112681) (GH-120209)
* 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 501cd99 commit ec139c8

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
@@ -71,6 +71,12 @@ Copyright (C) 1994 Steen Lumholt.
7171
#define USE_DEPRECATED_TOMMATH_API 1
7272
#endif
7373

74+
// As suggested by https://core.tcl-lang.org/tcl/wiki?name=Migrating+C+extensions+to+Tcl+9
75+
#ifndef TCL_SIZE_MAX
76+
typedef int Tcl_Size;
77+
#define TCL_SIZE_MAX INT_MAX
78+
#endif
79+
7480
#if !(defined(MS_WINDOWS) || defined(__CYGWIN__))
7581
#define HAVE_CREATEFILEHANDLER
7682
#endif
@@ -493,7 +499,7 @@ unicodeFromTclString(const char *s)
493499
static PyObject *
494500
unicodeFromTclObj(Tcl_Obj *value)
495501
{
496-
int len;
502+
Tcl_Size len;
497503
#if USE_TCL_UNICODE
498504
int byteorder = NATIVE_BYTEORDER;
499505
const Tcl_UniChar *u = Tcl_GetUnicodeFromObj(value, &len);
@@ -521,6 +527,10 @@ class _tkinter.tktimertoken "TkttObject *" "&Tktt_Type_spec"
521527

522528
/**** Tkapp Object ****/
523529

530+
#if TK_MAJOR_VERSION >= 9
531+
int Tcl_AppInit(Tcl_Interp *);
532+
#endif
533+
524534
#ifndef WITH_APPINIT
525535
int
526536
Tcl_AppInit(Tcl_Interp *interp)
@@ -1148,7 +1158,7 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
11481158
}
11491159

11501160
if (value->typePtr == tkapp->ByteArrayType) {
1151-
int size;
1161+
Tcl_Size size;
11521162
char *data = (char*)Tcl_GetByteArrayFromObj(value, &size);
11531163
return PyBytes_FromStringAndSize(data, size);
11541164
}
@@ -1174,8 +1184,8 @@ FromObj(TkappObject *tkapp, Tcl_Obj *value)
11741184
}
11751185

11761186
if (value->typePtr == tkapp->ListType) {
1177-
int size;
1178-
int i, status;
1187+
Tcl_Size i, size;
1188+
int status;
11791189
PyObject *elem;
11801190
Tcl_Obj *tcl_elem;
11811191

@@ -1231,9 +1241,9 @@ typedef struct Tkapp_CallEvent {
12311241
} Tkapp_CallEvent;
12321242

12331243
static void
1234-
Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
1244+
Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, Tcl_Size objc)
12351245
{
1236-
int i;
1246+
Tcl_Size i;
12371247
for (i = 0; i < objc; i++)
12381248
Tcl_DecrRefCount(objv[i]);
12391249
if (objv != objStore)
@@ -1244,7 +1254,7 @@ Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
12441254
interpreter thread, which may or may not be the calling thread. */
12451255

12461256
static Tcl_Obj**
1247-
Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc)
1257+
Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, Tcl_Size *pobjc)
12481258
{
12491259
Tcl_Obj **objv = objStore;
12501260
Py_ssize_t objc = 0, i;
@@ -1292,10 +1302,10 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc)
12921302
Tcl_IncrRefCount(objv[i]);
12931303
}
12941304
}
1295-
*pobjc = (int)objc;
1305+
*pobjc = (Tcl_Size)objc;
12961306
return objv;
12971307
finally:
1298-
Tkapp_CallDeallocArgs(objv, objStore, (int)objc);
1308+
Tkapp_CallDeallocArgs(objv, objStore, (Tcl_Size)objc);
12991309
return NULL;
13001310
}
13011311

@@ -1361,7 +1371,7 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
13611371
{
13621372
Tcl_Obj *objStore[ARGSZ];
13631373
Tcl_Obj **objv;
1364-
int objc;
1374+
Tcl_Size objc;
13651375
int i;
13661376
ENTER_PYTHON
13671377
if (e->self->trace && !Tkapp_Trace(e->self, PyTuple_Pack(1, e->args))) {
@@ -1417,7 +1427,7 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
14171427
{
14181428
Tcl_Obj *objStore[ARGSZ];
14191429
Tcl_Obj **objv = NULL;
1420-
int objc, i;
1430+
Tcl_Size objc;
14211431
PyObject *res = NULL;
14221432
TkappObject *self = (TkappObject*)selfptr;
14231433
int flags = TCL_EVAL_DIRECT | TCL_EVAL_GLOBAL;
@@ -1464,6 +1474,7 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
14641474
{
14651475
TRACE(self, ("(O)", args));
14661476

1477+
int i;
14671478
objv = Tkapp_CallArgs(args, objStore, &objc);
14681479
if (!objv)
14691480
return NULL;
@@ -2197,13 +2208,12 @@ _tkinter_tkapp_splitlist(TkappObject *self, PyObject *arg)
21972208
/*[clinic end generated code: output=13b51d34386d36fb input=2b2e13351e3c0b53]*/
21982209
{
21992210
char *list;
2200-
int argc;
2211+
Tcl_Size argc, i;
22012212
const char **argv;
22022213
PyObject *v;
2203-
int i;
22042214

22052215
if (PyTclObject_Check(arg)) {
2206-
int objc;
2216+
Tcl_Size objc;
22072217
Tcl_Obj **objv;
22082218
if (Tcl_ListObjGetElements(Tkapp_Interp(self),
22092219
((PyTclObject*)arg)->value,

0 commit comments

Comments
 (0)