cpython: 85285e6e28f4 (original) (raw)
--- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -200,6 +200,8 @@ class TclTest(unittest.TestCase): (('a', 3.4), ('a', 3.4)), ((), ()), (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
(call('dict', 'create', 1, '\u20ac', b'\xe2\x82\xac', (3.4,)),[](#l1.7)
(1, '\u20ac', '\u20ac', (3.4,))),[](#l1.8) ][](#l1.9) for arg, res in testcases:[](#l1.10) self.assertEqual(splitlist(arg), res, msg=arg)[](#l1.11)
@@ -232,6 +234,8 @@ class TclTest(unittest.TestCase): (('a', (2, 3.4)), ('a', (2, 3.4))), ((), ()), (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
(call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),[](#l1.16)
(12, '\u20ac', '\u20ac', (3.4,))),[](#l1.17) ][](#l1.18) for arg, res in testcases:[](#l1.19) self.assertEqual(split(arg), res, msg=arg)[](#l1.20)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -38,6 +38,9 @@ Core and Builtins Library ------- +- Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
- Issue #18324: set_payload now correctly handles binary input. This also supersedes the previous fixes for #14360, #1717, and #16564.
--- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -1757,16 +1757,35 @@ Tkapp_SplitList(PyObject *self, PyObject char *list; int argc; char **argv;
- if (PyTuple_Size(args) == 1) {
v = PyTuple_GetItem(args, 0);[](#l3.12)
if (PyTuple_Check(v)) {[](#l3.13)
Py_INCREF(v);[](#l3.14)
return v;[](#l3.15)
- if (!PyArg_ParseTuple(args, "O:splitlist", &arg))
return NULL;[](#l3.17)
- if (PyTclObject_Check(arg)) {
int objc;[](#l3.19)
Tcl_Obj **objv;[](#l3.20)
if (Tcl_ListObjGetElements(Tkapp_Interp(self),[](#l3.21)
((PyTclObject*)arg)->value,[](#l3.22)
&objc, &objv) == TCL_ERROR) {[](#l3.23)
return Tkinter_Error(self);[](#l3.24) }[](#l3.25)
if (!(v = PyTuple_New(objc)))[](#l3.26)
return NULL;[](#l3.27)
for (i = 0; i < objc; i++) {[](#l3.28)
PyObject *s = FromObj(self, objv[i]);[](#l3.29)
if (!s || PyTuple_SetItem(v, i, s)) {[](#l3.30)
Py_DECREF(v);[](#l3.31)
return NULL;[](#l3.32)
}[](#l3.33)
}[](#l3.34)
}return v;[](#l3.35)
- if (PyTuple_Check(arg)) {
Py_INCREF(arg);[](#l3.38)
return arg;[](#l3.39)
- }
+ if (!PyArg_ParseTuple(args, "et:splitlist", "utf-8", &list)) return NULL; @@ -1797,16 +1816,38 @@ Tkapp_SplitList(PyObject *self, PyObject static PyObject * Tkapp_Split(PyObject *self, PyObject *args) {
- if (PyTuple_Size(args) == 1) {
PyObject* o = PyTuple_GetItem(args, 0);[](#l3.54)
if (PyTuple_Check(o)) {[](#l3.55)
o = SplitObj(o);[](#l3.56)
return o;[](#l3.57)
- if (!PyArg_ParseTuple(args, "O:split", &arg))
return NULL;[](#l3.59)
- if (PyTclObject_Check(arg)) {
Tcl_Obj *value = ((PyTclObject*)arg)->value;[](#l3.61)
int objc;[](#l3.62)
Tcl_Obj **objv;[](#l3.63)
int i;[](#l3.64)
if (Tcl_ListObjGetElements(Tkapp_Interp(self), value,[](#l3.65)
&objc, &objv) == TCL_ERROR) {[](#l3.66)
return FromObj(self, value);[](#l3.67) }[](#l3.68)
if (objc == 0)[](#l3.69)
return PyUnicode_FromString("");[](#l3.70)
if (objc == 1)[](#l3.71)
return FromObj(self, objv[0]);[](#l3.72)
if (!(v = PyTuple_New(objc)))[](#l3.73)
return NULL;[](#l3.74)
for (i = 0; i < objc; i++) {[](#l3.75)
PyObject *s = FromObj(self, objv[i]);[](#l3.76)
if (!s || PyTuple_SetItem(v, i, s)) {[](#l3.77)
Py_DECREF(v);[](#l3.78)
return NULL;[](#l3.79)
}[](#l3.80)
}[](#l3.81)
}return v;[](#l3.82)
- if (PyTuple_Check(arg))
return SplitObj(arg);[](#l3.85)
+ if (!PyArg_ParseTuple(args, "et:split", "utf-8", &list)) return NULL; v = Split(list);