[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