[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