[pypy-commit] pypy py3.6: Issue #2996 (argument parsing issue)
arigo
pypy.commits at gmail.com
Mon Apr 22 06:23:48 EDT 2019
Author: Armin Rigo <arigo at tunes.org>
Branch: py3.6
Changeset: r96533:bdfe0ecd439b
Date: 2019-04-22 12:23 +0200
http://bitbucket.org/pypy/pypy/changeset/bdfe0ecd439b/
Log: Issue #2996 (argument parsing issue)
Test and fix
diff --git a/pypy/interpreter/argument.py b/pypy/interpreter/argument.py
--- a/pypy/interpreter/argument.py
+++ b/pypy/interpreter/argument.py
@@ -180,14 +180,17 @@
too_many_args = False
# put the special w_firstarg into the scope, if it exists
+ upfront = 0
+ args_w = self.arguments_w
if w_firstarg is not None:
- upfront = 1
if co_argcount > 0:
scope_w[0] = w_firstarg
- else:
- upfront = 0
+ upfront = 1
+ else:
+ # ugh, this is a call to a method 'def meth(*args)', maybe
+ # (see test_issue2996_*). Fall-back solution...
+ args_w = [w_firstarg] + args_w
- args_w = self.arguments_w
num_args = len(args_w)
avail = num_args + upfront
@@ -210,11 +213,8 @@
# collect extra positional arguments into the *vararg
if signature.has_vararg():
args_left = co_argcount - upfront
- if args_left < 0: # check required by rpython
- starargs_w = [w_firstarg]
- if num_args:
- starargs_w = starargs_w + args_w
- elif num_args > args_left:
+ assert args_left >= 0 # check required by rpython
+ if num_args > args_left:
starargs_w = args_w[args_left:]
else:
starargs_w = []
diff --git a/pypy/interpreter/test/test_argument.py b/pypy/interpreter/test/test_argument.py
--- a/pypy/interpreter/test/test_argument.py
+++ b/pypy/interpreter/test/test_argument.py
@@ -923,3 +923,18 @@
def test(**kwargs):
return kwargs
assert test(**q) == {"foo": "bar"}
+
+ def test_issue2996_1(self): """
+ class Class:
+ def method(*args, a_parameter=None, **kwargs):
+ pass
+ Class().method(**{'a_parameter': 4})
+ """
+
+ def test_issue2996_2(self): """
+ class Foo:
+ def methhh(*args, offset=42):
+ return args, offset
+ foo = Foo()
+ assert foo.methhh(**{}) == ((foo,), 42)
+ """
More information about the pypy-commit
mailing list