Le Monday 08 Aug 2011 à 13:15:04 (+1000), Erik de Castro Lopo a écrit :
> Hi all,
>
> I'm writing a C stub function to allow the calling of a C library
> function from ocaml. The return from the stub is a tuple and I'm
> doing this:
>
> /* Package up the result as a tuple. */
> v_response = caml_alloc_tuple (3) ;
>
> Store_field (v_response, 0, Val_int (width)) ;
> Store_field (v_response, 1, Val_int (height)) ;
> Store_field (v_response, 2, caml_copy_string (code)) ;
>
> CAMLreturn (v_response) ;
>
> The above works now, but didn't work when I was using
> caml_copy_nativeint() instead of Val_int() and I'd like to know
> why. I found it especially confusing because caml_copy_string()
> worked and was obvioulsy the right thing to do.
Did you use CAMLlocal on v_response? Why don't you use some intermediate
variable to store the result of caml_copy_nativeint beforehand and then use
Store_field (or even a Field () = assignment with caml_alloc_small this case)?
Judging by the code of caml_copy_nativeint in ints.c:
CAMLexport value caml_copy_nativeint(intnat i)
{
value res = caml_alloc_custom(&caml_nativeint_ops, sizeof(intnat), 0,
1);
Nativeint_val(res) = i;
return res;
}
and of Store_field in memory.h
#define Store_field(block, offset, val) do{ \
mlsize_t caml__temp_offset = (offset); \
value caml__temp_val = (val); \
caml_modify (&Field ((block), caml__temp_offset), caml__temp_val); \
}while(0)
I do not see why that wouldn't work if CAMLlocal is properly used on
v_response. If it's not properly used, you may be invalidating the
v_response pointer when evaluating caml_copy_nativeint in the line
value caml__temp_val = (val);
Other than that, I do not really see an issue with your code.
What do you mean by "doesn't work" precisely?
> Cheers,
> Erik
--
Guillaume Yziquel
--
Caml-list mailing list. Subscription management and archives:
https://sympa-roc.inria.fr/wws/info/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs