- GC_arobjfreelist = (ptr_t *)
- GC_INTERNAL_MALLOC((MAXOBJSZ+1)*sizeof(ptr_t), PTRFREE);
- if (GC_arobjfreelist == 0) ABORT("Couldn't allocate GC_arobjfreelist");
- BZERO(GC_arobjfreelist, (MAXOBJSZ+1)*sizeof(ptr_t));
- if (GC_n_mark_procs >= MAX_MARK_PROCS)
- ABORT("No slot for array mark proc");
- GC_array_mark_proc_index = GC_n_mark_procs++;
- if (GC_n_kinds >= MAXOBJKINDS)
- ABORT("No kind available for array objects");
- GC_array_kind = GC_n_kinds++;
- GC_obj_kinds[GC_array_kind].ok_freelist = GC_arobjfreelist;
- GC_obj_kinds[GC_array_kind].ok_reclaim_list = 0;
- GC_obj_kinds[GC_array_kind].ok_descriptor =
- GC_MAKE_PROC(GC_array_mark_proc_index, 0);;
- GC_obj_kinds[GC_array_kind].ok_relocate_descr = FALSE;
- GC_obj_kinds[GC_array_kind].ok_init = TRUE;
- /* Descriptors are in the last word of the object. */
- GC_mark_procs[GC_array_mark_proc_index] = GC_array_mark_proc;
+ GC_arobjfreelist = (ptr_t *)GC_new_free_list_inner();
+ GC_array_mark_proc_index = GC_new_proc_inner(GC_array_mark_proc);
+ GC_array_kind = GC_new_kind_inner(
+ (void **)GC_arobjfreelist,
+ GC_MAKE_PROC(GC_array_mark_proc_index, 0),
+ FALSE, TRUE);