English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
problem creating .cma library
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2010-01-11 (17:11)
From: Guillaume Yziquel <guillaume.yziquel@c...>
Subject: Re: [Caml-list] problem creating .cma library
Gerd Stolpmann a écrit :
>> Would it be legitimate to include CAMLlocal2 inside the error-handling 
>> braces?
> No. You would start a new context for local roots, and there is no way
> to end it (CAMLreturn ends the context).
> There are the macros Begin_roots<n> and End_roots that should be used in
> this case, e.g.
> if (error) {
>   value ml_error_call = Val_unit;
>   value ml_error_message = Val_unit;
>   Begin_roots2(ml_error_call, ml_error_message);
>   ...
>   End_roots();
>   raise_with_arg(...)
> }

End_roots before caml_raise_with_arg? Why not after?

I mean, you do not do a CAMLreturn before a caml_raise_with_args, so why 
should't this be the same for End_roots()?

> The macros are only documented in memory.h.
> So far I know, raising an exception from within Begin_roots/End_roots is
> not allowed.

It seems to me that the major issue is how caml_local_roots gets 
restored. With the CAMLparam/CAMLreturn macros, this is done by storing 
its original value in caml__frame and restoring it via CAMLreturn.

As it is written in memory.h

> Your function may raise an exception or return a [value] with the
> [CAMLreturn] macro.

I assume that caml_local_roots gets restored by a mechanism in the 'try' 
of the 'try / with' construct after the siglongjmp of caml_raise.

Therefore it should be OK to use caml_raise_with_args before End_roots().

Am I right, or is this plainly wild guessing?

      Guillaume Yziquel