[cffi-devel] Re: Mutable Pointers

Luís Oliveira luismbo at gmail.com
Fri Jul 14 16:50:18 UTC 2006


Stuart Sierra <mail at stuartsierra.com> writes:
>> (setf *stack-pointer* (inc-pointer *stack-pointer* 1)) should
>> work. You can abstract that with a simple macro:
>>
>>   (defmacro incf-pointer (place &optional (offset 1))
>>     `(setf ,place (inc-pointer ,place ,offset)))
>
> But won't that set the value that *STACK-POINTER* points to?  In my
> example, *STACK-POINTER* is not a Lisp object but a foreign global
> variable accessed by name with DEFCVAR.  As I understand CFFI's
> :POINTER type, the above macro will modify the memory location that
> PLACE points to but will not modify PLACE itself.

No because your *STACK-POINTER* is a symbol-macro that expands into
(%var-accessor-*stack-pointer*) or something like that.  Here's an
example in cffi-tests (var_pointer is a foreign variable of type void*):

CFFI-TESTS> (get-var-pointer '*var-pointer*)
#.(SB-SYS:INT-SAP #X00396030)
CFFI-TESTS> *var-pointer*
#.(SB-SYS:INT-SAP #X00000000)
CFFI-TESTS> (setf *var-pointer* (inc-pointer *var-pointer* 1))
#.(SB-SYS:INT-SAP #X00000001)
CFFI-TESTS> (get-var-pointer '*var-pointer*)
#.(SB-SYS:INT-SAP #X00396030)
CFFI-TESTS> *var-pointer*
#.(SB-SYS:INT-SAP #X00000001)

*var-pointer* == (mem-ref (get-var-pointer '*var-pointer*) :pointer)

HTH

-- 
Luís Oliveira
luismbo (@) gmail (.) com
http://student.dei.uc.pt/~lmoliv/




More information about the cffi-devel mailing list