[pypy-svn] r8844 - pypy/dist/pypy/translator
tismer at codespeak.net
tismer at codespeak.net
Fri Feb 4 13:43:47 CET 2005
Author: tismer
Date: Thu Feb 3 20:55:37 2005
New Revision: 8844
Modified:
pypy/dist/pypy/translator/geninterplevel.py
Log:
changed geninterpreterlevel to use the nice new __args__ interface.
Modified: pypy/dist/pypy/translator/geninterplevel.py
==============================================================================
--- pypy/dist/pypy/translator/geninterplevel.py (original)
+++ pypy/dist/pypy/translator/geninterplevel.py Thu Feb 3 20:55:37 2005
@@ -14,7 +14,7 @@
But I need to ask how we want to integrate it.
XXX open questions:
-- do we wantamoduleperapp-spaceoperation?
+- do we want a moduleperapp-spaceoperation?
- do we want to auto-generate stuff?
- do we want to create code that is more similar to the app code?
- do we want to create specialized code for constants?
@@ -30,7 +30,7 @@
from pypy.objspace.flow.model import last_exception, last_exc_value
from pypy.objspace.flow.model import traverse, uniqueitems, checkgraph
from pypy.translator.simplify import remove_direct_loops
-from pypy.interpreter.pycode import CO_VARARGS
+from pypy.interpreter.pycode import CO_VARARGS, CO_VARKEYWORDS
from pypy.annotation import model as annmodel
from types import FunctionType, CodeType
from pypy.interpreter.error import OperationError
@@ -851,69 +851,63 @@
localnames = [self.expr(a, locals) for a in uniqueitems(localslst)]
# collect all the arguments
+ vararg = varkw = None
+ varargname = varkwname = None
+ all_args = graph.getargs()
+ p = len(all_args)
+ if func.func_code.co_flags & CO_VARKEYWORDS:
+ p -= 1
+ varkw = graph.getargs()[p]
+ varkwname = func.func_code.co_varnames[p]
if func.func_code.co_flags & CO_VARARGS:
- vararg = graph.getargs()[-1]
- positional_args = graph.getargs()[:-1]
- else:
- vararg = None
- positional_args = graph.getargs()
- min_number_of_args = len(positional_args) - len(name_of_defaults)
+ p -= 1
+ vararg = graph.getargs()[p]
+ varargname = func.func_code.co_varnames[p]
+ positional_args = all_args[:p]
fast_args = [self.expr(a, locals) for a in positional_args]
if vararg is not None:
fast_args.append(self.expr(vararg, locals))
+ if varkw is not None:
+ fast_args.append(self.expr(varkw, locals))
fast_name = 'fast' + f_name
fast_set = dict(zip(fast_args, fast_args))
# create function declaration
name = self.trans_funcname(func.__name__) # for <lambda>
- argstr = ", ".join(fast_args)
- fast_function_header = ('def %s(space, %s):'
+ argstr = ", ".join(['space'] + fast_args)
+ fast_function_header = ('def %s(%s):'
% (name, argstr))
- print >> f, 'def %s(space, *args_w):' % (name,)
+ print >> f, 'def %s(space, __args__):' % (name,)
if docstr is not None:
print >> f, docstr
- kwlist = ['"%s"' % var for var in
- func.func_code.co_varnames[:func.func_code.co_argcount]]
- print >> f, ' kwlist = [%s]' % (', '.join(kwlist),)
-
- # argument unpacking
- if vararg is not None:
- varname = self.expr(vararg, locals)
- lenargs = len(positional_args)
- print >> f, ' %s = space.newtuple(list(args_w[%d:]))' % (
- varname, lenargs)
- print >> f, ' _args_w = args_w[:%d]' % (lenargs,)
- else:
- print >> f, ' _args_w = args_w'
- varname = None
-
+ print >> f
def tupstr(seq):
if len(seq) == 1:
fmt = '%s,'
else:
fmt = '%s'
return fmt % ', '.join(seq)
+ def tupassstr(seq):
+ if not seq:
+ return ""
+ else:
+ return tupstr(seq) + " = "
- print >> f, ' defaults_w = (%s)' % tupstr(name_of_defaults)
-
- theargs = [arg for arg in fast_args if arg != varname]
- txt = inspect.getsource(PyArg_ParseMini) + ('\n'
- 'm.PyArg_ParseMini = PyArg_ParseMini\n'
- 'from pypy.interpreter.error import OperationError\n'
- 'm.OperationError = OperationError')
- self.initcode.append(txt)
print >> f, ' funcname = "%s"' % func.__name__
- if theargs:
- txt = ' %s = PyArg_ParseMini(space, funcname, %d, %d, _args_w, defaults_w)'
- print >>f, txt % (tupstr(theargs),
- min_number_of_args, len(positional_args))
- else:
- txt = ' PyArg_ParseMini(space, funcname, %d, %d, _args_w, defaults_w)'
- print >>f, txt % (min_number_of_args, len(positional_args))
- print >> f, ' return %s(space, %s)' % (fast_name, ', '.join(fast_args))
+
+ kwlist = list(func.func_code.co_varnames[:func.func_code.co_argcount])
+ signature = ' signature = %r' % kwlist
+ signature = ", ".join([signature, repr(varargname), repr(varkwname)])
+ print >> f, signature
+
+ print >> f, ' def_w = [%s]' % ", ".join(name_of_defaults)
+
+ print >> f, ' %s__args__.parse(funcname, signature, def_w)' % (
+ tupassstr(fast_args),)
+ print >> f, ' return %s(%s)' % (fast_name, ', '.join(["space"]+fast_args))
print >> f, '%s = globals().pop("%s")' % (f_name, name)
print >> f
@@ -1340,3 +1334,11 @@
t = Translator(test, verbose=False, simplifying=True)
gen = GenRpy(t)
gen.gen_source("/tmp/look2.py")
+
+##>>> def f_foo(space, __args__):
+##... signature = ["a", "b"], "args", "kwds"
+##... defaults_w = space.w_int(42) # is this the default for b?
+##... w_a, w_b, w_args, w_kwds = __args__.parse("foo", signature, defaults_w)
+##... return fastf_foo(w_a, w_b, w_args, w_kwds)
+##... # args/kwds can be None.
+##... # then I don't receive w_xxx for them as well.
More information about the Pypy-commit
mailing list