/*-------------------------------------------------------------------------* * PL_THROW_2 * * * *-------------------------------------------------------------------------*/ void Pl_Throw_2(WamWord ball_word, WamWord b_word) { WamWord word, tag_mask; WamWord *b; StmInf *pstm; DEREF(b_word, word, tag_mask); b = From_WamWord_To_B(word); if (b <= pl_query_top_b && pl_query_top_b != NULL) { Assign_B(pl_query_top_b); pl_query_exception = ball_word; Pl_Exit_With_Exception(); } if (b == LSSA) { pstm = pl_stm_tbl[pl_stm_top_level_output]; Pl_Stream_Printf(pstm, "\nsystem_error(cannot_catch_throw("); Pl_Write_Term(pstm, -1, MAX_PREC, WRITE_NUMBER_VARS | WRITE_NAME_VARS | WRITE_QUOTED, NULL, ball_word); Pl_Stream_Printf(pstm, "))\n"); return; } Pl_Cut(b_word); }
/*-------------------------------------------------------------------------* * PL_QUERY_END * * * *-------------------------------------------------------------------------*/ void Pl_Query_End(int op) { WamWord *query_b, *prev_b, *b; Bool recoverable; if (query_stack_top == query_stack) Pl_Fatal_Error("Pl_Query_End() but no query remaining"); query_b = *--query_stack_top; pl_query_top_b = query_stack_top[-1]; recoverable = (ALTB(query_b) == Prolog_Predicate(PL_QUERY_RECOVER_ALT, 0)); prev_b = BB(query_b); switch (op) { case PL_RECOVER: Assign_B(query_b); if (!recoverable) Pl_Fatal_Error("Pl_Query_End(PL_RECOVER) but unrecoverable query"); Pl_Delete_Choice_Point(0); /* remove recover chc-point */ break; case PL_CUT: Assign_B((recoverable) ? prev_b : query_b); break; default: /* case PL_KEEP_FOR_PROLOG */ if (recoverable) { if (B == query_b) Assign_B(prev_b); else for (b = B; b > query_b; b = BB(b)) /* unlink recover chc-point */ if (BB(b) == query_b) BB(b) = prev_b; } Pl_Keep_Rest_For_Prolog(query_b); } }