Merge pull request #563 from triska/master
ADDED: halt/1, halting with specified exit code
This commit is contained in:
@@ -580,7 +580,7 @@ impl SystemClauseType {
|
|||||||
("$get_lh_from_offset_diff", 3) => Some(SystemClauseType::GetLiftedHeapFromOffsetDiff),
|
("$get_lh_from_offset_diff", 3) => Some(SystemClauseType::GetLiftedHeapFromOffsetDiff),
|
||||||
("$get_double_quotes", 1) => Some(SystemClauseType::GetDoubleQuotes),
|
("$get_double_quotes", 1) => Some(SystemClauseType::GetDoubleQuotes),
|
||||||
("$get_scc_cleaner", 1) => Some(SystemClauseType::GetSCCCleaner),
|
("$get_scc_cleaner", 1) => Some(SystemClauseType::GetSCCCleaner),
|
||||||
("$halt", 0) => Some(SystemClauseType::Halt),
|
("$halt", 1) => Some(SystemClauseType::Halt),
|
||||||
("$head_is_dynamic", 1) => Some(SystemClauseType::HeadIsDynamic),
|
("$head_is_dynamic", 1) => Some(SystemClauseType::HeadIsDynamic),
|
||||||
("$install_scc_cleaner", 2) => Some(SystemClauseType::InstallSCCCleaner),
|
("$install_scc_cleaner", 2) => Some(SystemClauseType::InstallSCCCleaner),
|
||||||
("$install_inference_counter", 3) => Some(SystemClauseType::InstallInferenceCounter),
|
("$install_inference_counter", 3) => Some(SystemClauseType::InstallInferenceCounter),
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ user:term_expansion((:- op(Pred, Spec, [Op | OtherOps])), OpResults) :-
|
|||||||
findall/3, findall/4, flush_output/0,
|
findall/3, findall/4, flush_output/0,
|
||||||
flush_output/1, get_byte/1, get_byte/2,
|
flush_output/1, get_byte/1, get_byte/2,
|
||||||
get_char/1, get_char/2, get_code/1, get_code/2,
|
get_char/1, get_char/2, get_code/1, get_code/2,
|
||||||
halt/0, max_arity/1, number_chars/2,
|
halt/0, halt/1, max_arity/1, number_chars/2,
|
||||||
number_codes/2, once/1, op/3, open/3, open/4,
|
number_codes/2, once/1, op/3, open/3, open/4,
|
||||||
peek_byte/1, peek_byte/2, peek_char/1,
|
peek_byte/1, peek_byte/2, peek_char/1,
|
||||||
peek_char/2, peek_code/1, peek_code/2,
|
peek_char/2, peek_code/1, peek_code/2,
|
||||||
@@ -912,7 +912,14 @@ op(Priority, OpSpec, Op) :-
|
|||||||
; throw(error(type_error(list, Op), op/3)) % 8.14.3.3 f)
|
; throw(error(type_error(list, Op), op/3)) % 8.14.3.3 f)
|
||||||
).
|
).
|
||||||
|
|
||||||
halt :- '$halt'.
|
|
||||||
|
halt :- halt(0).
|
||||||
|
|
||||||
|
halt(N) :-
|
||||||
|
( -2^31 =< N, N =< 2^31 - 1 ->
|
||||||
|
'$halt'(N)
|
||||||
|
; throw(error(domain_error(exit_code, N), halt/1))
|
||||||
|
).
|
||||||
|
|
||||||
atom_length(Atom, Length) :-
|
atom_length(Atom, Length) :-
|
||||||
( var(Atom) -> throw(error(instantiation_error, atom_length/2)) % 8.16.1.3 a)
|
( var(Atom) -> throw(error(instantiation_error, atom_length/2)) % 8.16.1.3 a)
|
||||||
|
|||||||
@@ -3647,7 +3647,15 @@ impl MachineState {
|
|||||||
self.fail = true;
|
self.fail = true;
|
||||||
}
|
}
|
||||||
&SystemClauseType::Halt => {
|
&SystemClauseType::Halt => {
|
||||||
std::process::exit(0);
|
let code = self.store(self.deref(self[temp_v!(1)]));
|
||||||
|
|
||||||
|
let code = match Number::try_from((code, &self.heap)) {
|
||||||
|
Ok(Number::Fixnum(n)) => n as i32,
|
||||||
|
Ok(Number::Integer(n)) => n.to_i32().unwrap(),
|
||||||
|
_ => { unreachable!() }
|
||||||
|
};
|
||||||
|
|
||||||
|
std::process::exit(code);
|
||||||
}
|
}
|
||||||
&SystemClauseType::InstallSCCCleaner => {
|
&SystemClauseType::InstallSCCCleaner => {
|
||||||
let addr = self[temp_v!(1)];
|
let addr = self[temp_v!(1)];
|
||||||
|
|||||||
Reference in New Issue
Block a user