static void _mark_heap_array(t_heap_array *obj) /* obj != NULL */ { pword *p = obj->array; int i = DidArity(p[0].val.did); mark_dids_from_pwords(p, p + 1); for (; i > 0; --i) { mark_dids_from_heapterm(&p[i]); } }
void mark_dids_from_properties(property *prop_list) { for (; prop_list; prop_list = prop_list->next_prop) { register property *p = prop_list; do { if (p->module != D_UNKNOWN) { switch (p->name) { case ARRAY_PROP: mark_dids_from_array(&p->property_value); break; case GLOBVAR_PROP: mark_dids_from_heapterm(&p->property_value); break; case HTABLE_PROP: { extern t_ext_type heap_htable_tid; heap_htable_tid.mark_dids((t_ext_ptr)p->property_value.val.wptr); } break; case SHELF_PROP: { extern t_ext_type heap_array_tid; heap_array_tid.mark_dids((t_ext_ptr)p->property_value.val.wptr); } break; case IDB_PROP: { extern t_ext_type heap_rec_header_tid; heap_rec_header_tid.mark_dids((t_ext_ptr)p->property_value.val.wptr); } break; case TRANS_PROP: case WRITE_TRANS_PROP: case GOAL_TRANS_PROP: case WRITE_GOAL_TRANS_PROP: case CLAUSE_TRANS_PROP: case WRITE_CLAUSE_TRANS_PROP: { macro_desc *md = (macro_desc *) p->property_value.val.ptr; Mark_Did(md->trans_function); Mark_Did(md->module); } break; case MODULE_PROP: { module_item *m = (module_item *) p->property_value.val.ptr; register didlist *scan; for (scan = m->imports; scan; scan = scan->next) { Mark_Did(scan->name); } } break; case STREAM_PROP: /* just an integer */ break; case PREFIX_PROP: /* did */ case INFIX_PROP: /* did */ case POSTFIX_PROP: /* did */ case SYSCALL_PROP: /* did or integer */ case EVENT_PROP: /* pri */ mark_dids_from_pwords(&p->property_value, &p->property_value + 1); break; default: p_fprintf(current_err_, "Unknown property type %d in mark_dids_from_properties()\n", p->name); ec_flush(current_err_); break; } } p = p->next_mod; } while (p != prop_list); } }