[pypy-commit] pypy py3.3: Add method TkApp.merge()

amauryfa noreply at buildbot.pypy.org
Sun Dec 14 19:42:22 CET 2014


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: py3.3
Changeset: r74923:97d75d169b30
Date: 2014-10-30 22:18 +0100
http://bitbucket.org/pypy/pypy/changeset/97d75d169b30/

Log:	Add method TkApp.merge()

diff --git a/lib_pypy/_tkinter/app.py b/lib_pypy/_tkinter/app.py
--- a/lib_pypy/_tkinter/app.py
+++ b/lib_pypy/_tkinter/app.py
@@ -8,6 +8,7 @@
 import sys
 import threading
 import time
+import warnings
 
 
 class _DummyLock(object):
@@ -326,7 +327,7 @@
             if res == tklib.TCL_ERROR:
                 self.raiseTclError()
             result = tkffi.string(tklib.Tcl_GetStringResult(self.interp))
-            return result.decode('utf-8')
+            return FromTclString(result)
 
     def evalfile(self, filename):
         self._check_tcl_appartment()
@@ -335,7 +336,7 @@
             if res == tklib.TCL_ERROR:
                 self.raiseTclError()
             result = tkffi.string(tklib.Tcl_GetStringResult(self.interp))
-            return result.decode('utf-8')
+            return FromTclString(result)
 
     def split(self, arg):
         if isinstance(arg, TclObject):
@@ -435,6 +436,32 @@
         finally:
             tklib.Tcl_Free(argv[0])
 
+    def merge(self, *args):
+        warnings.warn("merge is deprecated and will be removed in 3.4",
+                      DeprecationWarning)
+        s = self._merge(args)
+        return s.decode('utf-8')
+
+    def _merge(self, args):
+        argv = []
+        for arg in args:
+            if isinstance(arg, tuple):
+                argv.append(self._merge(arg))
+            elif arg is None:
+                break
+            elif isinstance(arg, bytes):
+                argv.append(arg)
+            else:
+                argv.append(str(arg).encode('utf-8'))
+        argv_array = [tkffi.new("char[]", arg) for arg in argv]
+        res = tklib.Tcl_Merge(len(argv), argv_array)
+        if not res:
+            raise TclError("merge failed")
+        try:
+            return tkffi.string(res)
+        finally:
+            tklib.Tcl_Free(res)
+
     def getboolean(self, s):
         if isinstance(s, int):
             return s
diff --git a/lib_pypy/_tkinter/tclobj.py b/lib_pypy/_tkinter/tclobj.py
--- a/lib_pypy/_tkinter/tclobj.py
+++ b/lib_pypy/_tkinter/tclobj.py
@@ -19,7 +19,7 @@
     except UnicodeDecodeError:
         # Tcl encodes null character as \xc0\x80
         try:
-            return s.replace('\xc0\x80', '\x00').decode('utf-8')
+            return s.replace(b'\xc0\x80', b'\x00').decode('utf-8')
         except UnicodeDecodeError:
             pass
     return s
diff --git a/lib_pypy/_tkinter/tklib.py b/lib_pypy/_tkinter/tklib.py
--- a/lib_pypy/_tkinter/tklib.py
+++ b/lib_pypy/_tkinter/tklib.py
@@ -89,6 +89,7 @@
 int Tcl_ListObjLength(Tcl_Interp* interp, Tcl_Obj* listPtr, int* intPtr);
 int Tcl_ListObjIndex(Tcl_Interp* interp, Tcl_Obj* listPtr, int index, Tcl_Obj** objPtrPtr);
 int Tcl_SplitList(Tcl_Interp* interp, char* list, int* argcPtr, const char*** argvPtr);
+char* Tcl_Merge(int argc, char** argv);
 
 int Tcl_Eval(Tcl_Interp* interp, const char* script);
 int Tcl_EvalFile(Tcl_Interp* interp, const char* filename);


More information about the pypy-commit mailing list