summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-09-23 20:20:07 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2013-09-23 20:20:07 (GMT)
commit369606df2f9235e8e9bce1feabf1ac48c889f8d5 (patch)
tree14947a537f0f6f04f94f9673398d3f1d7a6b024a
parent587b30571d8dff63f602ac303659988d7c2ddea3 (diff)
downloadcpython-369606df2f9235e8e9bce1feabf1ac48c889f8d5.zip
cpython-369606df2f9235e8e9bce1feabf1ac48c889f8d5.tar.gz
cpython-369606df2f9235e8e9bce1feabf1ac48c889f8d5.tar.bz2
Issue #19028: Fixed tkinter.Tkapp.merge() for non-string arguments.
-rw-r--r--Lib/test/test_tcl.py31
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/_tkinter.c15
3 files changed, 36 insertions, 12 deletions
diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py
index cf717d8..2cdac2b 100644
--- a/Lib/test/test_tcl.py
+++ b/Lib/test/test_tcl.py
@@ -254,6 +254,37 @@ class TclTest(unittest.TestCase):
for arg, res in testcases:
self.assertEqual(split(arg), res, msg=arg)
+ def test_merge(self):
+ with support.check_warnings(('merge is deprecated',
+ DeprecationWarning)):
+ merge = self.interp.tk.merge
+ call = self.interp.tk.call
+ testcases = [
+ ((), ''),
+ (('a',), 'a'),
+ ((2,), '2'),
+ (('',), '{}'),
+ ('{', '\\{'),
+ (('a', 'b', 'c'), 'a b c'),
+ ((' ', '\t', '\r', '\n'), '{ } {\t} {\r} {\n}'),
+ (('a', ' ', 'c'), 'a { } c'),
+ (('a', '€'), 'a €'),
+ (('a', '\U000104a2'), 'a \U000104a2'),
+ (('a', b'\xe2\x82\xac'), 'a €'),
+ (('a', ('b', 'c')), 'a {b c}'),
+ (('a', 2), 'a 2'),
+ (('a', 3.4), 'a 3.4'),
+ (('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 € € 3.4}'),
+ ]
+ for args, res in testcases:
+ self.assertEqual(merge(*args), res, msg=args)
+ self.assertRaises(UnicodeDecodeError, merge, b'\x80')
+ self.assertRaises(UnicodeEncodeError, merge, '\udc80')
+
class BigmemTclTest(unittest.TestCase):
diff --git a/Misc/NEWS b/Misc/NEWS
index c3d9e9e..3b232f2 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -68,6 +68,8 @@ Core and Builtins
Library
-------
+- Issue #19028: Fixed tkinter.Tkapp.merge() for non-string arguments.
+
- Issue #3015: Fixed tkinter with wantobject=False. Any Tcl command call
returned empty string.
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 1350ff5..ecad541 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -331,17 +331,8 @@ AsString(PyObject *value, PyObject *tmp)
{
if (PyBytes_Check(value))
return PyBytes_AsString(value);
- else if (PyUnicode_Check(value)) {
- PyObject *v = PyUnicode_AsUTF8String(value);
- if (v == NULL)
- return NULL;
- if (PyList_Append(tmp, v) != 0) {
- Py_DECREF(v);
- return NULL;
- }
- Py_DECREF(v);
- return PyBytes_AsString(v);
- }
+ else if (PyUnicode_Check(value))
+ return PyUnicode_AsUTF8(value);
else {
PyObject *v = PyObject_Str(value);
if (v == NULL)
@@ -351,7 +342,7 @@ AsString(PyObject *value, PyObject *tmp)
return NULL;
}
Py_DECREF(v);
- return PyBytes_AsString(v);
+ return PyUnicode_AsUTF8(v);
}
}