[pypy-svn] r45979 - in pypy/branch/pypy-more-rtti-inprogress/rpython: . module test

pedronis at codespeak.net pedronis at codespeak.net
Sat Aug 25 13:19:17 CEST 2007


Author: pedronis
Date: Sat Aug 25 13:19:16 2007
New Revision: 45979

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/test/test_extfuncregister.py
Log:
registering_if convenience decorator for the pattern: 

if hasattr(ns, name):
   @registering_if(ns.name)
   def ...




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:19:16 2007
@@ -38,6 +38,14 @@
         return method
     return decorator
 
+def registering_if(ns, name):
+    try:
+        func = getattr(ns, name)
+    except AttributeError:
+        return lambda method: None
+    else:
+        return registering(func)
+
 class LazyRegisteringMeta(type):
     def __new__(self, _name, _type, _vars):
         RegisteringClass = type.__new__(self, _name, _type, _vars)

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:19:16 2007
@@ -10,7 +10,8 @@
 from pypy.rpython.module.support import to_opaque_object, from_opaque_object
 from pypy.tool.sourcetools import func_with_new_name
 from pypy.rlib.rarithmetic import r_longlong
-from pypy.rpython.extfunc import BaseLazyRegistering, registering
+from pypy.rpython.extfunc import BaseLazyRegistering
+from pypy.rpython.extfunc import registering, registering_if
 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
@@ -37,43 +38,41 @@
         self.register(fun, [], int, llimpl=c_func_llimpl,
                       export_name='ll_os.ll_os_' + name)
 
-    if hasattr(os, 'execv'):
-        @registering(os.execv)
-        def register_os_execv(self):
-            os_execv = rffi.llexternal('execv', [rffi.CCHARP, rffi.CCHARPP],
-                                       rffi.INT)
-
-            def execv_llimpl(path, args):
-                l_path = rffi.str2charp(path)
-                l_args = rffi.liststr2charpp(args)
-                os_execv(l_path, l_args)
-                rffi.free_charpp(l_args)
-                rffi.free_charp(l_path)
-                raise OSError(rffi.get_errno(), "execv failed")
+    @registering_if(os, 'execv')
+    def register_os_execv(self):
+        os_execv = rffi.llexternal('execv', [rffi.CCHARP, rffi.CCHARPP],
+                                   rffi.INT)
+
+        def execv_llimpl(path, args):
+            l_path = rffi.str2charp(path)
+            l_args = rffi.liststr2charpp(args)
+            os_execv(l_path, l_args)
+            rffi.free_charpp(l_args)
+            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")
+        self.register(os.execv, [str, [str]], s_ImpossibleValue, llimpl=
+                      execv_llimpl, export_name="ll_os.ll_os_execv")
 
-    if hasattr(posix, 'spawnv'):
-        @registering(os.spawnv)
-        def register_os_spawnv(self):
-            os_spawnv = rffi.llexternal('spawnv',
-                                        [rffi.INT, rffi.CCHARP, rffi.CCHARPP],
-                                        rffi.INT)
-
-            def spawnv_llimpl(mode, path, args):
-                mode = rffi.cast(rffi.INT, mode)
-                l_path = rffi.str2charp(path)
-                l_args = rffi.liststr2charpp(args)
-                childpid = os_spawnv(mode, l_path, l_args)
-                rffi.free_charpp(l_args)
-                rffi.free_charp(l_path)
-                if childpid == -1:
-                    raise OSError(rffi.get_errno(), "os_spawnv failed")
-                return rffi.cast(lltype.Signed, childpid)
+    @registering_if(posix, 'spawnv')
+    def register_os_spawnv(self):
+        os_spawnv = rffi.llexternal('spawnv',
+                                    [rffi.INT, rffi.CCHARP, rffi.CCHARPP],
+                                    rffi.INT)
 
-            self.register(os.spawnv, [int, str, [str]], int, llimpl=
-                          spawnv_llimpl, export_name="ll_os.ll_os_spawnv")
+        def spawnv_llimpl(mode, path, args):
+            mode = rffi.cast(rffi.INT, mode)
+            l_path = rffi.str2charp(path)
+            l_args = rffi.liststr2charpp(args)
+            childpid = os_spawnv(mode, l_path, l_args)
+            rffi.free_charpp(l_args)
+            rffi.free_charp(l_path)
+            if childpid == -1:
+                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")
 
     @registering(os.dup)
     def register_os_dup(self):
@@ -160,23 +159,22 @@
                       "ll_os.ll_os_utime",
                       llimpl=os_utime_llimpl)
 
-    if hasattr(os, 'setsid'):
-        @registering(os.setsid)
-        def register_os_setsid(self):
-            os_setsid = rffi.llexternal('setsid', [], rffi.PID_T,
-                                        includes=['unistd.h'])
+    @registering_if(os, 'setsid')
+    def register_os_setsid(self):
+        os_setsid = rffi.llexternal('setsid', [], rffi.PID_T,
+                                    includes=['unistd.h'])
 
-            def setsid_llimpl():
-                result = rffi.cast(lltype.Signed, os_setsid())
-                if result == -1:
-                    raise OSError(rffi.get_errno(), "os_setsid failed")
-                return result
+        def setsid_llimpl():
+            result = rffi.cast(lltype.Signed, os_setsid())
+            if result == -1:
+                raise OSError(rffi.get_errno(), "os_setsid failed")
+            return result
 
-            self.register(os.setsid, [], int, export_name="ll_os.ll_os_setsid",
-                          llimpl=setsid_llimpl)
+        self.register(os.setsid, [], int, export_name="ll_os.ll_os_setsid",
+                      llimpl=setsid_llimpl)
 
-    if False and hasattr(os, 'uname'): # make it more portable
-        @registering(os.uname)
+    if False:
+        @registering_if(os, 'uname')
         def register_os_uname(self):
             lgt = platform.intdefined('_UTSNAME_LENGTH',
                                       includes=['sys/utsname.h'])
@@ -226,11 +224,10 @@
         self.register_os_function_returning_int(os.geteuid, 'geteuid',
                                                 includes=self.UNISTD_INCL)
 
-    if hasattr(os, 'getpid'):
-        @registering(os.getpid)
-        def register_os_getpid(self):
-            self.register_os_function_returning_int(os.getpid, 'getpid',
-                                                    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)
 
     @registering(os.open)
     def register_os_open(self):
@@ -373,21 +370,20 @@
                       export_name = "ll_os.ll_os_lseek",
                       oofakeimpl = os_lseek_oofakeimpl)
 
-    if hasattr(os, 'ftruncate'):
-        @registering(os.ftruncate)
-        def register_os_ftruncate(self):
-            os_ftruncate = rffi.llexternal('ftruncate',
-                                           [rffi.INT, rffi.LONGLONG], rffi.INT)
-
-            def ftruncate_llimpl(fd, length):
-                res = os_ftruncate(rffi.cast(rffi.INT, fd),
-                                   rffi.cast(rffi.LONGLONG, length))
-                if res < 0:
-                    raise OSError(rffi.get_errno(), "os_lseek failed")
-
-            self.register(os.ftruncate, [int, r_longlong], s_None,
-                          llimpl = ftruncate_llimpl,
-                          export_name = "ll_os.ll_os_ftruncate")
+    @registering_if(os, 'ftruncate')
+    def register_os_ftruncate(self):
+        os_ftruncate = rffi.llexternal('ftruncate',
+                                       [rffi.INT, rffi.LONGLONG], rffi.INT)
+
+        def ftruncate_llimpl(fd, length):
+            res = os_ftruncate(rffi.cast(rffi.INT, fd),
+                               rffi.cast(rffi.LONGLONG, length))
+            if res < 0:
+                raise OSError(rffi.get_errno(), "os_lseek failed")
+
+        self.register(os.ftruncate, [int, r_longlong], s_None,
+                      llimpl = ftruncate_llimpl,
+                      export_name = "ll_os.ll_os_ftruncate")
 
     @registering(os.access)
     def register_os_access(self):
@@ -514,44 +510,43 @@
                           "ll_os.ll_os_pipe",
                           llimpl=os_pipe_llimpl)
 
-    if hasattr(os, 'readlink'):
-        @registering(os.readlink)
-        def register_os_readlink(self):
-            os_readlink = rffi.llexternal('readlink',
-                                       [rffi.CCHARP, rffi.CCHARP, rffi.SIZE_T],
-                                       rffi.INT)  # XXX SSIZE_T in POSIX.1-2001
-
-            def os_readlink_llimpl(path):
-                l_path = rffi.str2charp(path)
-                try:
-                    bufsize = 1023
-                    while True:
-                        buf = lltype.malloc(rffi.CCHARP.TO, bufsize,
-                                            flavor='raw')
-                        res = os_readlink(l_path, buf,
-                                          rffi.cast(rffi.SIZE_T, bufsize))
-                        if res < 0:
-                            error = rffi.get_errno()    # failed
-                            lltype.free(buf, flavor='raw')
-                            raise OSError(error, "readlink failed")
-                        elif res < bufsize:
-                            break                       # ok
-                        else:
-                            # buf too small, try again with a larger buffer
-                            lltype.free(buf, flavor='raw')
-                            bufsize *= 4
-                    # convert the result to a string
-                    res = rffi.cast(lltype.Signed, res)
-                    l = [buf[i] for i in range(res)]
-                    result = ''.join(l)
-                    lltype.free(buf, flavor='raw')
-                finally:
-                    rffi.free_charp(l_path)
-                return result
+    @registering_if(os, 'readlink')
+    def register_os_readlink(self):
+        os_readlink = rffi.llexternal('readlink',
+                                   [rffi.CCHARP, rffi.CCHARP, rffi.SIZE_T],
+                                   rffi.INT)  # XXX SSIZE_T in POSIX.1-2001
+
+        def os_readlink_llimpl(path):
+            l_path = rffi.str2charp(path)
+            try:
+                bufsize = 1023
+                while True:
+                    buf = lltype.malloc(rffi.CCHARP.TO, bufsize,
+                                        flavor='raw')
+                    res = os_readlink(l_path, buf,
+                                      rffi.cast(rffi.SIZE_T, bufsize))
+                    if res < 0:
+                        error = rffi.get_errno()    # failed
+                        lltype.free(buf, flavor='raw')
+                        raise OSError(error, "readlink failed")
+                    elif res < bufsize:
+                        break                       # ok
+                    else:
+                        # buf too small, try again with a larger buffer
+                        lltype.free(buf, flavor='raw')
+                        bufsize *= 4
+                # convert the result to a string
+                res = rffi.cast(lltype.Signed, res)
+                l = [buf[i] for i in range(res)]
+                result = ''.join(l)
+                lltype.free(buf, flavor='raw')
+            finally:
+                rffi.free_charp(l_path)
+            return result
 
-            self.register(os.readlink, [str], str,
-                          "ll_os.ll_os_readlink",
-                          llimpl=os_readlink_llimpl)
+        self.register(os.readlink, [str], str,
+                      "ll_os.ll_os_readlink",
+                      llimpl=os_readlink_llimpl)
 
     @registering(os.waitpid)
     def register_os_waitpid(self):
@@ -756,75 +751,71 @@
         self.register(os.umask, [int], int, llimpl=umask_llimpl,
                       export_name="ll_os.ll_os_umask")
 
-    if hasattr(os, 'kill'):
-        @registering(os.kill)
-        def register_os_kill(self):
-            os_kill = rffi.llexternal('kill', [rffi.PID_T, rffi.INT],
-                                      rffi.INT,
-                                      includes=['sys/types.h', 'signal.h'])
-
-            def kill_llimpl(pid, sig):
-                res = os_kill(rffi.cast(rffi.PID_T, pid),
-                              rffi.cast(rffi.INT, sig))
-                if res < 0:
-                    raise OSError(rffi.get_errno(), "os_kill failed")
-
-            self.register(os.kill, [int, int], s_None, llimpl=kill_llimpl,
-                          export_name="ll_os.ll_os_kill")
-
-    if hasattr(os, 'link'):
-        @registering(os.link)
-        def register_os_link(self):
-            os_link = rffi.llexternal('link', [rffi.CCHARP, rffi.CCHARP],
-                                      rffi.INT,
-                                      includes = ['unistd.h'])
-
-            def link_llimpl(oldpath, newpath):
-                l_oldpath = rffi.str2charp(oldpath)
-                l_newpath = rffi.str2charp(newpath)
-                res = os_link(l_oldpath, l_newpath)
-                rffi.free_charp(l_newpath)
-                rffi.free_charp(l_oldpath)
-                if res < 0:
-                    raise OSError(rffi.get_errno(), "os_link failed")
-
-            self.register(os.link, [str, str], s_None, llimpl=link_llimpl,
-                          export_name="ll_os.ll_os_link")
-
-    if hasattr(os, 'symlink'):
-        @registering(os.symlink)
-        def register_os_symlink(self):
-            os_symlink = rffi.llexternal('symlink', [rffi.CCHARP, rffi.CCHARP],
-                                         rffi.INT,
-                                         includes = ['unistd.h'])
-
-            def symlink_llimpl(oldpath, newpath):
-                l_oldpath = rffi.str2charp(oldpath)
-                l_newpath = rffi.str2charp(newpath)
-                res = os_symlink(l_oldpath, l_newpath)
-                rffi.free_charp(l_newpath)
-                rffi.free_charp(l_oldpath)
-                if res < 0:
-                    raise OSError(rffi.get_errno(), "os_symlink failed")
-
-            self.register(os.symlink, [str, str], s_None,
-                          llimpl=symlink_llimpl,
-                          export_name="ll_os.ll_os_symlink")
-
-    if hasattr(os, 'fork'):
-        @registering(os.fork)
-        def register_os_fork(self):
-            os_fork = rffi.llexternal('fork', [], rffi.PID_T,
-                                      includes = ['sys/types.h', 'unistd.h'])
-
-            def fork_llimpl():
-                childpid = os_fork()
-                if childpid == -1:
-                    raise OSError(rffi.get_errno(), "os_fork failed")
-                return rffi.cast(lltype.Signed, childpid)
+    @registering_if(os, 'kill')
+    def register_os_kill(self):
+        os_kill = rffi.llexternal('kill', [rffi.PID_T, rffi.INT],
+                                  rffi.INT,
+                                  includes=['sys/types.h', 'signal.h'])
+
+        def kill_llimpl(pid, sig):
+            res = os_kill(rffi.cast(rffi.PID_T, pid),
+                          rffi.cast(rffi.INT, sig))
+            if res < 0:
+                raise OSError(rffi.get_errno(), "os_kill failed")
+
+        self.register(os.kill, [int, int], s_None, llimpl=kill_llimpl,
+                      export_name="ll_os.ll_os_kill")
 
-            self.register(os.fork, [], int, llimpl=fork_llimpl,
-                          export_name="ll_os.ll_os_fork")
+    @registering_if(os, 'link')
+    def register_os_link(self):
+        os_link = rffi.llexternal('link', [rffi.CCHARP, rffi.CCHARP],
+                                  rffi.INT,
+                                  includes = ['unistd.h'])
+
+        def link_llimpl(oldpath, newpath):
+            l_oldpath = rffi.str2charp(oldpath)
+            l_newpath = rffi.str2charp(newpath)
+            res = os_link(l_oldpath, l_newpath)
+            rffi.free_charp(l_newpath)
+            rffi.free_charp(l_oldpath)
+            if res < 0:
+                raise OSError(rffi.get_errno(), "os_link failed")
+
+        self.register(os.link, [str, str], s_None, llimpl=link_llimpl,
+                      export_name="ll_os.ll_os_link")
+
+    @registering_if(os, 'symlink')
+    def register_os_symlink(self):
+        os_symlink = rffi.llexternal('symlink', [rffi.CCHARP, rffi.CCHARP],
+                                     rffi.INT,
+                                     includes = ['unistd.h'])
+
+        def symlink_llimpl(oldpath, newpath):
+            l_oldpath = rffi.str2charp(oldpath)
+            l_newpath = rffi.str2charp(newpath)
+            res = os_symlink(l_oldpath, l_newpath)
+            rffi.free_charp(l_newpath)
+            rffi.free_charp(l_oldpath)
+            if res < 0:
+                raise OSError(rffi.get_errno(), "os_symlink failed")
+
+        self.register(os.symlink, [str, str], s_None,
+                      llimpl=symlink_llimpl,
+                      export_name="ll_os.ll_os_symlink")
+
+    @registering_if(os, 'fork')
+    def register_os_fork(self):
+        os_fork = rffi.llexternal('fork', [], rffi.PID_T,
+                                  includes = ['sys/types.h', 'unistd.h'])
+
+        def fork_llimpl():
+            childpid = os_fork()
+            if childpid == -1:
+                raise OSError(rffi.get_errno(), "os_fork failed")
+            return rffi.cast(lltype.Signed, childpid)
+
+        self.register(os.fork, [], int, llimpl=fork_llimpl,
+                      export_name="ll_os.ll_os_fork")
 
     @registering(os._exit)
     def register_os__exit(self):
@@ -886,23 +877,21 @@
                       llimpl=llimpl)
 
     for name in w_star:
-        if hasattr(os, name):
-            locals()['register_w_' + name] = registering(getattr(os, name))(
-                     lambda self, xname=name : self.declare_new_w_star(xname))
-
-    if hasattr(os, 'ttyname'):
-        @registering(os.ttyname)
-        def register_os_ttyname(self):
-            os_ttyname = rffi.llexternal('ttyname', [lltype.Signed], rffi.CCHARP)
-
-            def ttyname_llimpl(fd):
-                l_name = os_ttyname(fd)
-                if not l_name:
-                    raise OSError(rffi.get_errno(), "ttyname raised")
-                return rffi.charp2str(l_name)
+        locals()['register_w_' + name] = registering_if(os, name)(
+            lambda self, xname=name : self.declare_new_w_star(xname))
+
+    @registering_if(os, 'ttyname')
+    def register_os_ttyname(self):
+        os_ttyname = rffi.llexternal('ttyname', [lltype.Signed], rffi.CCHARP)
+
+        def ttyname_llimpl(fd):
+            l_name = os_ttyname(fd)
+            if not l_name:
+                raise OSError(rffi.get_errno(), "ttyname raised")
+            return rffi.charp2str(l_name)
 
-            self.register(os.ttyname, [int], str, "ll_os.ttyname",
-                          llimpl=ttyname_llimpl)
+        self.register(os.ttyname, [int], str, "ll_os.ttyname",
+                      llimpl=ttyname_llimpl)
 
 # ____________________________________________________________
 # Support for os.environ

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:19:16 2007
@@ -5,7 +5,7 @@
 
 import py
 from pypy.rpython.extfunc import lazy_register, BaseLazyRegistering, \
-     registering
+     registering, registering_if
 from pypy.rpython.test.test_llinterp import interpret
 
 def test_lazy_register():
@@ -70,4 +70,22 @@
 
     py.test.raises(ZeroDivisionError, interpret, lambda : f(), [])
     py.test.raises(ZeroDivisionError, interpret, lambda : g(), [])
+
+def test_registering_if():
+    class A:
+        @staticmethod
+        def f():
+            pass
+
+    @registering_if(A, 'f')
+    def foo():
+        pass
+
+    assert foo._registering_func is A.f
     
+    @registering_if(A, 'g')
+    def bar():
+        pass
+
+    assert bar is None
+ 



More information about the Pypy-commit mailing list