summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-08-22 17:42:05 +0300
committerSerhiy Storchaka <storchaka@gmail.com>2013-08-22 17:42:05 +0300
commit62760ddbe47f6a88518d9e4acb63fb7b2883f6e5 (patch)
tree2f38bd49c64a14b7d72415bf146224b181c8fd9d
parentea6f47c2b99407c0549b2f60886958329bcc6881 (diff)
parentc4cfffe6b6ff55f45a3c81bac8fb9cee25c531a5 (diff)
downloadcpython-62760ddbe47f6a88518d9e4acb63fb7b2883f6e5.tar.gz
Issue #16809: Tkinter's splitlist() and split() methods now accept Tcl_Obj
argument. This is needed for support Tcl/Tk 8.6.
-rw-r--r--Lib/test/test_tcl.py4
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_tkinter.c65
3 files changed, 60 insertions, 12 deletions
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py
index 91d324dcd3..4e52fd4882 100644
--- 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,)),
+ (1, '\u20ac', '\u20ac', (3.4,))),
]
for arg, res in testcases:
self.assertEqual(splitlist(arg), res, msg=arg)
@@ -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,)),
+ (12, '\u20ac', '\u20ac', (3.4,))),
]
for arg, res in testcases:
self.assertEqual(split(arg), res, msg=arg)
diff --git a/Misc/NEWS b/Misc/NEWS
index 0988f625c5..552ae83a84 100644
--- 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
+ argument.
+
- Issue #18324: set_payload now correctly handles binary input. This also
supersedes the previous fixes for #14360, #1717, and #16564.
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index c6f63ac888..9a0db0e9ff 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -1757,16 +1757,35 @@ Tkapp_SplitList(PyObject *self, PyObject *args)
char *list;
int argc;
char **argv;
- PyObject *v;
+ PyObject *arg, *v;
int i;
- if (PyTuple_Size(args) == 1) {
- v = PyTuple_GetItem(args, 0);
- if (PyTuple_Check(v)) {
- Py_INCREF(v);
- return v;
+ if (!PyArg_ParseTuple(args, "O:splitlist", &arg))
+ return NULL;
+ if (PyTclObject_Check(arg)) {
+ 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;
}
+ if (PyTuple_Check(arg)) {
+ Py_INCREF(arg);
+ return arg;
+ }
+
if (!PyArg_ParseTuple(args, "et:splitlist", "utf-8", &list))
return NULL;
@@ -1797,16 +1816,38 @@ Tkapp_SplitList(PyObject *self, PyObject *args)
static PyObject *
Tkapp_Split(PyObject *self, PyObject *args)
{
- PyObject *v;
+ PyObject *arg, *v;
char *list;
- if (PyTuple_Size(args) == 1) {
- PyObject* o = PyTuple_GetItem(args, 0);
- if (PyTuple_Check(o)) {
- o = SplitObj(o);
- return o;
+ if (!PyArg_ParseTuple(args, "O:split", &arg))
+ return NULL;
+ if (PyTclObject_Check(arg)) {
+ Tcl_Obj *value = ((PyTclObject*)arg)->value;
+ 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))
return NULL;
v = Split(list);