Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r86674:35fc02e01bf7 Date: 2016-08-29 10:42 +0200 http://bitbucket.org/pypy/pypy/changeset/35fc02e01bf7/
Log: Test and fix (and remove the temporary dirty fix which only works if there is a list object around) diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py --- a/pypy/interpreter/pyopcode.py +++ b/pypy/interpreter/pyopcode.py @@ -1198,7 +1198,7 @@ self.settopvalue(self.space.w_None) @jit.unroll_safe - def call_function(self, oparg, w_star=None, w_starstar=None): + def call_function(self, oparg, w_starstar=None, has_vararg=False): n_arguments = oparg & 0xff n_keywords = (oparg>>8) & 0xff if n_keywords: @@ -1210,20 +1210,16 @@ 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 else: keywords = None keywords_w = None + if has_vararg: + w_star = self.popvalue() + else: + w_star = None arguments = self.popvalues(n_arguments) args = self.argument_factory(arguments, keywords, keywords_w, w_star, w_starstar) @@ -1252,17 +1248,15 @@ self.call_function(oparg) def CALL_FUNCTION_VAR(self, oparg, next_instr): - w_varargs = self.popvalue() - self.call_function(oparg, w_varargs) + self.call_function(oparg, has_vararg=True) def CALL_FUNCTION_KW(self, oparg, next_instr): w_varkw = self.popvalue() - self.call_function(oparg, None, w_varkw) + self.call_function(oparg, w_varkw) def CALL_FUNCTION_VAR_KW(self, oparg, next_instr): w_varkw = self.popvalue() - w_varargs = self.popvalue() - self.call_function(oparg, w_varargs, w_varkw) + self.call_function(oparg, w_varkw, has_vararg=True) @jit.unroll_safe def _make_function(self, oparg, freevars=None): diff --git a/pypy/interpreter/test/test_interpreter.py b/pypy/interpreter/test/test_interpreter.py --- a/pypy/interpreter/test/test_interpreter.py +++ b/pypy/interpreter/test/test_interpreter.py @@ -214,6 +214,15 @@ assert self.codetest(code, 'g', [12, {}]) == () assert self.codetest(code, 'g', [12, {3:1}]) == (3,) + def test_star_arg_after_keyword_arg(self): + code = ''' + def f(a, b): + return a - b + def g(a, b): + return f(b=b, *(a,)) + ''' + assert self.codetest(code, 'g', [40, 2]) == 38 + def test_closure(self): code = ''' def f(x, y): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit