[Openmcl-devel] ObjC callbacks - self and dynamic extent
Gary Byers
gb at clozure.com
Thu Feb 10 15:50:49 PST 2005
On Thu, 10 Feb 2005, alex crain wrote:
> This doesn't work...
>
> ? (defvar *x* nil)
> *X*
> ? (define-objc-method ((:void my-method sender) my-class)
> (setq *x* sender))
> |-[MyClass myMethod:]|
> ? *x*
> #<BOGUS object @ #xCE63E>
> ?
>
> Not what I had in mind. I gather from reading the lisp kernel code that
> sender is
> dereferenced off the stack, my question is how to get it off without
> copying the object.
> I can to some hackery like this (for NSDocuments)
>
> (send (send (send self 'window-controllers) :object-at-index 0)
> 'document)
>
> Which works, but I can't believe that there isn't an easier way.
>
> Clues?
>
> :alex
You don't have to copy the (NS)Object. You -do- have to do something
to create a persistent (heap-allocated) MACPTR that points to the
same address as the stack-allocated MACPTR that's the value of SELF.
? (define-objc-method ((:void my-method sender) my-class)
(setq *x* (%inc-ptr sender 0))) ; one way of creating an
; EQL heap-allocated pointer
If you think "Hmm. It's kind of a PITA that callbacks try to
stack-cons parameters when they can, and you have to be aware of
this", I'd tend to agree. (This -is- documented in the description of
DEFCALLBACK; that may or may not make it easier to remember. I find
that getting bitten by this every now and then is a good way to stay
familiar with the issue.)
I find it harder to agree with the potential conclusion that callback
parameters should have indefinite extent by default; it's -probably-
better overall that callbacks don't do lots of incidental
heap-allocation of pointer parameters (and that you don't have to
explicitly ask for this behavior.)
(Probably. I think that I can talk myself into and out of either
extreme-end-of-the-spectrum position.)
More information about the Openmcl-devel
mailing list