[Openmcl-devel] CCL::%GET-PTR --- When to use?
David Steuber
david at david-steuber.com
Fri Jan 7 09:57:31 PST 2005
On Jan 7, 2005, at 2:51 AM, Gary Byers wrote:
>
>
> On Fri, 7 Jan 2005, David Steuber wrote:
>
>> I seem to be having endless confusion on when I need to use
>> CCL::%GET-PTR when using the Carbon API for OS X. I think the problem
>> lies in me not always being able to tell when a MACPTR is like a
>> pointer or a pointer to a pointer. Has anyone come up with a good
>> heuristic so as not to have to guess so often?
>>
>
>
> It general helps a lot to use things like RLET and PREF; they're
> generally just syntactic sugar for lower-level constructs (including
> %GET-PTR and friends), but they often make otherwise confusing
> distinctions clearer. (If it's any consolation, I think that C
> programmers - even experienced ones - often find some of the
> same things to be confusing ...)
>
> One thing to bear in mind is that the values of variables bound
> by RLET are always of type "pointer to ...", and it sometimes
> makes things clearer to name the variables with that in mind:
[snip examples]
Thanks. That's a help. I still have some confusion left though. I'm
not sure about my use of CCL::%GET-PTR here:
(defun show-moon-facts-window (windowref)
(rlet ((&text :<cfs>tring<r>ef (#_CFBundleCopyLocalizedString
(#_CFBundleGetMainBundle)
(const-cfstring +moon-facts-text-key+)
(const-cfstring +moon-facts-text-key+)
(ccl::%null-ptr)))
(moon-facts-box :<c>ontrol<r>ef)
(moon-facts-control-id :<c>ontrol<id>
:signature +application-signature+
:id +moon-facts-field-id+))
(#_GetControlByID windowref moon-facts-control-id moon-facts-box)
(#_ShowWindow windowref)
(#_SelectWindow windowref)
(#_SetControlData (ccl::%get-ptr moon-facts-box)
#$kControlEntireControl #$kControlEditTextCFStringTag
(ccl::%foreign-type-or-record-size
:<cfs>tring<r>ef :bytes) &text)
(#_CFRelease (ccl::%get-ptr &text))
(#_Draw1Control (ccl::%get-ptr moon-facts-box))))
In the call to #_CFRelease, I can just pass &text or I can do what I'm
doing and pass (ccl::%get-ptr &text) with no visible difference. I
don't know how clever #_CFRelease is and I don't want to have some
small memory leak that potentially fragments my address space. I'm not
at all sure on how to run the application in a debugger to verify
anything.
Right now, I use CCL::SAVE-APPLICATION to create an image and then copy
the lisp kernel and image into an application bundle that can be
launched from Finder:
(ccl::save-application image-name :toplevel-function #'main)
This makes my current development cycle a rather C like compile and
run. Unfortunately, I don't have the benefit of being able to setup
break points and step through the code in a debugger. Is this
something I can do in OpenMCL 0.14.2-p1? I have been able to include
SLIME in the image so that I can connect to it from Emacs. I haven't
figured out how to trace the code that way though. I also seem to
loose the FFI database files needed for #_ and #$ to work properly.
I also have an annoying issue with #_CFBundleCopyLocalizedString
returning a string that matches +moon-facts-text-key+ instead of the
one in Localizable.strings. I don't know what I'm doing wrong there.
More information about the Openmcl-devel
mailing list