Hi Alex,

(I'm a little unclear what it means to represent "void*" as an array (array
of what?),

exactly. A PyCObject is useless by design (but lacking in PyPy AFAICT, other
than in cpyext, which use would be slow), as is an array of void. It is the
best equivalent I could come up with ...

I figured that the only thing I ever wanted from a PyCObject, is to get the
C-side address. That is why cppyy.addressof() does provide that for arrays
of void now.

Beyond that, PyCObject's serve to go from C -> Python -> C, with no work in
Python. This void array can do that. The only part missing is an as_cobject
(one that returns a cpyext-based, CPython PyCObject), to communicate with
other extension libraries that use the CPython C-API. Such a function is
needed for all other C++ instances also, so I'll add that (PyROOT has it to
allow integration with PyQt, for example).

Out of curiosity, is there some reason you didn't name that cppyy.gbl.NULL
instead?  It seems to me that "nullptr" could potentially cause namespace
collisions if some library decided to have a function/variable by that
name, whereas "NULL" would be consistent with standard C++ naming..

Is unlikely, as 'nullptr' is a C++11 keyword. I've been thinking of putting
it under 'cppyy' rather than 'cppyy.gbl', but the latter seemed to make more
sense (it's not a module feature, but a C++ feature).

For clarification, the specific use case I'm looking at is
objects/functions that use "void *" as an "opaque pointer to application
data" that the library doesn't want/need to care about (just pass back to
the application sometimes).  In this context, it would be really nice if
there was some easy way to use "void*" to represent a pure Python object as
well (not just C++ instances).

Okay, I understand better now.

Obviously, in pypy objects don't have
static addresses, so we can't just use a pointer to the Python object

That is solvable (cppyy can bind functions that take/provide PyObject* as it
simply hands over the work to cpyext). See for example test_crossing.py in
pypy/module/cppyy/test. The larger problem would be that any randomly given
python object does not have a guaranteed layout.

but
I was considering the possibility of taking an index or id() of the object
and just casting it into "void*" form, and then converting it back and
using it to look up objects in a list/dict somewhere..

Alex Pyattaev did this (is in the pypy-dev mail archives, somewhere around
early Summer 2012).

In any case, I wanted to make sure that use case was something that would
be feasible in your plan for how void pointers will ultimately work..

Let me know if you see anything missing. "void*" is an interesting puzzle,
without many people (that I know of) interested in it.

The much bigger pain that we have, is the use of "char*" where the intended
usage is "byte*". (And I don't actually have a solution for that.)

Best regards,
           Wim
--
wlavrij...@lbl.gov    --    +1 (510) 486 6411    --    www.lavrijsen.net
_______________________________________________
pypy-dev mailing list
pypy-dev@python.org
https://mail.python.org/mailman/listinfo/pypy-dev

Reply via email to