Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj

argument.

This is needed for support Tcl/Tk 8.6.
This commit is contained in:
Serhiy Storchaka 2013-08-22 17:42:05 +03:00
commit 254954aacd
3 changed files with 60 additions and 12 deletions

View File

@ -200,6 +200,8 @@ class TclTest(unittest.TestCase):
(('a', 3.4), ('a', 3.4)), (('a', 3.4), ('a', 3.4)),
((), ()), ((), ()),
(call('list', 1, '2', (3.4,)), (1, '2', (3.4,))), (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
(call('dict', 'create', 1, '\u20ac', b'\xe2\x82\xac', (3.4,)),
(1, '\u20ac', '\u20ac', (3.4,))),
] ]
for arg, res in testcases: for arg, res in testcases:
self.assertEqual(splitlist(arg), res, msg=arg) self.assertEqual(splitlist(arg), res, msg=arg)
@ -232,6 +234,8 @@ class TclTest(unittest.TestCase):
(('a', (2, 3.4)), ('a', (2, 3.4))), (('a', (2, 3.4)), ('a', (2, 3.4))),
((), ()), ((), ()),
(call('list', 1, '2', (3.4,)), (1, '2', (3.4,))), (call('list', 1, '2', (3.4,)), (1, '2', (3.4,))),
(call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)),
(12, '\u20ac', '\u20ac', (3.4,))),
] ]
for arg, res in testcases: for arg, res in testcases:
self.assertEqual(split(arg), res, msg=arg) self.assertEqual(split(arg), res, msg=arg)

View File

@ -38,6 +38,9 @@ Core and Builtins
Library Library
------- -------
- Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
argument.
- Issue #18324: set_payload now correctly handles binary input. This also - Issue #18324: set_payload now correctly handles binary input. This also
supersedes the previous fixes for #14360, #1717, and #16564. supersedes the previous fixes for #14360, #1717, and #16564.

View File

@ -1757,16 +1757,35 @@ Tkapp_SplitList(PyObject *self, PyObject *args)
char *list; char *list;
int argc; int argc;
char **argv; char **argv;
PyObject *v; PyObject *arg, *v;
int i; int i;
if (PyTuple_Size(args) == 1) { if (!PyArg_ParseTuple(args, "O:splitlist", &arg))
v = PyTuple_GetItem(args, 0); return NULL;
if (PyTuple_Check(v)) { if (PyTclObject_Check(arg)) {
Py_INCREF(v); int objc;
Tcl_Obj **objv;
if (Tcl_ListObjGetElements(Tkapp_Interp(self),
((PyTclObject*)arg)->value,
&objc, &objv) == TCL_ERROR) {
return Tkinter_Error(self);
}
if (!(v = PyTuple_New(objc)))
return NULL;
for (i = 0; i < objc; i++) {
PyObject *s = FromObj(self, objv[i]);
if (!s || PyTuple_SetItem(v, i, s)) {
Py_DECREF(v);
return NULL;
}
}
return v; return v;
} }
if (PyTuple_Check(arg)) {
Py_INCREF(arg);
return arg;
} }
if (!PyArg_ParseTuple(args, "et:splitlist", "utf-8", &list)) if (!PyArg_ParseTuple(args, "et:splitlist", "utf-8", &list))
return NULL; return NULL;
@ -1797,16 +1816,38 @@ Tkapp_SplitList(PyObject *self, PyObject *args)
static PyObject * static PyObject *
Tkapp_Split(PyObject *self, PyObject *args) Tkapp_Split(PyObject *self, PyObject *args)
{ {
PyObject *v; PyObject *arg, *v;
char *list; char *list;
if (PyTuple_Size(args) == 1) { if (!PyArg_ParseTuple(args, "O:split", &arg))
PyObject* o = PyTuple_GetItem(args, 0); return NULL;
if (PyTuple_Check(o)) { if (PyTclObject_Check(arg)) {
o = SplitObj(o); Tcl_Obj *value = ((PyTclObject*)arg)->value;
return o; int objc;
Tcl_Obj **objv;
int i;
if (Tcl_ListObjGetElements(Tkapp_Interp(self), value,
&objc, &objv) == TCL_ERROR) {
return FromObj(self, value);
}
if (objc == 0)
return PyUnicode_FromString("");
if (objc == 1)
return FromObj(self, objv[0]);
if (!(v = PyTuple_New(objc)))
return NULL;
for (i = 0; i < objc; i++) {
PyObject *s = FromObj(self, objv[i]);
if (!s || PyTuple_SetItem(v, i, s)) {
Py_DECREF(v);
return NULL;
} }
} }
return v;
}
if (PyTuple_Check(arg))
return SplitObj(arg);
if (!PyArg_ParseTuple(args, "et:split", "utf-8", &list)) if (!PyArg_ParseTuple(args, "et:split", "utf-8", &list))
return NULL; return NULL;
v = Split(list); v = Split(list);