[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