[pypy-commit] pypy py3k: bah, we need to recursively convert strings to unicode also inside constant tuples

antocuni noreply at buildbot.pypy.org
Wed Jul 18 23:17:03 CEST 2012


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: py3k
Changeset: r56202:658eb1045b20
Date: 2012-07-18 23:16 +0200
http://bitbucket.org/pypy/pypy/changeset/658eb1045b20/

Log:	bah, we need to recursively convert strings to unicode also inside
	constant tuples

diff --git a/pypy/tool/sourcetools.py b/pypy/tool/sourcetools.py
--- a/pypy/tool/sourcetools.py
+++ b/pypy/tool/sourcetools.py
@@ -270,6 +270,15 @@
         firstlineno = -1
     return "(%s:%d)%s" % (mod or '?', firstlineno, name or 'UNKNOWN')
 
+
+def _convert_const_maybe(x, encoding):
+    if isinstance(x, str):
+        return x.decode(encoding)
+    elif isinstance(x, tuple):
+        items = [_convert_const_maybe(item, encoding) for item in x]
+        return tuple(items)
+    return x
+    
 def with_unicode_literals(fn=None, **kwds):
     encoding = kwds.pop('encoding', 'ascii')
     if kwds:
@@ -278,9 +287,7 @@
         co = fn.func_code
         new_consts = []
         for const in co.co_consts:
-            if isinstance(const, str):
-                const = const.decode(encoding)
-            new_consts.append(const)
+            new_consts.append(_convert_const_maybe(const, encoding))
         new_consts = tuple(new_consts)
         new_code = types.CodeType(co.co_argcount, co.co_nlocals, co.co_stacksize,
                                   co.co_flags, co.co_code, new_consts, co.co_names,
diff --git a/pypy/tool/test/test_sourcetools.py b/pypy/tool/test/test_sourcetools.py
--- a/pypy/tool/test/test_sourcetools.py
+++ b/pypy/tool/test/test_sourcetools.py
@@ -57,3 +57,9 @@
     def foo():
         return 'hello &#224;&#232;&#236;'
     assert foo() == u'hello &#224;&#232;&#236;'
+    #
+    @with_unicode_literals
+    def foo():
+        return ('a', 'b')
+    assert type(foo()[0]) is unicode
+


More information about the pypy-commit mailing list