On Tue, May 06, 2014 at 03:39:31AM -0600, Alex Stuart wrote: > Greetings, >
Hi there! > I want to append the latter list to the former and pass it to a second > callback function. I'm trying to do this by setting the cdr of the first > list's last pair (using C_set_block_item). However, the appended list is > wrong. > > I'm guessing that garbage collection is messing with the list even > though I dereference my GC root to read the first part of it. Things > work fine if I just pass that part, but appending the other part doesn't > work. > > Is the problem that the first list is heap-allocated and the second list > is stack-allocated? Am I approaching this the wrong way? I would much > appreciate any advice I can get. I think the problem is that you're setting the pointer to the first_list in the gc_root. I don't know the type of first_list, but CHICKEN_apply expects an address of a C_word, to which it will write the list's cons cell. When using CHICKEN_gc_root_set, you should pass the C_word, not its address. > /* RETRIEVE LIST NUMBER 1 */ > CHICKEN_apply( CHICKEN_gc_root_ref( callback1 ), arg_list, first_list ); > void *gc_root = CHICKEN_new_gc_root(); > CHICKEN_gc_root_set( gc_root, first_list ); Assuming first_list is a C_word, that should be: CHICKEN_apply( CHICKEN_gc_root_ref( callback1 ), arg_list, &first_list ); void *gc_root = CHICKEN_new_gc_root(); CHICKEN_gc_root_set( gc_root, first_list ); Cheers, Peter -- http://www.more-magic.net _______________________________________________ Chicken-users mailing list [email protected] https://lists.nongnu.org/mailman/listinfo/chicken-users
