MR_Word MR_arg_name_vector_to_list(int arity, const MR_ConstString *arg_names) { MR_Word arg_names_list; MR_restore_transient_registers(); arg_names_list = MR_list_empty(); if (arg_names == NULL) { /* No arguments have names. */ while (arity > 0) { --arity; arg_names_list = MR_string_list_cons((MR_Word) NULL, arg_names_list); } } else { while (arity > 0) { --arity; arg_names_list = MR_string_list_cons((MR_Word) arg_names[arity], arg_names_list); } } MR_save_transient_registers(); return arg_names_list; }
const char * MR_trace_add_cat(const char *category, int slot, const char *text) { MR_Word path; MR_trace_help_ensure_init(); MR_trace_add_help_word(category); MR_TRACE_USE_HP( path = MR_list_empty(); );
MR_Word MR_type_params_vector_to_list(int arity, MR_TypeInfoParams type_params) { MR_TypeInfo arg_type; MR_Word type_info_list; MR_restore_transient_registers(); type_info_list = MR_list_empty(); while (arity > 0) { type_info_list = MR_type_info_list_cons((MR_Word) type_params[arity], type_info_list); --arity; } MR_save_transient_registers(); return type_info_list; }
MR_Word MR_pseudo_type_info_vector_to_pseudo_type_info_list(int arity, MR_TypeInfoParams type_params, const MR_PseudoTypeInfo *arg_pseudo_type_infos) { MR_PseudoTypeInfo pseudo; MR_PseudoTypeInfo arg_pseudo_type_info; MR_Word pseudo_type_info_list; MR_restore_transient_registers(); pseudo_type_info_list = MR_list_empty(); while (--arity >= 0) { /* Get the argument type_info */ pseudo = arg_pseudo_type_infos[arity]; if (MR_PSEUDO_TYPEINFO_IS_VARIABLE(pseudo) && MR_TYPE_VARIABLE_IS_EXIST_QUANT(pseudo)) { arg_pseudo_type_info = pseudo; } else { MR_save_transient_registers(); arg_pseudo_type_info = MR_create_pseudo_type_info( (MR_PseudoTypeInfoParams) type_params, pseudo); MR_restore_transient_registers(); MR_save_transient_registers(); arg_pseudo_type_info = MR_collapse_equivalences_pseudo(arg_pseudo_type_info); MR_restore_transient_registers(); } pseudo_type_info_list = MR_pseudo_type_info_list_cons( (MR_Word) arg_pseudo_type_info, pseudo_type_info_list); } MR_save_transient_registers(); return pseudo_type_info_list; }
MR_bool MR_trace_get_action(MR_IoActionNum action_number, MR_ConstString *proc_name_ptr, MR_Word *is_func_ptr, MR_Word *arg_list_ptr) { const MR_TableIoDecl *table_io_decl; const MR_ProcLayout *proc_layout; MR_ConstString proc_name; MR_Word is_func; MR_Word arg_list; MR_Word arg; int filtered_arity; int arity; int hv; MR_TrieNode answer_block_trie; MR_Word *answer_block; MR_TypeInfo *type_params; MR_TypeInfo type_info; if (! (MR_io_tabling_start <= action_number && action_number < MR_io_tabling_counter_hwm)) { return MR_FALSE; } MR_TABLE_START_INT(NULL, MR_tabledebug, MR_FALSE, answer_block_trie, (MR_TrieNode) &MR_io_tabling_pointer, MR_io_tabling_start, action_number); answer_block = answer_block_trie->MR_answerblock; if (answer_block == NULL) { return MR_FALSE; } table_io_decl = (const MR_TableIoDecl *) answer_block[0]; proc_layout = table_io_decl->MR_table_io_decl_proc; filtered_arity = table_io_decl->MR_table_io_decl_filtered_arity; MR_generate_proc_name_from_layout(proc_layout, &proc_name, &arity, &is_func); type_params = MR_materialize_answer_block_type_params( table_io_decl->MR_table_io_decl_type_params, answer_block, filtered_arity); MR_restore_transient_hp(); arg_list = MR_list_empty(); MR_save_transient_hp(); for (hv = filtered_arity; hv >= 1; hv--) { type_info = MR_create_type_info(type_params, table_io_decl->MR_table_io_decl_ptis[hv - 1]); MR_restore_transient_hp(); MR_new_univ_on_hp(arg, type_info, answer_block[hv]); arg_list = MR_univ_list_cons(arg, arg_list); MR_save_transient_hp(); } MR_free(type_params); *proc_name_ptr = proc_name; *is_func_ptr = is_func; *arg_list_ptr = arg_list; return MR_TRUE; }
MR_bool MR_trace_get_action(MR_IoActionNum action_number, MR_ConstString *proc_name_ptr, MR_Word *is_func_ptr, MR_bool *have_arg_infos_ptr, MR_Word *arg_list_ptr) { const MR_TableIoEntry *table_io_entry; const MR_ProcLayout *proc_layout; MR_ConstString proc_name; MR_Word is_func; int arity; int hv; MR_TrieNode answer_block_trie; MR_Word *answer_block; if (! (MR_io_tabling_start <= action_number && action_number < MR_io_tabling_counter_hwm)) { return MR_FALSE; } MR_TABLE_START_INT(NULL, MR_tabledebug, MR_FALSE, answer_block_trie, (MR_TrieNode) &MR_io_tabling_pointer, MR_io_tabling_start, action_number); answer_block = answer_block_trie->MR_answerblock; if (answer_block == NULL) { return MR_FALSE; } table_io_entry = (const MR_TableIoEntry *) answer_block[0]; proc_layout = table_io_entry->MR_table_io_entry_proc; MR_generate_proc_name_from_layout(proc_layout, &proc_name, &arity, &is_func); *proc_name_ptr = proc_name; *is_func_ptr = is_func; if (table_io_entry->MR_table_io_entry_have_arg_infos) { int filtered_arity; MR_Word arg_list; MR_Word arg; MR_TypeInfo *type_params; MR_TypeInfo type_info; *have_arg_infos_ptr = MR_TRUE; filtered_arity = table_io_entry->MR_table_io_entry_num_ptis; type_params = MR_materialize_answer_block_type_params( table_io_entry->MR_table_io_entry_type_params, answer_block, filtered_arity); MR_restore_transient_hp(); arg_list = MR_list_empty(); MR_save_transient_hp(); for (hv = filtered_arity; hv >= 1; hv--) { type_info = MR_create_type_info(type_params, table_io_entry->MR_table_io_entry_ptis[hv - 1]); MR_restore_transient_hp(); MR_new_univ_on_hp(arg, type_info, answer_block[hv]); arg_list = MR_univ_list_cons(arg, arg_list); MR_save_transient_hp(); } MR_free(type_params); *arg_list_ptr = arg_list; } else { *have_arg_infos_ptr = MR_FALSE; // *arg_list_ptr is not meaningful when *have_arg_infos_ptr is false, // but setting it to the empty list makes it easier to catch any // caller that ignores that fact. *arg_list_ptr = MR_list_empty(); } return MR_TRUE; }