Writing os.pipe() using ctypes
Hi, I've been having fun this week trying to get twisted's unit tests running on top of pypy. This has the dual goals of getting twisted to run on a funky platform like pypy, and being able to give pypy a bit of a run around the yard. I have to report this is going "better than expected". I've already used rhymes's fcntl implementation and had to extend the posix module, I intend to do a diff once I get everything sorted. I have a problem with rpython translation of my implementation of posix.pipe(). I have other ctypes implementations of functions (such as posix.access()) which work okay, but I'm having trouble with this particular case. man 2 pipe says that I use it like this: int pipe(int filedes[2]); My implementation looks like: fd_arr = c_int * 2 def pipe(space): fds = fd_arr() fds[0] = 0 fds[1] = 0 if libc.pipe(fds): raise makeOSError(space) return space.wrap((fds[0], fds[1])) pipe.unwrap_spec = [ObjSpace] And the error I get from time {{{python translate.py --text --batch standalone --thread}}} is: [translation:ERROR] Exception': unexpected prebuilt constant: <slot wrapper '__init__' of '_ctypes.Array' objects> [translation:ERROR] .. v0 = simple_call((ArrayType c_long_Array_2)) [translation:ERROR] Processing block: [translation:ERROR] block@3 is a <class 'pypy.objspace.flow.flowcontext.SpamBlock'> [translation:ERROR] in (pypy.module.posix.ctypes_posix:43)pipe [translation:ERROR] containing the following operations: [translation:ERROR] v0 = simple_call((ArrayType c_long_Array_2)) [translation:ERROR] v1 = setitem(v0, (0), (0)) [translation:ERROR] v2 = setitem(v0, (1), (0)) [translation:ERROR] v3 = getattr((<CDLL '/usr/lib/libc...20a89f0>), ('pipe')) [translation:ERROR] v4 = simple_call(v3, v0) [translation:ERROR] v5 = is_true(v4) [translation:ERROR] --end-- I've tried a bunch of ways of initialising the 'fds' object as to not make it a 'prebuilt constant', fds = fd_arr(0,0), creating fd_arr dynamically, fd_arr(zero, zero), etc. And I simply cannot seem to get rid of this exception. So, any ideas as to how I go about making this work? Stephen.
Hello, 2006/7/6, Stephen Thorne <stephen@thorne.id.au>:
Hi,
I've been having fun this week trying to get twisted's unit tests running on top of pypy. This has the dual goals of getting twisted to run on a funky platform like pypy, and being able to give pypy a bit of a run around the yard. I have to report this is going "better than expected". I've already used rhymes's fcntl implementation and had to extend the posix module, I intend to do a diff once I get everything sorted.
I have a problem with rpython translation of my implementation of posix.pipe(). I have other ctypes implementations of functions (such as posix.access()) which work okay, but I'm having trouble with this particular case.
man 2 pipe says that I use it like this:
int pipe(int filedes[2]);
My implementation looks like:
fd_arr = c_int * 2 def pipe(space): fds = fd_arr() fds[0] = 0 fds[1] = 0 if libc.pipe(fds): raise makeOSError(space) return space.wrap((fds[0], fds[1])) pipe.unwrap_spec = [ObjSpace]
And the error I get from time {{{python translate.py --text --batch standalone --thread}}} is: [translation:ERROR] Exception': unexpected prebuilt constant: <slot wrapper '__init__' of '_ctypes.Array' objects> [translation:ERROR] .. v0 = simple_call((ArrayType c_long_Array_2)) [translation:ERROR] Processing block: [translation:ERROR] block@3 is a <class 'pypy.objspace.flow.flowcontext.SpamBlock'> [translation:ERROR] in (pypy.module.posix.ctypes_posix:43)pipe [translation:ERROR] containing the following operations: [translation:ERROR] v0 = simple_call((ArrayType c_long_Array_2)) [translation:ERROR] v1 = setitem(v0, (0), (0)) [translation:ERROR] v2 = setitem(v0, (1), (0)) [translation:ERROR] v3 = getattr((<CDLL '/usr/lib/libc...20a89f0>), ('pipe')) [translation:ERROR] v4 = simple_call(v3, v0) [translation:ERROR] v5 = is_true(v4) [translation:ERROR] --end--
I've tried a bunch of ways of initialising the 'fds' object as to not make it a 'prebuilt constant', fds = fd_arr(0,0), creating fd_arr dynamically, fd_arr(zero, zero), etc. And I simply cannot seem to get rid of this exception.
So, any ideas as to how I go about making this work?
Stephen. _______________________________________________ pypy-dev@codespeak.net http://codespeak.net/mailman/listinfo/pypy-dev
It seems that translate.py does not "register" annotation for rctypes objects. In a previous mail I suggested to add import pypy.rpython.rctypes.implementation in pypy/translator/goal/translate.py and translation seems to go further. (I'm running translate.py standalone --usemodules=_demo after I added your code in demo.py) Unfortunately the complete translation takes too much memory for the machine I'm currently working on, so I could not test completely. And since its a Windows box, I had to remove the libc.pipe call completely... Hope this helps. It seems that many people are interested in the new rctypes way to create modules... -- Amaury Forgeot d'Arc
participants (2)
-
Amaury Forgeot d'Arc
-
Stephen Thorne