Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] interfacing C and OCaml
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Mikhail Fedotov <mikhail@k...>
Subject: Re[4]: [Caml-list] interfacing C and OCaml
Hello art,

Friday, June 27, 2003, 4:57:13 PM, you wrote:

>> Sorry, I've made a mistake myself. I've been talking mostly about "void" vs "value"
>> issue in your examples, but this is already addressed in the manual by stating that
>> the primitive function must return value. The documentation lacks introduction into
>> the macroses "CAMLprim", "CAMLextern" etc, but they are not strictly required now
>> if you are not dealing with Windows DLLs.

ay> In my experience, it's completely safe to use the macros no matter where the
ay> code is called from.  You can omit them only when that would be safe, (i.e.
ay> you don't allocate anything into the caml heap).  You can get away with not
ay> being nice to the GC only when you don't do anything that can trigger the
ay> collector.  This means that if you do any alloc, alloc_tuple, copy_string, 
ay> etc., then you must use them.  It's not only for windows DLLs.

Hmpf. I've made one more mistake by not being specific enough. You are
talking about the CAMLparam/CAMLlocal macroses, and I'm talking about
CAMLprim/CAMLextern macroses; those that I'm talking about are used
as a prefix to a function name/type, not inside the body.

If you have a "unit"-type function, you still need it to have a return
value of type "value" with the value "Val_unit". This was en error in
the first example if you would want to export that function to OCaml.

If you don't use CAMLprim macroses you are introducing the risk that
you code will need to be changed for someone to use.

BTW, if you are calling one C function from another one with passing
or returning values, you can escape from the need to use
CAMLparam/CAMLlocal by passing a pointer to the values that are
already CAMLparam-ed in the calling function, i.e. use "value*" type
for function parameters for the functions that you don't need to

Best regards,

To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: