Greetings, I need some help. I am calling a foreign C function that calls back to Scheme (using CHICKEN_apply). The callback returns a list as its value. The foreign function creates a static reference to this list (using CHICKEN_new_gc_root). The foreign function then creates a different list on the stack (using C_list).
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. --Alex Here is the kind of code I am using: /* 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 ); ... ... (no callbacks) ... ... /* CREATE LIST NUMBER 2 */ C_word *second_list_mem = C_alloc( C_SIZEOF_LIST( second_list_size ) + second_list_size * C_SIZEOF_POINTER ); C_word second_list = C_list( &second_list_mem, second_list_size ); C_word list_pos = second_list int k = 0; while ( !C_truep( C_i_nullp( list_pos ) ) ) { C_set_block_item( list_pos, 0, C_mpointer( &second_list_mem, second_list_array[k] ) ); list_pos = C_u_i_cdr( list_pos ); k += 1; } /* APPEND LIST 2 ONTO LIST 1 */ first_list = CHICKEN_gc_root_ref( gc_root ); if ( !C_truep( C_i_nullp( first_list ) ) ) { list_pos = first_list; for ( int k = 0; k < first_list_size; k++ ) { list_pos = C_u_i_cdr( list_pos ); } C_set_block_item( list_pos, 1, second_list ); } else { first_list = second_list; } /* PASS THE COMBINED LIST TO THE OTHER CALLBACK */ callback2( first_list ); _______________________________________________ Chicken-users mailing list Chicken-users@nongnu.org https://lists.nongnu.org/mailman/listinfo/chicken-users