Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] end-of-block CAMLreturn?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Xavier Leroy <xavier.leroy@i...>
Subject: Re: [Caml-list] end-of-block CAMLreturn?
> Is there a way to do a CAMLreturn without the return?  From looking at
> memory.h it appears not, but it appears it would be easy to make a
> macro to do it (#define CAMLendblock local_roots = caml__frame; or
> something like that should work).
> 
> In other words, I want to have a loop that calls back to caml, but I
> don't want to keep shoving more stuff on the roots list, since I don't
> care about the previous loop's allocations:
> 
> for(i=0;i<n;++i) {
>    CAMLlocal(foo,bar);
>    // use foo bar
>    // callback to caml with foo bar, maybe somebody stores them somewhere
>    CAMLendblock();  // want this
> }

If I follow you correctly, there are two ways to achieve the desired
behavior.  One is to use the older API for GC root registration:
Begin_roots and End_roots.  (There is some documentation in comments
in file <caml/memory.h>.)

  for(i=0;i<n;++i) {
    foo = bar = Val_unit;
    Begin_roots(foo,bar);
    // use foo bar
    // callback to caml with foo bar, maybe somebody stores them somewhere
    End_roots();
  }

The other way, perhaps preferable, is to move the root registration
outside the loop:

  CAMLlocal(foo,bar);
  for(i=0;i<n;++i) {
    // use foo bar
    // callback to caml with foo bar, maybe somebody stores them somewhere
    foo = bar = Val_unit;  /* don't keep roots longer than necessary
  }
  CAMLreturn(whatever);

Hope this helps,

- Xavier Leroy

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners