On 07/14/2012 10:35 AM, Armin Rigo wrote:
Hi Amaury,
On Tue, Jul 10, 2012 at 7:57 PM, Amaury Forgeot d'Arc
<amaur...@gmail.com> wrote:
Do you have an idea what this API would look like?
Then I can help with the implementation :)
If we want to go down this path without caring for compatibility with
CPython's C API, but instead focusing on what gives the best
performance, then I would think about something like this:
pypyobj pypy_wraplong(long value);
pypyobj pypy_add(pypyobj x, pypyobj y);
void pypy_close(pypyobj x);
pypyobj pypy_dup(pypyobj x);
using handles of type "pypyobj", which are basically opaque stuff (or
even just integers, with "-1" meaning "exception"). Instead of the
refcounting approach of CPython, it would be similar to file
descriptors: a file descriptor refers to a file, but most files don't
have any open file descriptor, and some files may have more than one.
Any "object descriptor" must be closed with pypy_close(). pypy_dup()
just duplicates the object descriptor, so that both descriptors refer
to the same object but will be pypy_close()d independently.
This can be implemented efficiently: the C->PyPy direction is just
doing one array lookup (this minimal indirection is hard to avoid
anyway with a moving GC); and the PyPy->C direction (like the return
value from pypy_add) just creates a new object descriptor anyway,
without needing to look if one already exists.
(1) Do I make some sense, and (2) is there any real use case for such
an API? E.g. would the expected performance gains of Cython justify
the rewrite needed to handle such an API, which is quite different
from CPython's?
(1) yes
(2)
(a)
cython could target that with some added primitives like
new_ref and drop_rev which in cpython would incref/decref
and on pypy would dup/close
(b)
this can be the basis of creating/generating higher level apis to
interface with pypy
imagine a gobject+gobject introspection based wrapper
that would allow stuff like the following
in vala/javascript/anything else for example::
import PyPy/ PyPy = require('pypy')
var long1 = PyPy.Int.from_long(123)
var long2 = PyPy.Int.from_long(123)
var result = long1.add(long2)
var text = result.to_string()
print(text)
(c)
(slightly crazy)
it might be possible to create a pure c lib
that can be used as compat layer
for pypy and cpython extensions
which would allow gradual adoption even
in cases where cpyext would have been too slow
and ctypes/cffi aren't a option
(but i have a feeling that using such a lib would require
a linter to help avoiding all those easy misstakes)
-- Ronny
A bientôt,
Armin.
_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
http://mail.python.org/mailman/listinfo/pypy-dev
_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
http://mail.python.org/mailman/listinfo/pypy-dev