@@ -154,6 +154,18 @@ impl MachineError {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub(super)
|
||||||
|
fn interrupt_error() -> Self {
|
||||||
|
let stub = functor!("$interrupt_thrown");
|
||||||
|
|
||||||
|
MachineError {
|
||||||
|
stub,
|
||||||
|
location: None,
|
||||||
|
from: ErrorProvenance::Received,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(super)
|
pub(super)
|
||||||
fn evaluation_error(eval_error: EvalError) -> Self {
|
fn evaluation_error(eval_error: EvalError) -> Self {
|
||||||
let stub = functor!("evaluation_error", [atom(eval_error.as_str())]);
|
let stub = functor!("evaluation_error", [atom(eval_error.as_str())]);
|
||||||
|
|||||||
@@ -3089,6 +3089,14 @@ impl MachineState {
|
|||||||
self.p += 1;
|
self.p += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn throw_interrupt_exception(&mut self) {
|
||||||
|
let err = MachineError::interrupt_error();
|
||||||
|
let src = functor!("repl");
|
||||||
|
let err = self.error_form(err, src);
|
||||||
|
|
||||||
|
self.throw_exception(err);
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_call_clause(
|
fn handle_call_clause(
|
||||||
&mut self,
|
&mut self,
|
||||||
indices: &mut IndexStore,
|
indices: &mut IndexStore,
|
||||||
@@ -3105,8 +3113,7 @@ impl MachineState {
|
|||||||
let interrupted = INTERRUPT.load(std::sync::atomic::Ordering::Relaxed);
|
let interrupted = INTERRUPT.load(std::sync::atomic::Ordering::Relaxed);
|
||||||
|
|
||||||
if INTERRUPT.compare_and_swap(interrupted, false, std::sync::atomic::Ordering::Relaxed) {
|
if INTERRUPT.compare_and_swap(interrupted, false, std::sync::atomic::Ordering::Relaxed) {
|
||||||
self.reset();
|
self.throw_interrupt_exception();
|
||||||
self.fail = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -214,6 +214,9 @@ gather_goals([Var = Value | Pairs], VarList, Goals) :-
|
|||||||
).
|
).
|
||||||
|
|
||||||
print_exception(E) :-
|
print_exception(E) :-
|
||||||
|
( E == error('$interrupt_thrown', repl) -> nl % print the exception on a newline to evade "^C".
|
||||||
|
; true
|
||||||
|
),
|
||||||
write_term('caught: ', [quoted(false), max_depth(20)]),
|
write_term('caught: ', [quoted(false), max_depth(20)]),
|
||||||
writeq(E),
|
writeq(E),
|
||||||
nl.
|
nl.
|
||||||
|
|||||||
Reference in New Issue
Block a user