[pypy-svn] r45980 - in pypy/branch/pypy-more-rtti-inprogress/rpython: . module test
pedronis at codespeak.net
pedronis at codespeak.net
Sat Aug 25 13:58:21 CEST 2007
Author: pedronis
Date: Sat Aug 25 13:58:18 2007
New Revision: 45980
Modified:
pypy/branch/pypy-more-rtti-inprogress/rpython/extfunc.py
pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_os.py
pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_time.py
pypy/branch/pypy-more-rtti-inprogress/rpython/test/test_extfuncregister.py
Log:
support an idiom such that in the best case the original function needs to specified only in the @registering decorator
Modified: pypy/branch/pypy-more-rtti-inprogress/rpython/extfunc.py
==============================================================================
--- pypy/branch/pypy-more-rtti-inprogress/rpython/extfunc.py (original)
+++ pypy/branch/pypy-more-rtti-inprogress/rpython/extfunc.py Sat Aug 25 13:58:18 2007
@@ -7,6 +7,12 @@
import py, sys
+class extdef(object):
+
+ def __init__(self, *args, **kwds):
+ self.def_args = args
+ self.def_kwds = kwds
+
def lazy_register(func_or_list, register_func):
""" Lazily register external function. Will create a function,
which explodes when llinterpd/translated, but does not explode
@@ -17,7 +23,14 @@
else:
funcs = [func_or_list]
try:
- return register_func()
+ val = register_func()
+ if isinstance(val, extdef):
+ assert len(funcs) == 1
+ register_external(funcs[0], *val.def_args, **val.def_kwds)
+ return
+ return val
+ except (SystemExit, MemoryError, KeyboardInterrupt), e:
+ raise
except:
exc, exc_inst, tb = sys.exc_info()
for func in funcs:
Modified: pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_os.py
==============================================================================
--- pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_os.py (original)
+++ pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_os.py Sat Aug 25 13:58:18 2007
@@ -11,7 +11,7 @@
from pypy.tool.sourcetools import func_with_new_name
from pypy.rlib.rarithmetic import r_longlong
from pypy.rpython.extfunc import BaseLazyRegistering
-from pypy.rpython.extfunc import registering, registering_if
+from pypy.rpython.extfunc import registering, registering_if, extdef
from pypy.annotation.model import SomeInteger, SomeString, SomeTuple, SomeFloat
from pypy.annotation.model import s_ImpossibleValue, s_None, s_Bool
from pypy.rpython.lltypesystem import rffi
@@ -26,7 +26,7 @@
pass # XXX <arigo> fijal: why do I need this?
# a simple, yet usefull factory
- def register_os_function_returning_int(self, fun, name, **kwds):
+ def extdef_for__os_function_returning_int(self, name, **kwds):
c_func = rffi.llexternal(name, [], rffi.INT, **kwds)
def c_func_llimpl():
res = c_func()
@@ -35,7 +35,7 @@
return res
c_func_llimpl.func_name = name + '_llimpl'
- self.register(fun, [], int, llimpl=c_func_llimpl,
+ return extdef([], int, llimpl=c_func_llimpl,
export_name='ll_os.ll_os_' + name)
@registering_if(os, 'execv')
@@ -51,8 +51,8 @@
rffi.free_charp(l_path)
raise OSError(rffi.get_errno(), "execv failed")
- self.register(os.execv, [str, [str]], s_ImpossibleValue, llimpl=
- execv_llimpl, export_name="ll_os.ll_os_execv")
+ return extdef([str, [str]], s_ImpossibleValue, llimpl=execv_llimpl,
+ export_name="ll_os.ll_os_execv")
@registering_if(posix, 'spawnv')
def register_os_spawnv(self):
@@ -71,8 +71,8 @@
raise OSError(rffi.get_errno(), "os_spawnv failed")
return rffi.cast(lltype.Signed, childpid)
- self.register(os.spawnv, [int, str, [str]], int, llimpl=
- spawnv_llimpl, export_name="ll_os.ll_os_spawnv")
+ return extdef([int, str, [str]], int, llimpl=spawnv_llimpl,
+ export_name="ll_os.ll_os_spawnv")
@registering(os.dup)
def register_os_dup(self):
@@ -84,7 +84,7 @@
raise OSError(rffi.get_errno(), "dup failed")
return newfd
- self.register(os.dup, [int], int, llimpl=dup_llimpl,
+ return extdef([int], int, llimpl=dup_llimpl,
export_name="ll_os.ll_os_dup", oofakeimpl=os.dup)
@registering(os.dup2)
@@ -97,7 +97,7 @@
if error == -1:
raise OSError(rffi.get_errno(), "dup2 failed")
- self.register(os.dup2, [int, int], s_None, llimpl=dup2_llimpl,
+ return extdef([int, int], s_None, llimpl=dup2_llimpl,
export_name="ll_os.ll_os_dup2")
@registering(os.utime)
@@ -155,7 +155,7 @@
raise Exception("os.utime() arg 2 must be None or a tuple of "
"2 floats, got %s" % (s_times,))
- self.register(os.utime, os_utime_normalize_args, s_None,
+ return extdef(os_utime_normalize_args, s_None,
"ll_os.ll_os_utime",
llimpl=os_utime_llimpl)
@@ -170,7 +170,7 @@
raise OSError(rffi.get_errno(), "os_setsid failed")
return result
- self.register(os.setsid, [], int, export_name="ll_os.ll_os_setsid",
+ return extdef([], int, export_name="ll_os.ll_os_setsid",
llimpl=setsid_llimpl)
if False:
@@ -211,23 +211,23 @@
lltype.free(l_utsbuf, flavor='raw')
return retval
- self.register(os.uname, [], (str, str, str, str, str),
+ return extdef([], (str, str, str, str, str),
"ll_os.ll_uname", llimpl=uname_llimpl)
@registering(os.getuid)
def register_os_getuid(self):
- self.register_os_function_returning_int(os.getuid, 'getuid',
- includes=self.UNISTD_INCL)
+ return self.extdef_for_os_function_returning_int('getuid',
+ includes=self.UNISTD_INCL)
@registering(os.geteuid)
def register_os_geteuid(self):
- self.register_os_function_returning_int(os.geteuid, 'geteuid',
- includes=self.UNISTD_INCL)
+ return self.extdef_for_os_function_returning_int('geteuid',
+ includes=self.UNISTD_INCL)
@registering_if(os, 'getpid')
def register_os_getpid(self):
- self.register_os_function_returning_int(os.getpid, 'getpid',
- includes=self.UNISTD_INCL)
+ return self.extdef_for_os_function_returning_int('getpid',
+ includes=self.UNISTD_INCL)
@registering(os.open)
def register_os_open(self):
@@ -251,7 +251,7 @@
def os_open_oofakeimpl(o_path, flags, mode):
return os.open(o_path._str, flags, mode)
- self.register(os.open, [str, int, int], int, "ll_os.ll_os_open",
+ return extdef([str, int, int], int, "ll_os.ll_os_open",
llimpl=os_open_llimpl, oofakeimpl=os_open_oofakeimpl)
# ------------------------------- os.read -------------------------------
@@ -279,7 +279,7 @@
def os_read_oofakeimpl(fd, count):
return OOSupport.to_rstr(os.read(fd, count))
- self.register(os.read, [int, int], str, "ll_os.ll_os_read",
+ return extdef([int, int], str, "ll_os.ll_os_read",
llimpl=os_read_llimpl, oofakeimpl=os_read_oofakeimpl)
@registering(os.write)
@@ -305,7 +305,7 @@
def os_write_oofakeimpl(fd, data):
return os.write(fd, OOSupport.from_rstr(data))
- self.register(os.write, [int, str], SomeInteger(nonneg=True),
+ return extdef([int, str], SomeInteger(nonneg=True),
"ll_os.ll_os_write", llimpl=os_write_llimpl,
oofakeimpl=os_write_oofakeimpl)
@@ -318,7 +318,7 @@
if error == -1:
raise OSError(rffi.get_errno(), "close failed")
- self.register(os.close, [int], s_None, llimpl=close_llimpl,
+ return extdef([int], s_None, llimpl=close_llimpl,
export_name="ll_os.ll_os_close", oofakeimpl=os.close)
@registering(os.lseek)
@@ -364,7 +364,7 @@
res = os.lseek(fd, pos, how)
return r_longlong(res)
- self.register(os.lseek, [int, r_longlong, int],
+ return extdef([int, r_longlong, int],
r_longlong,
llimpl = lseek_llimpl,
export_name = "ll_os.ll_os_lseek",
@@ -381,7 +381,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_lseek failed")
- self.register(os.ftruncate, [int, r_longlong], s_None,
+ return extdef([int, r_longlong], s_None,
llimpl = ftruncate_llimpl,
export_name = "ll_os.ll_os_ftruncate")
@@ -401,7 +401,7 @@
def os_access_oofakeimpl(path, mode):
return os.access(OOSupport.from_rstr(path), mode)
- self.register(os.access, [str, int], s_Bool, llimpl=access_llimpl,
+ return extdef([str, int], s_Bool, llimpl=access_llimpl,
export_name="ll_os.ll_os_access",
oofakeimpl=os_access_oofakeimpl)
@@ -433,7 +433,7 @@
def os_getcwd_oofakeimpl():
return OOSupport.to_rstr(os.getcwd())
- self.register(os.getcwd, [], str,
+ return extdef([], str,
"ll_os.ll_os_getcwd", llimpl=os_getcwd_llimpl,
oofakeimpl=os_getcwd_oofakeimpl)
@@ -480,8 +480,7 @@
raise OSError(error, "os_readdir failed")
return result
- self.register(os.listdir,
- [str], # a single argument which is a str
+ return extdef([str], # a single argument which is a str
[str], # returns a list of strings
"ll_os.ll_os_listdir",
llimpl=os_listdir_llimpl)
@@ -506,7 +505,7 @@
raise OSError(rffi.get_errno(), "os_pipe failed")
return (read_fd, write_fd)
- self.register(os.pipe, [], (int, int),
+ return extdef([], (int, int),
"ll_os.ll_os_pipe",
llimpl=os_pipe_llimpl)
@@ -544,7 +543,7 @@
rffi.free_charp(l_path)
return result
- self.register(os.readlink, [str], str,
+ return extdef([str], str,
"ll_os.ll_os_readlink",
llimpl=os_readlink_llimpl)
@@ -580,7 +579,7 @@
return (rffi.cast(lltype.Signed, result),
rffi.cast(lltype.Signed, status))
- self.register(os.waitpid, [int, int], (int, int),
+ return extdef([int, int], (int, int),
"ll_os.ll_os_waitpid",
llimpl=os_waitpid_llimpl)
@@ -592,7 +591,7 @@
res = os_isatty(rffi.cast(rffi.INT, fd))
return res != 0
- self.register(os.isatty, [int], bool, llimpl=isatty_llimpl,
+ return extdef([int], bool, llimpl=isatty_llimpl,
export_name="ll_os.ll_os_isatty")
@registering(os.strerror)
@@ -605,7 +604,7 @@
raise ValueError("os_strerror failed")
return rffi.charp2str(res)
- self.register(os.strerror, [int], str, llimpl=strerror_llimpl,
+ return extdef([int], str, llimpl=strerror_llimpl,
export_name="ll_os.ll_os_strerror")
@registering(os.system)
@@ -618,7 +617,7 @@
rffi.free_charp(l_command)
return res
- self.register(os.system, [str], int, llimpl=system_llimpl,
+ return extdef([str], int, llimpl=system_llimpl,
export_name="ll_os.ll_os_system")
@registering(os.unlink)
@@ -632,7 +631,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_unlink failed")
- self.register(os.unlink, [str], s_None, llimpl=unlink_llimpl,
+ return extdef([str], s_None, llimpl=unlink_llimpl,
export_name="ll_os.ll_os_unlink")
@registering(os.chdir)
@@ -651,7 +650,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_chdir failed")
- self.register(os.chdir, [str], s_None, llimpl=chdir_llimpl,
+ return extdef([str], s_None, llimpl=chdir_llimpl,
export_name="ll_os.ll_os_chdir")
@registering(os.mkdir)
@@ -676,7 +675,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_mkdir failed")
- self.register(os.mkdir, [str]+arg2, s_None, llimpl=mkdir_llimpl,
+ return extdef([str]+arg2, s_None, llimpl=mkdir_llimpl,
export_name="ll_os.ll_os_mkdir")
@registering(os.rmdir)
@@ -695,7 +694,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_rmdir failed")
- self.register(os.rmdir, [str], s_None, llimpl=rmdir_llimpl,
+ return extdef([str], s_None, llimpl=rmdir_llimpl,
export_name="ll_os.ll_os_rmdir")
@registering(os.chmod)
@@ -716,7 +715,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_chmod failed")
- self.register(os.chmod, [str, int], s_None, llimpl=chmod_llimpl,
+ return extdef([str, int], s_None, llimpl=chmod_llimpl,
export_name="ll_os.ll_os_chmod")
@registering(os.rename)
@@ -733,7 +732,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_rename failed")
- self.register(os.rename, [str, str], s_None, llimpl=rename_llimpl,
+ return extdef([str, str], s_None, llimpl=rename_llimpl,
export_name="ll_os.ll_os_rename")
@registering(os.umask)
@@ -748,7 +747,7 @@
res = os_umask(rffi.cast(mode_t, fd))
return rffi.cast(lltype.Signed, res)
- self.register(os.umask, [int], int, llimpl=umask_llimpl,
+ return extdef([int], int, llimpl=umask_llimpl,
export_name="ll_os.ll_os_umask")
@registering_if(os, 'kill')
@@ -763,7 +762,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_kill failed")
- self.register(os.kill, [int, int], s_None, llimpl=kill_llimpl,
+ return extdef([int, int], s_None, llimpl=kill_llimpl,
export_name="ll_os.ll_os_kill")
@registering_if(os, 'link')
@@ -781,7 +780,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_link failed")
- self.register(os.link, [str, str], s_None, llimpl=link_llimpl,
+ return extdef([str, str], s_None, llimpl=link_llimpl,
export_name="ll_os.ll_os_link")
@registering_if(os, 'symlink')
@@ -799,8 +798,7 @@
if res < 0:
raise OSError(rffi.get_errno(), "os_symlink failed")
- self.register(os.symlink, [str, str], s_None,
- llimpl=symlink_llimpl,
+ return extdef([str, str], s_None, llimpl=symlink_llimpl,
export_name="ll_os.ll_os_symlink")
@registering_if(os, 'fork')
@@ -814,7 +812,7 @@
raise OSError(rffi.get_errno(), "os_fork failed")
return rffi.cast(lltype.Signed, childpid)
- self.register(os.fork, [], int, llimpl=fork_llimpl,
+ return extdef([], int, llimpl=fork_llimpl,
export_name="ll_os.ll_os_fork")
@registering(os._exit)
@@ -824,7 +822,7 @@
def _exit_llimpl(status):
os__exit(rffi.cast(rffi.INT, status))
- self.register(os._exit, [int], s_None, llimpl=_exit_llimpl,
+ return extdef([int], s_None, llimpl=_exit_llimpl,
export_name="ll_os.ll_os__exit")
# --------------------------- os.stat & variants ---------------------------
@@ -873,7 +871,7 @@
return bool(os_c_func(status))
resulttype = bool
llimpl.func_name = name + '_llimpl'
- self.register(getattr(os, name), [int], resulttype, "ll_os."+name,
+ return extdef([int], resulttype, "ll_os."+name,
llimpl=llimpl)
for name in w_star:
@@ -890,7 +888,7 @@
raise OSError(rffi.get_errno(), "ttyname raised")
return rffi.charp2str(l_name)
- self.register(os.ttyname, [int], str, "ll_os.ttyname",
+ return extdef([int], str, "ll_os.ttyname",
llimpl=ttyname_llimpl)
# ____________________________________________________________
Modified: pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_time.py
==============================================================================
--- pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_time.py (original)
+++ pypy/branch/pypy-more-rtti-inprogress/rpython/module/ll_time.py Sat Aug 25 13:58:18 2007
@@ -7,7 +7,7 @@
from pypy.rpython.lltypesystem import rffi
from pypy.rpython.tool import rffi_platform as platform
from pypy.rpython.lltypesystem import lltype
-from pypy.rpython.extfunc import BaseLazyRegistering, registering
+from pypy.rpython.extfunc import BaseLazyRegistering, registering, extdef
class CConfig:
if sys.platform.startswith('win'):
@@ -96,7 +96,8 @@
lltype.free(t, flavor='raw')
return result
return float(c_time(void))
- self.register(time.time, [], float, llimpl=time_time_llimpl,
+
+ return extdef([], float, llimpl=time_time_llimpl,
export_name='ll_time.ll_time_time')
@registering(time.clock)
@@ -110,7 +111,8 @@
def time_clock_llimpl():
result = c_clock()
return float(result) / self.CLOCKS_PER_SEC
- self.register(time.clock, [], float, llimpl=time_clock_llimpl,
+
+ return extdef([], float, llimpl=time_clock_llimpl,
export_name='ll_time.ll_time_clock')
@registering(time.sleep)
@@ -138,5 +140,6 @@
raise OSError(rffi.get_errno(), "Select failed")
finally:
lltype.free(t, flavor='raw')
- self.register(time.sleep, [float], None, llimpl=time_sleep_llimpl,
+
+ return extdef([float], None, llimpl=time_sleep_llimpl,
export_name='ll_time.ll_time_sleep')
Modified: pypy/branch/pypy-more-rtti-inprogress/rpython/test/test_extfuncregister.py
==============================================================================
--- pypy/branch/pypy-more-rtti-inprogress/rpython/test/test_extfuncregister.py (original)
+++ pypy/branch/pypy-more-rtti-inprogress/rpython/test/test_extfuncregister.py Sat Aug 25 13:58:18 2007
@@ -5,7 +5,7 @@
import py
from pypy.rpython.extfunc import lazy_register, BaseLazyRegistering, \
- registering, registering_if
+ registering, registering_if, extdef
from pypy.rpython.test.test_llinterp import interpret
def test_lazy_register():
@@ -49,6 +49,22 @@
py.test.raises(ZeroDivisionError, interpret, lambda : f(), [])
assert interpret(lambda : g(), []) == 8
+def test_lazy_register_extdef():
+ def g():
+ return 3
+
+ x = []
+
+ def register_g():
+ x.append('g')
+ return extdef([], int, llimpl=lambda : 21)
+
+ nothing = lazy_register(g, register_g)
+
+ assert x == ['g']
+ assert nothing is None
+ assert interpret(lambda : g(), []) == 21
+
def test_lazy_register_raising_init():
def f():
return 3
More information about the Pypy-commit
mailing list