Author: Raffael Tfirst <raffael.tfi...@gmail.com>
Branch: py3.5-async
Changeset: r86156:ab59452c8103
Date: 2016-08-11 19:29 +0200
http://bitbucket.org/pypy/pypy/changeset/ab59452c8103/

Log:    Fix and rename test_crap_after_starargs (allowed in PEP 448), dirty
        fix in function calls if argument order is reversed (happens if
        stararg occurs after kwarg)

diff --git a/pypy/interpreter/astcompiler/test/test_compiler.py 
b/pypy/interpreter/astcompiler/test/test_compiler.py
--- a/pypy/interpreter/astcompiler/test/test_compiler.py
+++ b/pypy/interpreter/astcompiler/test/test_compiler.py
@@ -779,9 +779,19 @@
         py.test.raises(SyntaxError, self.simple_test, "int(base=10, '2')",
                        None, None)
 
-    def test_crap_after_starargs(self):
-        source = "call(*args, *args)"
-        py.test.raises(SyntaxError, self.simple_test, source, None, None)
+    def test_starargs_after_starargs(self):
+        #allowed since PEP 448 "Additional Unpacking Generalizations"
+        source = py.code.Source("""
+        def call(*arg):
+            ret = []
+            for i in arg:
+                ret.append(i)
+            return ret
+        
+        args = [4,5,6]
+        res = call(*args, *args)
+        """)
+        self.simple_test(source, 'res', [4,5,6,4,5,6])
 
     def test_not_a_name(self):
         source = "call(a, b, c, 3=3)"
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -1214,6 +1214,14 @@
                     break
                 w_value = self.popvalue()
                 w_key = self.popvalue()
+                # temporary (dirty) fix: if star-arg occurs after kwarg,
+                # arg order is reversed on stack
+                from pypy.objspace.std.listobject import W_ListObject
+                if isinstance(w_key, W_ListObject):
+                    w_key_temp = w_key
+                    w_key = w_value
+                    w_value = w_star
+                    w_star = w_key_temp
                 key = self.space.identifier_w(w_key)
                 keywords[n_keywords] = key
                 keywords_w[n_keywords] = w_value
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to