diff --git a/src/array.c b/src/array.c index e8fe55aae9b1ef04279d8b13b1cb6ee97737b1eb..23894e04a2c6143fdd2fb9c8929a442c2b4f4107 100644 --- a/src/array.c +++ b/src/array.c @@ -105,7 +105,13 @@ void really_free_array(struct array *v) fatal("Tried to free the empty_array.\n"); #endif +#ifdef DEBUG + if(d_flag > 1) array_check_type_field(v); +#endif + + v->refs++; free_svalues(ITEM(v), v->size, v->type_field); + v->refs--; array_free_no_free(v); } @@ -1421,9 +1427,12 @@ void gc_check_all_arrays() /* Ugly, but we are not allowed to change type_field * at the same time as the array is being built... + * Actually we just need beter primitives for building arrays. */ if(!(a->type_field & BIT_UNFINISHED) || a->refs!=1) a->type_field = t; + else + a->type_field |= t; } a=a->next; @@ -1472,3 +1481,31 @@ void gc_free_all_unreferenced_arrays() #endif /* GC2 */ +#ifdef DEBUG + +void debug_dump_type_field(TYPE_FIELD t) +{ + int e; + for(e=0;e<MAX_TYPE;e++) + if(t & (1<<e)) + fprintf(stderr," %s",get_name_of_type(e)); + + for(;e<16;e++) + if(t & (1<<e)) + fprintf(stderr," <%d>",e); +} + +void debug_dump_array(struct array *a) +{ + fprintf(stderr,"Refs=%d, next=%p, prev=%p, size=%d, malloced_size=%d\n", + a->refs, + a->next, + a->prev, + a->size, + a->malloced_size); + fprintf(stderr,"Type field = "); + debug_dump_type_field(a->type_field); + fprintf(stderr,"\n"); + simple_describe_array(a); +} +#endif