[Openmcl-devel] a problem with the callback stack
Gary Byers
gb at clozure.com
Sun Jan 16 11:49:08 PST 2005
Somehow or other, I missed the original message (it does seem to have
been archived.)
A C (or ObjC) function that "returns a structure" (an NSSize in this
case) does so by accepting a first argument that's a pointer to an
instance of that structure type. The caller has to be aware of this,
and ObjC messages have to be sent using different primitives
(#_objc_msgSend_stret instead of #_objc_msgSend, for instance.)
The extra argument is implicit in C, and a C compiler will turn:
return NSMakeSize(1.0,2.0);
into something like:
magic_extra_argument->width = 1.0;
magic_extra_argument->height = 2.0;
return;
DEFINE-OBJC-METHOD needs a little help to recognize this case, and
the extra first argument needs to be made explicit. The somewhat
crufty syntax is:
(define-objc-method (((:STRUCT :<NSS>ize magic-arg)
:window-will-resize (:id window)
:to-size (:<NSS>ize size))
hemlock-window-controller)
(let* ((width (compute-width ...))
(height (compute-height ...)))
(setf (pref magic-arg :<NSS>ize.width) width
(pref magic-arg :<NSS>ize.height) height)))
It doesn't really matter what the method "returns" in the lisp sense;
it does matter that it have the side-effect of setting values in the
magic struct-return argument.
DEFINE-OBJC-METHOD should probably complain if the return type is
composite (a structure, union, array ..) and you don't use the
(:struct <type> explicit-name-for-magic-arg) syntax.
On Sun, 16 Jan 2005, alex crain wrote:
>
> On Jan 16, 2005, at 1:55 AM, alex crain wrote:
> >
> > CALLING -[HemlockWindowController windowWillResize:toSize:]
> > SELF = [:ID] #<A Mac Pointer #xBFFFE550>
> > _CMD = [:<SEL>] #<HEMLOCK-WINDOW-CONTROLLER <HemlockWindowController:
> > 0x853495a0> (#x853495A0)>
> > WINDOW = [:DOUBLE-FLOAT] -5.351074039314703D-229
> > SIZE = [:<NSS>size width=601.0 height=423.0]
> >
> This probably looks a bit confusing because I cut the wrong piece of
> text. I was playing around with the
> declaration to make sure that I hadn't shifted the argument labels
> myself, and the WINDOW
> argument is incorrectly typed as :DOUBLE-FLOAT. Here's a correct
> tracing of the call
>
> CALLING -[HemlockWindowController windowWillResize:toSize:]
> SELF = [:ID] #<A Mac Pointer #xBFFFE550>
There's the magic arg ...
> _CMD = [:<SEL>] #<HEMLOCK-WINDOW-CONTROLLER <HemlockWindowController:
and there's SELF
> 0x8530f2e0> (#x8530F2E0)>
> WINDOW = [:ID] #<A Mac Pointer #x9089F61C>
and _CMD (the selector)
> SIZE = [:<NSS>size width=-8.316439E-36 height=600.0]
and that's the window object, interpreted as a pointer to an NSSize ...
> -[HemlockWindowController windowWillResize:toSize:] returned [:#<A Mac
> Pointer #xBFFFE4B4>] <NSS>IZE
>
> With the correct argument declarations, the size argument is now
> shifted back 4 bytes (because WINDOW is really 4 bytes, not 8)
> and is now wrong. SELF, _CMD and WINDOW are, of course, sitll bogus as
> well.
>
> Ideas?
Hope this makes sense.
>
> :alex
>
>
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel
>
>
More information about the Openmcl-devel
mailing list