diff mercurial/__init__.py @ 30051:3139ec39b505

py3: handle multiple arguments in .encode() and .decode() There is a case and more can be present where these functions have multiple arguments. Our transformer used to handle the first argument, so added a loop to handle more arguments if present.
author Pulkit Goyal <7895pulkit@gmail.com>
date Fri, 07 Oct 2016 14:04:49 +0200
parents 178c89e8519a
children eaaedad68011
line wrap: on
line diff
--- a/mercurial/__init__.py	Fri Oct 07 12:13:28 2016 +0200
+++ b/mercurial/__init__.py	Fri Oct 07 14:04:49 2016 +0200
@@ -278,21 +278,30 @@
                 # .encode() and .decode() on str/bytes/unicode don't accept
                 # byte strings on Python 3. Rewrite the token to include the
                 # unicode literal prefix so the string transformer above doesn't
-                # add the byte prefix.
+                # add the byte prefix. The loop helps in handling multiple
+                # arguments.
                 if (fn in ('encode', 'decode') and
                     prevtoken.type == token.OP and prevtoken.string == '.'):
                     # (OP, '.')
                     # (NAME, 'encode')
                     # (OP, '(')
+                    # [(VARIABLE, encoding)]
+                    # [(OP, '.')]
+                    # [(VARIABLE, encoding)]
+                    # [(OP, ',')]
                     # (STRING, 'utf-8')
                     # (OP, ')')
+                    j = i
                     try:
-                        st = tokens[i + 2]
-                        if (st.type == token.STRING and
-                            st.string[0] in ("'", '"')):
-                            rt = tokenize.TokenInfo(st.type, 'u%s' % st.string,
+                        while (tokens[j + 1].string in ('(', ',', '.')):
+                            st = tokens[j + 2]
+                            if (st.type == token.STRING and
+                                st.string[0] in ("'", '"')):
+                                rt = tokenize.TokenInfo(st.type,
+                                                    'u%s' % st.string,
                                                     st.start, st.end, st.line)
-                            tokens[i + 2] = rt
+                                tokens[j + 2] = rt
+                            j = j + 2
                     except IndexError:
                         pass
 
@@ -303,7 +312,7 @@
     # ``replacetoken`` or any mechanism that changes semantics of module
     # loading is changed. Otherwise cached bytecode may get loaded without
     # the new transformation mechanisms applied.
-    BYTECODEHEADER = b'HG\x00\x02'
+    BYTECODEHEADER = b'HG\x00\x03'
 
     class hgloader(importlib.machinery.SourceFileLoader):
         """Custom module loader that transforms source code.