I'm really glad you mentioned this .... I got to this point:
(include "gl-header.scm")
(c-declare #<<c-declare-end
#include <GL/gl.h>
c-declare-end
)
(define u32-vector->uint*
(c-lambda (scheme-object) GLuint* "___result = ___CAST(GLuint*,&___FETCH_U32(___BODY(_\ __arg1),___INT(0)));"))
... and yeah, now I'm going to scratch it. Wasn't aware the gc moved stuff around. Thanks! I can only imagine how fun this bug would have been to debug.
On Thu, Apr 16, 2009 at 9:30 PM, Marc Feeley feeley@iro.umontreal.cawrote:
On 17-Apr-09, at 12:19 AM, lowly coder wrote:
Hi!
This is a different question from my previous silly question.
All though it's really cool that I can take a C function with signature: void foo(int *); and in scheme land create a (scheme-foo) so that I can do:
(define bar (make-u....vector ...)) (scheme-foo bar)
There are a lot of C functions I need to use that take arguments int*, short*, ...
I would prefer to not change all these C bindings, and somehow magically have a Scheme function that given: (uber-magic bar) returns me a int* corresponding to where the data is stored in u32-vector bar.
That would be problematic because objects in the Scheme heap, including vectors, can be moved by the garbage collector. So a C pointer to an element of a u32vector could become stale (dangling pointer) at any moment. The only way this could work is to allocate a "still" vector. But all of this is seriously asking for trouble (the pointer will be a dangling pointer when the still object is reclaimed).
Marc