extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Hello :)

The result of various incompatibilities has left me needing to somehow
extract the address that a null pointer is pointing to with the null
pointer being exposed to python via PyCObject_FromVoidPtr

the code that creates the PyCObject is as follows:
tmp = PyCObject_FromVoidPtr (info.info.x11.display, NULL);
PyDict_SetItemString (dict, "display", tmp);
Py_DECREF (tmp);

which is exposed to python via a dictionary (the 'display' key). python
identifies that its a PyCObject but doesn't give any way to expose the
functionality. Essentially I am after the address that the void pointer
'info.info.x11.display' points to (as a long type)

As far as I can tell ctypes will only expose the pyObject type to me and
not actually let me deal with the data I am after, but being rather new
to ctypes I'm not sure weather this is correct.

-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Aaron "Castironpi" Brady wrote:
> Did you try:
> 
> tmp= PyLong_FromLong( ( long ) info.info.x11.display );
> PyDict_SetItemString (dict, "display", tmp);
> Py_DECREF (tmp);
> 
> Or also try:
> 
> PyCObject_AsVoidPtr( tmp );
> --
> http://mail.python.org/mailman/listinfo/python-list

the problem is that I can't edit the C code - well I can and might
submit a patch to the project but I also need a solution that works from
the python side of things.


-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Aaron "Castironpi" Brady wrote:
> I see.  If I understand, you have a PyCObject in a dictionary.
> 
> Look at the 'ctypes' module and try calling PyCObject_AsVoidPtr.  Its
> return type should be 'c_void_p', and you can use 'result.value' to
> get the original pointer.
> --
> http://mail.python.org/mailman/listinfo/python-list

I have a hard time following that, if using ctypes you used PyDLL to
call PyCObject_AsVoidPtr on the PyCObject I already have surely it would
 give me back a pointer (void for sake of simplicity) but it would be a
pointer to a new PyCObject and thus calling result.value on it would
only return the memory address of the new PyCObject?
-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Aaron "Castironpi" Brady wrote:

> Yes, well said.  But no, not true, not necessarily.  You can choose/
> change return types with your code.  If the call is defined already
> and you can't change the return, just define a new one that returns
> long.
> --
> http://mail.python.org/mailman/listinfo/python-list

the problem is that the pointer or long or whatever it is thats returned
won't be the data I am after. the code for PyCObject_FromVoidPtr is as
follows:

PyObject *
PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))
{
PyCObject *self;

self = PyObject_NEW(PyCObject, &PyCObject_Type);
if (self == NULL)
return NULL;
self->cobject=cobj;
self->destructor=destr;
self->desc=NULL;

return (PyObject *)self;
}


it obviously creates a new PyObject and returns that, which has already
happened once (the address I am after is passed to python via
PyCObject_FromVoidPtr(adress_i_am_after, NULL), doing that puts the
address I am after into the .cobject attribute of a new pyobject
structure and passes that to the python script via the 'display' key in
a dictionary.

If I were to then take the pycobject in this display key and pass it via
ctypes into PyCObject_FromVoidPtr it would simply create a new pycobject
 and put a pointer to the old pycobject in the new pycobject's .cobject
attribute. it just means that I am getting further and further away from
where I want to be surely? if I were to take the current pointer at this
stage, to get to the address I actually want in C it would have to
follow something along the lines of
long address_i_want = (long)(new_pycobj->cobject->cobject);

What would be great is if there is some easy simple way of accessing the
.cobject attribute of the first pycobject thats passed via the
dictionary to python.

-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Gordon Allott
Aaron "Castironpi" Brady wrote:
> 
> You are hard to follow.  There is the 'cast' function, which I've had
> some success with, even in adding pointers and offsets.  It took a
> look at the code for it though, and calling an undocumented version of
> it.  I can post that later if you don't have luck the same.  You can
> write extension modules to do that as well, and there's always a
> Google search which personally I forget half the time too.  Last, you
> haven't mentioned an attempt with PyCObject_AsVoidPtr yet:
> 
> void* PyCObject_AsVoidPtr(PyObject* self)
> Return the object void * that the PyCObject self was created with.
> 
> Where does that get you?
> --
> http://mail.python.org/mailman/listinfo/python-list

sorry yes you were right, I was reading PyCObject_AsVoidPtr as
PyCObject_FromVoidPtr :)

using AsVoidPtr is a little confusing, this is the code I am using:
display = pygame.display.get_wm_info()['display']
pyobj = py_object(display)
ref = pointer(pyobj)

print pythonapi.PyCObject_AsVoidPtr(ref)

it produces the following traceback:
Traceback (most recent call last):
  File "pygametest.py", line 125, in 
app = PyGameOGREApp()
  File "pygametest.py", line 33, in __init__
self._createWindow(width, height, fullscreen)
  File "pygametest.py", line 64, in _createWindow
print pythonapi.PyCObject_AsVoidPtr(ref)
TypeError: PyCObject_AsVoidPtr with non-C-object

- I think that's because its a pointer to the ctypes py_object() rather
than the PyCObject we are dealing with but I have no idea how to create
a pointer to that.

-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Gordon Allott
Aaron "Castironpi" Brady wrote:
> 
> My pygame install just returns an integer in get_wm_info.  Take a
> look:
> 
 pygame.display.get_wm_info()
> {'window': 1180066, 'hglrc': 0}
 pygame.display.get_wm_info()['window']
> 1180066
 ctypes.c_void_p( _ )
> c_void_p(1180066)
> 
> You're suggesting yours looks like this:
> 
 pygame.display.get_wm_info()
> { ... 'display': ctypes.py_object( 1180066 ), ... }
> 
> What does type( display ) give you?
> --
> http://mail.python.org/mailman/listinfo/python-list

yes its different on windows and linux, windows only has a few items
where linux has many more. 'window' is just the window 'id'  at any rate
which is not the data I am after (which is internally an address to an
xlib structure)
this is what pygame.display.get_wm_info() returns on linux:
{'fswindow': 31457283, 'wmwindow': 31457284, 'window': 31457294,
'lock_func': , 'unlock_func': , 'display': }

note how the display object is a PyCObject, thats got the address I want
 inside it.


-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Gordon Allott
Aaron "Castironpi" Brady wrote:
> 
> What does print pythonapi.PyCObject_AsVoidPtr(display) give you?
> --
> http://mail.python.org/mailman/listinfo/python-list

Traceback (most recent call last):
  File "pygametest.py", line 125, in 
app = PyGameOGREApp()
  File "pygametest.py", line 33, in __init__
self._createWindow(width, height, fullscreen)
  File "pygametest.py", line 65, in _createWindow
print pythonapi.PyCObject_AsVoidPtr(display)
ctypes.ArgumentError: argument 1: : Don't
know how to convert parameter 1


-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Gordon Allott
Aaron "Castironpi" Brady wrote:
 ctypes.pythonapi.PyCObject_AsVoidPtr.restype
> 
 ctypes.pythonapi.PyCObject_AsVoidPtr.argtypes


thank you so much, this works perfectly :)


-- 
Gord Allott ([EMAIL PROTECTED])



signature.asc
Description: OpenPGP digital signature
--
http://mail.python.org/mailman/listinfo/python-list