[gambit-list] Allocate Scheme vector before or after C call?
    Lassi Kortela 
    lassi at lassi.io
       
    Sat Jul 18 09:28:06 EDT 2020
    
    
  
Especially thinking of the common C idiom where we don't know the right 
buffer size in advance, and keep trying increasing powers-of-two until 
we find one that works. Pseudo-code:
for (n = 32; n < size_limit; n *= 2) {
     ___SCMOBJ vector = ___EXT(___alloc_scmobj)(NULL, ___sFooVECTOR, n * 
sizeof(foo_t));
     foo_t *body = ___CAST(foo_t *, ___BODY(vector));
     int result = get_value_from_some_c_api(body, n);
     ___EXT(___release_scmobj)(vector);
     if (result == success) {
         ___return(vector);
     } else if (result != buffer_too_small) {
         ___return(___FAL);
     }
     // dispose of the vector here
}
___return(___FAL);
Another option would be to do the above loop using standard C realloc(), 
but then have a Gambit API that "takes ownership" of a buffer that comes 
from malloc() and adds a Scheme object header to it. Does that kind of 
approach make any sense in Gambit?
    
    
More information about the Gambit-list
mailing list