On Wed, 9 Jul 2008, Greg Troxel wrote: > "Kjetil S. Matheussen" <[EMAIL PROTECTED]> writes: > > > Ludovic Court?s: > >> Hi, > >> > >> "Maciek Godek" <[EMAIL PROTECTED]> writes: > >> > >>> is there any portable and recommended way for passing C pointers around > >>> in guile environment? > >>> I think of something like scm_to_ptr (analogous to scm_to_int etc.). > >>> Certainly such a value would be completely useless for the interpreter. > >>> One can achieve simillar functionality using the aforementioned > >>> scm_to_int (keeping track on the word length of the build target), > >>> but it seems rather unnatural. > >> > >> If the goal is to make a C object pointed to by some pointer available > >> to Scheme functions, the recommended (and simplest) way is to use a > >> "SMOB" (see the manual for details). In practice, SMOBs incur some > >> storage overhead because they hold 4 machines words, while you may only > >> need one. > >> > >> Another possibility is to use a "uo" field in a struct: it allows you to > >> have a struct field holding a machine word inaccessible to Scheme > >> functions (see the "Vtables" node of the manual). > >> > > > > I haven't heard of the "uo" field before, but at least using a SMOB > > is really inconvenient, and using an unsigned long for storing > > pointers is really convenient. (BTW. How does swig and gwrap handle > > pointers?) > > > > I agree with Maciek that it would at least be mind-comforting to have > > functions like scm_to_ptr/etc, although not strictly necessary, > > since using integers works just fine. > > Does C guarantee that pointers fit in unsigned long? >
I don't know. But in practice: Yes. > I suspect SMOBs are the right answer. Part of the point is to do the > right thing when the scheme object is garbage collected. When > discarding a pointer often one should be freeing an object or > decrementing a refcount. > I've use SMOBs, and they really weren't that hard once I dug in. > Sure, if you just do this now and then, SMOBs aren't a problem. But that doesn't change the fact that all the functionality SMOB provides is overkill when the only thing you need is to hold a pointer. I just submitted a patch for unsigned ptr to guile-devel though, and if that patch is accepted, there is nothing more to discuss: For those who needs the full functionality of SMOB's, or need the extra speed and memory advantages of SMOB's, they are free to use SMOB's. If not, the functions scm_to/from_uintptr can be used instead, which is a billion times easier to use.