<div dir="ltr">Jeremy,<div><br></div><div>Thanks for this work! I just got a chance this morning to take a look. This work should save me a ton of time.</div><div><br></div><div>I'm having problems referencing a cstub'd struct within another cstub'd struct. Looking at the types it doesn't seem that this would work  - the cstubs typ is different than the Ctypes.typ. I reproduced a tiny example in the cstubs test files (diff below).</div><div><br></div><div>Thoughts? Thanks.</div><div><br></div><div>Trevor</div><div><br></div><div>Diff:</div><div><br></div><div><div>diff --git a/tests/clib/test_functions.h b/tests/clib/test_functions.h</div><div>index 17ec554..ec0e449 100644</div><div>--- a/tests/clib/test_functions.h</div><div>+++ b/tests/clib/test_functions.h</div><div>@@ -164,7 +164,7 @@ void post1_wait2(void);</div><div> void post2_wait1(void);</div><div><br></div><div> struct s1 { int x1, x2, x3, x4; };</div><div>-struct s2 { int y1, y2, y3, y4; };</div><div>+struct s2 { int y1, y2, y3, y4; struct s1 foo; };</div><div><br></div><div> size_t sizeof_s1(void);</div><div> size_t alignmentof_s1(void);</div><div>diff --git a/tests/test-structs/stubs/<a href="http://types.ml">types.ml</a> b/tests/test-structs/stubs/<a href="http://types.ml">types.ml</a></div><div>index d03f497..fc54f25 100644</div><div>--- a/tests/test-structs/stubs/<a href="http://types.ml">types.ml</a></div><div>+++ b/tests/test-structs/stubs/<a href="http://types.ml">types.ml</a></div><div>@@ -21,5 +21,6 @@ struct</div><div>   let s2 : [`s2] structure typ = structure "s2"</div><div>   let y2 = field s2 "y2" int</div><div>   let y1 = field s2 "y1" int</div><div>+  let foo = field s2 "foo" s1</div><div>   let () = seal s2</div><div> end</div></div><div><br></div><div>Build error:</div><div><br></div><div><div>File "tests/test-structs/stubs/<a href="http://types.ml">types.ml</a>", line 24, characters 32-34:</div><div>Error: This expression has type [ `s1 ] Ctypes.structure S.typ</div><div>       but an expression was expected of type 'a Ctypes.typ = 'a Static.typ</div></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Oct 25, 2014 at 2:31 PM, Jeremy Yallop <span dir="ltr"><<a href="mailto:yallop@gmail.com" target="_blank">yallop@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 20 October 2014 21:46, Jeremy Yallop <<a href="mailto:yallop@gmail.com">yallop@gmail.com</a>> wrote:<br>
> This discussion is a useful reminder that ctypes really needs support<br>
> for retrieving struct layout details from the declared API.  I'll look<br>
> at how to add that support later this week and report back.<br>
<br>
</span>I've added support for retrieving struct layout from C in a pull request:<br>
<br>
    <a href="https://github.com/ocamllabs/ocaml-ctypes/pull/62" target="_blank">https://github.com/ocamllabs/ocaml-ctypes/pull/62</a><br>
<br>
It works in a very similar fashion to cstubs: you put your struct<br>
declaration inside a functor<br>
<br>
  module Bindings(S : Cstubs_structs.STRUCT) =<br>
  struct<br>
    open S<br>
    let cell       = structure "cell"<br>
    let payload = field cell int "payload"<br>
    let next      = field cell (ptr cell) "next"<br>
    let ()          = seal cell<br>
  end<br>
<br>
and then call Cstubs_structs.write_c to generate an ML module with<br>
which to instantiate the functor.<br>
<br>
The pull request has more details and some illustrative tests.<br>
</blockquote></div><br></div>