[pypy-svn] r75972 - in pypy/branch/fast-ctypes/pypy: module/jitffi rlib rlib/test
Maciej Fijalkowski
fijall at gmail.com
Thu Jul 8 08:45:57 CEST 2010
That's wrong. It's useless boxing. Instead you should have a different
way of passing (like push_result_int) on a caller that would wrap it.
On Wed, Jul 7, 2010 at 3:47 PM, <getxsick at codespeak.net> wrote:
> Author: getxsick
> Date: Wed Jul 7 15:47:30 2010
> New Revision: 75972
>
> Modified:
> pypy/branch/fast-ctypes/pypy/module/jitffi/interp_jitffi.py
> pypy/branch/fast-ctypes/pypy/rlib/rjitffi.py
> pypy/branch/fast-ctypes/pypy/rlib/test/test_rjitffi.py
> Log:
> return results as objects of Return subclasses to be more RPython
>
>
> Modified: pypy/branch/fast-ctypes/pypy/module/jitffi/interp_jitffi.py
> ==============================================================================
> --- pypy/branch/fast-ctypes/pypy/module/jitffi/interp_jitffi.py (original)
> +++ pypy/branch/fast-ctypes/pypy/module/jitffi/interp_jitffi.py Wed Jul 7 15:47:30 2010
> @@ -68,9 +68,7 @@
> self.rget = rjitffi._Get(cpu, lib, func, args_type, res_type)
>
> def call_w(self, space, w_args=None):
> - if space.is_w(w_args, space.w_None):
> - return space.wrap(self.rget.call())
> - else:
> + if not space.is_w(w_args, space.w_None):
> i = 0
> w_iterator = space.iter(w_args)
> while True:
> @@ -93,7 +91,8 @@
> space.wrap('Unsupported type of argument: %s'
> % self.args_type[0]))
> i += 1
> - return space.wrap(self.rget.call())
> + res = self.rget.call()
> + return space.wrap(res.value)
>
> def W_Get___new__(space, w_type, cpu, lib, func, args_type, res_type):
> try:
>
> Modified: pypy/branch/fast-ctypes/pypy/rlib/rjitffi.py
> ==============================================================================
> --- pypy/branch/fast-ctypes/pypy/rlib/rjitffi.py (original)
> +++ pypy/branch/fast-ctypes/pypy/rlib/rjitffi.py Wed Jul 7 15:47:30 2010
> @@ -102,18 +102,18 @@
> res = self.cpu.execute_token(self.looptoken)
>
> if self.res_type == 'i':
> - r = self.cpu.get_latest_value_int(0)
> + r = ReturnInt(self.cpu.get_latest_value_int(0))
> elif self.res_type == 'f':
> - r = self.cpu.get_latest_value_float(0)
> + r = ReturnFloat(self.cpu.get_latest_value_float(0))
> elif self.res_type == 'p':
> - r = self.cpu.get_latest_value_ref(0)
> + r = ReturnPtr(self.cpu.get_latest_value_ref(0))
> elif self.res_type == 'v':
> - r = None
> + r = ReturnNone(None)
> else:
> raise ValueError(self.res_type)
>
> self.setup_stack() # clean up the stack
> - return r # XXX can't return various types
> + return r
>
> def setup_stack(self):
> self.esp = 0
> @@ -140,3 +140,19 @@
> self.args_type = args_type
> self.res_type = res_type
> self.looptoken = looptoken
> +
> +class Return(object):
> + def __init__(self, value):
> + self.value = value
> +
> +class ReturnInt(Return):
> + pass
> +
> +class ReturnFloat(Return):
> + pass
> +
> +class ReturnPtr(Return):
> + pass
> +
> +class ReturnNone(Return):
> + pass
>
> Modified: pypy/branch/fast-ctypes/pypy/rlib/test/test_rjitffi.py
> ==============================================================================
> --- pypy/branch/fast-ctypes/pypy/rlib/test/test_rjitffi.py (original)
> +++ pypy/branch/fast-ctypes/pypy/rlib/test/test_rjitffi.py Wed Jul 7 15:47:30 2010
> @@ -71,44 +71,44 @@
> func = lib.get('add_integers', ['i', 'i'], 'i')
> func.push_int(1)
> func.push_int(2)
> - assert func.call() == 3
> + assert func.call().value == 3
>
> func = lib.get('add_integers', ['i', 'i'], 'i')
> func.push_int(-1)
> func.push_int(2)
> - assert func.call() == 1
> + assert func.call().value == 1
>
> func = lib.get('add_integers', ['i', 'i'], 'i')
> func.push_int(0)
> func.push_int(0)
> - assert func.call() == 0
> + assert func.call().value == 0
>
> func = lib.get('max3', ['i', 'i', 'i'], 'i')
> func.push_int(2)
> func.push_int(8)
> func.push_int(3)
> - assert func.call() == 8
> + assert func.call().value == 8
>
> func = lib.get('add_floats', ['f', 'f'], 'f')
> func.push_float(1.2)
> func.push_float(1.5)
> - assert func.call() == 2.7
> + assert func.call().value == 2.7
>
> def test_get_void(self):
> lib = rjitffi.CDLL(self.lib_name)
>
> func = lib.get('fvoid', [], 'i')
> - assert func.call() == 1
> + assert func.call().value == 1
>
> func = lib.get('return_void', ['i', 'i'], 'v')
> func.push_int(1)
> func.push_int(2)
> - assert func.call() is None
> + assert func.call().value is None
>
> func = lib.get('return_void', ['i', 'i'])
> func.push_int(1)
> func.push_int(2)
> - assert func.call() is None
> + assert func.call().value is None
>
> def test_various_type_args(self):
> lib = rjitffi.CDLL(self.lib_name)
> @@ -116,12 +116,12 @@
> func = lib.get('add_intfloat', ['i', 'f'], 'i')
> func.push_int(1)
> func.push_float(2.9)
> - assert func.call() == 3
> + assert func.call().value == 3
>
> # stack is cleaned up after calling
> func.push_int(0)
> func.push_float(1.3)
> - assert func.call() == 1
> + assert func.call().value == 1
>
> def test_undefined_func(self):
> lib = rjitffi.CDLL(self.lib_name)
> _______________________________________________
> pypy-svn mailing list
> pypy-svn at codespeak.net
> http://codespeak.net/mailman/listinfo/pypy-svn
>
More information about the Pypy-commit
mailing list