Skip to content

Commit

Permalink
Document run_module_predicate and handle critical failure in toplevel.pl
Browse files Browse the repository at this point in the history
  • Loading branch information
adri326 committed Feb 6, 2025
1 parent d4bf52e commit e68ac83
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/machine/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,11 @@ impl Machine {
.unwrap()
}

/// Runs the predicate `key` in `module_name` until completion.
/// Siltently ignores failure, thrown errors and choice points.
///
/// Consider using [`Machine::run_query`] if you wish to handle
/// predicates that may fail, leave a choice point or throw.
pub(crate) fn run_module_predicate(
&mut self,
module_name: Atom,
Expand All @@ -279,6 +284,7 @@ impl Machine {
if let Some(module) = self.indices.modules.get(&module_name) {
if let Some(code_index) = module.code_dir.get(&key) {
let p = code_index.local().unwrap();
// Leave a halting choice point to backtrack to in case the predicate fails or throws.
self.allocate_stub_choice_point();

self.machine_st.cp = BREAK_FROM_DISPATCH_LOOP_LOC;
Expand Down
13 changes: 13 additions & 0 deletions src/toplevel.pl
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,19 @@
).

'$repl' :-
catch(
start_repl,
_,
% Something bad enough happened that the REPL itself threw an error.
% This can be caused by a broken user_output stream, so we cannot
% print an error.
%
% The best we can do now is halt with an error code,
% so that users can try to diagnose the issue:
halt(99)
).

start_repl :-
asserta('$toplevel':started),
raw_argv(Args0),
( append(Args1, ["--"|_], Args0) ->
Expand Down

0 comments on commit e68ac83

Please sign in to comment.