]> Repositorios git - scryer-prolog.git/commitdiff
use ExitCode when halting so Drop is called, close terminal stream in rustyline Drop
authorMark <[email protected]>
Sat, 22 Jul 2023 20:12:38 +0000 (14:12 -0600)
committerMark <[email protected]>
Sun, 23 Jul 2023 01:06:13 +0000 (19:06 -0600)
src/bin/scryer-prolog.rs
src/machine/dispatch.rs
src/machine/mod.rs
src/machine/system_calls.rs

index eae00fe23777d868d79d7641958550c083d61597..e15bae144feb28f2b1f8e665f8988c6927ab2515 100644 (file)
@@ -1,4 +1,4 @@
-fn main() {
+fn main() -> std::process::ExitCode {
     use std::sync::atomic::Ordering;
     use scryer_prolog::*;
 
@@ -7,5 +7,5 @@ fn main() {
     }).unwrap();
 
     let mut wam = machine::Machine::new();
-    wam.run_top_level();
+    wam.run_top_level()
 }
index fbfa6580ff6443440b294adcbe5dd2fe79428d06..31592d6843aa29a2285b05cf816b142ae4909a1f 100644 (file)
@@ -558,7 +558,7 @@ impl Machine {
     }
 
     #[inline(always)]
-    pub(super) fn dispatch_loop(&mut self) {
+    pub(super) fn dispatch_loop(&mut self) -> std::process::ExitCode {
         'outer: loop {
         for _ in 0 .. INSTRUCTIONS_PER_INTERRUPT_POLL {
             match &self.code[self.machine_st.p] {
@@ -3809,13 +3809,8 @@ impl Machine {
                     self.is_partial_string();
                     step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
                 }
-                &Instruction::CallHalt => {
-                    self.halt();
-                    self.machine_st.p += 1;
-                }
-                &Instruction::ExecuteHalt => {
-                    self.halt();
-                    self.machine_st.p = self.machine_st.cp;
+                &Instruction::CallHalt | &Instruction::ExecuteHalt => {
+                    return self.halt();
                 }
                 &Instruction::CallGetLiftedHeapFromOffset => {
                     self.get_lifted_heap_from_offset();
@@ -5356,5 +5351,7 @@ impl Machine {
             Err(_) => unreachable!(),
         }
         }
+
+        std::process::ExitCode::SUCCESS
     }
 }
index 9c5d498b73b90f4dedb50e2b941a9306d1f07ca9..d52dba694ad518aa983389af7653a423a248cf58 100644 (file)
@@ -204,7 +204,7 @@ impl Machine {
         self.machine_st.throw_exception(err);
     }
 
-    fn run_module_predicate(&mut self, module_name: Atom, key: PredicateKey) {
+    fn run_module_predicate(&mut self, module_name: Atom, key: PredicateKey) -> std::process::ExitCode {
         if let Some(module) = self.indices.modules.get(&module_name) {
             if let Some(ref code_index) = module.code_dir.get(&key) {
                 let p = code_index.local().unwrap();
@@ -283,7 +283,7 @@ impl Machine {
         }
     }
 
-    pub fn run_top_level(&mut self) {
+    pub fn run_top_level(&mut self) -> std::process::ExitCode {
         let mut arg_pstrs = vec![];
 
         for arg in env::args() {
@@ -298,7 +298,7 @@ impl Machine {
             iter_to_heap_list(&mut self.machine_st.heap, arg_pstrs.into_iter())
         );
 
-        self.run_module_predicate(atom!("$toplevel"), (atom!("$repl"), 1));
+        self.run_module_predicate(atom!("$toplevel"), (atom!("$repl"), 1))
     }
 
     pub(crate) fn configure_modules(&mut self) {
index f996966913360f460950481fa8980cd0f7d814dc..f6bc90d819606996e960ce4679a2175a2bed1af3 100644 (file)
@@ -5229,24 +5229,24 @@ impl Machine {
     }
 
     #[inline(always)]
-    pub(crate) fn halt(&mut self) {
+    pub(crate) fn halt(&mut self) -> std::process::ExitCode {
         let code = self.deref_register(1);
 
         let code = match Number::try_from(code) {
-            Ok(Number::Fixnum(n)) => i32::try_from(n.get_num()).unwrap(),
-            Ok(Number::Integer(n)) => n.to_i32().unwrap(),
+            Ok(Number::Fixnum(n)) => u8::try_from(n.get_num()).unwrap(),
+            Ok(Number::Integer(n)) => n.to_u8().unwrap(),
             Ok(Number::Rational(r)) => {
                 // n has already been confirmed as an integer, and
                 // internally, Rational is assumed reduced, so its
                 // denominator must be 1.
-                r.numer().to_i32().unwrap()
+                r.numer().to_u8().unwrap()
             }
             _ => {
                 unreachable!()
             }
         };
 
-        std::process::exit(code);
+        std::process::ExitCode::from(code)
     }
 
     #[inline(always)]