]> Repositorios git - scryer-prolog.git/commitdiff
ADDED: halt/1, halting with specified exit code
authorMarkus Triska <[email protected]>
Sat, 23 May 2020 17:14:29 +0000 (19:14 +0200)
committerMarkus Triska <[email protected]>
Sat, 23 May 2020 17:28:17 +0000 (19:28 +0200)
src/prolog/clause_types.rs
src/prolog/lib/builtins.pl
src/prolog/machine/system_calls.rs

index e685c65fccf623e5e8c97e12ac90c4af830956b5..14c353b28f71fbebfbbd51602b490b6f51515e4b 100644 (file)
@@ -580,7 +580,7 @@ impl SystemClauseType {
             ("$get_lh_from_offset_diff", 3) => Some(SystemClauseType::GetLiftedHeapFromOffsetDiff),
             ("$get_double_quotes", 1) => Some(SystemClauseType::GetDoubleQuotes),
             ("$get_scc_cleaner", 1) => Some(SystemClauseType::GetSCCCleaner),
-            ("$halt", 0) => Some(SystemClauseType::Halt),
+            ("$halt", 1) => Some(SystemClauseType::Halt),
             ("$head_is_dynamic", 1) => Some(SystemClauseType::HeadIsDynamic),
             ("$install_scc_cleaner", 2) => Some(SystemClauseType::InstallSCCCleaner),
             ("$install_inference_counter", 3) => Some(SystemClauseType::InstallInferenceCounter),
index a4bd6db8fd8fb412104e1e11dbfe267bbe9b90d3..3e1c8d28e71d46ea6aa1462dec1991f5f23c56fa 100644 (file)
@@ -52,7 +52,7 @@ user:term_expansion((:- op(Pred, Spec, [Op | OtherOps])), OpResults) :-
                      findall/3, findall/4, flush_output/0,
                      flush_output/1, get_byte/1, get_byte/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,
                      peek_byte/1, peek_byte/2, peek_char/1,
                      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)
     ).
 
-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) :-
     (  var(Atom)  -> throw(error(instantiation_error, atom_length/2)) % 8.16.1.3 a)
index 0fb224adb940d2d2c41a9be4fb16b4cb31e9880d..dcc15bc1d8c890e19ad8d0db89385bc92ecfe50c 100644 (file)
@@ -3647,7 +3647,15 @@ impl MachineState {
                 self.fail = true;
             }
             &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 => {
                 let addr = self[temp_v!(1)];