On Wed, Apr 24, 2013 at 4:35 AM, Willem Rein Oudshoorn <span dir="ltr"><<a href="mailto:woudshoo@xs4all.nl" target="_blank">woudshoo@xs4all.nl</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
Thank you for all your work and the time to answer my questions.<br>
<div class="im"><br>
Liam Healy <<a href="mailto:lnp@healy.washington.dc.us">lnp@healy.washington.dc.us</a>> writes:<br>
<br>
> Willem,<br>
><br>
> Thanks for the report.<br>
><br>
> My thinking is that with-foreign-slots is intended to expose the value (and<br>
> not the pointer), and therefore, expands to foreign-slot-value, so the<br>
> behavior you're seeing is correct. Your fix to your code is the correct way<br>
> to access the pointer. I think with-foreign-slots is provided as a<br>
> convenient shortcut to get all the values; since it doesn't do what you<br>
> need, you need to use the actual access form (foreign-slot-pointer in your<br>
> case).<br>
<br>
</div>Ah, ok, I am a bit struggling to convert the old way to the new way.  It<br>
probably has nothing to do with (with-foreign-slots ...), but just my<br>
mis understanding and trying to quickly convert old code to new.<br></blockquote><div><br></div><div>Well, there's a bit of unwritten convention being used, so confusion is understandable (and I had to think about it and infer what with-foreign-slots is intended to do). Before we introduced structures-by-value, this wasn't an issue.</div>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im"><br>
> For your second question: if the argument is actually a pointer to the<br>
> structure, :pointer is the right thing to use. Are you sure it is a pointer<br>
> argument? Check the .h file where it is defined.<br>
><br></div></blockquote><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
</div>Ah, I do not have an issue with passing it to the c library.<br>
What I meant was that in my mind the following confused me:<br>
<br>
     (let ((c-oid (foreing-alloc '(:struct git-oid))))<br>
        ;;; I think of c-oid, conceptually as type<br>
        ;;;  (:pointer (:struct git-oid))<br>
        ;;;; later:<br>
<br>
           (foreign-slot-pointer c-oid '(:struct git-oid) 'id)<br>
           ;;; I thought that because c-oid is of type<br>
           ;;; (:pointer (:struct git-oid))<br>
           ;;; I thought I needed to put here<br>
           ;;;   '(:pointer (:struct git-oid)) instead of<br>
           ;;;   '(:struct git-oid)<br>
<br>
Does this make sense?<br></blockquote><div><br></div><div>The <a href="http://common-lisp.net/project/cffi/manual/html_node/foreign_002dslot_002dpointer.html">documentation to foreign-slot-pointer</a> says </div><div>" ptr</div>

<div>A pointer to a structure. </div><div>type</div><div>A foreign structure type. "</div><div><br></div><div>so it makes sense to me the that first argument is a pointer to a structure, and the second argument is the type of that structure (and not the type of the first argument, i.e., the pointer type). </div>

<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
Now I have a small additional question.<br>
<br>
I have a struct like:<br>
<br>
(defcstruct (git-index-time :class index-time-struct)<br>
            ....)<br>
<br>
Now the (translate-from-foreign value (type index-time-struct))<br>
works if I use as type:<br>
<br>
  (:struct git-index-time)<br>
<br>
So everyting works.   However, if I do:<br>
<br>
(defctype struct-index-time (:struct git-index-time))<br>
<br>
And use as type:<br>
<br>
  struct-index-time<br>
<br>
The `translate-from-foreign` is not called and I end up<br>
with untranslated values.<br>
<br>
I thought that (defctype ...) worked as a typedef and<br>
naively expected the type translation to still work.<br>
<br>
Is this as expected?<br>
<br></blockquote><div><br></div><div>No, that seems like a CFFI error. Per Luis, a bug report would be helpful.</div><div> </div><div>Liam</div></div><br>