]> Repositorios git - scryer-prolog.git/commitdiff
cleanup
authorSkgland <[email protected]>
Mon, 27 Apr 2026 20:54:36 +0000 (22:54 +0200)
committerBennet Bleßmann <[email protected]>
Sun, 24 May 2026 21:29:23 +0000 (23:29 +0200)
- fix some warnings and mark others as expected
- make use of the msrv bump to 1.93.1 and cleanup compat and workarounds

15 files changed:
.github/actions/setup-rust/cleanup.sh
Cargo.toml
src/arena.rs
src/codegen.rs
src/lib.rs
src/machine/copier.rs
src/machine/disjuncts.rs
src/machine/heap.rs
src/machine/machine_errors.rs
src/machine/machine_state.rs
src/machine/stack.rs
src/machine/streams.rs
src/machine/streams/compat.rs [deleted file]
src/machine/system_calls.rs
tests/scryer/issues.rs

index 280f5e98d600b4be6cf763e67357f377a49e4176..d34112020f312b7bc47f6b6796b6fc03e88e0fde 100755 (executable)
@@ -4,7 +4,7 @@ set -e
 echo Cleanup workspace build artifacts and extra target output
 
 # clean just the direct members of the current workspace, use cargo metadata to generalize to all rust projects
-cargo clean -p `cargo metadata --no-deps --offline --format-version 1 | jq -r '[.workspace_members[]|split(" ")|.[0]]|join(" ")'`
+cargo clean --workspace
 
 # remove directories in /target/ that are not named `debug` or `release`
 before=`du -s target | awk '{print $1}'`
index 4cfbda93898d5355a6e5b55497e7abb09aa6fb16..5154456cd1f5bca7be23ed1b4b8585a79ecfd31e 100644 (file)
@@ -37,13 +37,15 @@ http = ["dep:warp", "dep:reqwest"]
 crypto-inpure = ["dep:ring"]
 crypto-full = ["crypto-inpure"]
 
+[lints.clippy]
+collapsible_match = "allow"
+
 [lints.rust]
 unexpected_cfgs = { level = "deny", check-cfg = [
     'cfg(rust_version, values("1.87.0"))',
 ] }
 function_casts_as_integer = "deny"
 
-
 [build-dependencies]
 proc-macro2 = "1.0.86"
 quote = "1.0.36"
index ffb92fb74c3b3b85713d9fb6ac5090f6f8f6ce14..01c2d69713526294528b90e0ae79f1bb8d89ce14 100644 (file)
@@ -13,6 +13,8 @@ use ordered_float::OrderedFloat;
 use std::fmt;
 use std::fmt::Debug;
 use std::hash::{Hash, Hasher};
+use std::io::PipeReader;
+use std::io::PipeWriter;
 use std::mem;
 use std::mem::ManuallyDrop;
 use std::net::TcpListener;
@@ -22,8 +24,6 @@ use std::ptr;
 use std::ptr::addr_of_mut;
 use std::ptr::NonNull;
 
-use crate::machine::streams::{PipeReader, PipeWriter};
-
 macro_rules! arena_alloc {
     ($e:expr, $arena:expr) => {{
         let result = $e;
index 19d056d6edad1f071bcc5bef2bd61ca400f87c71..b19dc8aedee5e650b155e68adecc5861c61e8174 100644 (file)
@@ -145,7 +145,7 @@ impl BranchCodeStack {
                     settings.trust_me()
                 });
 
-                combined_code.extend(code.into_iter());
+                combined_code.extend(code);
             }
         }
 
@@ -1236,7 +1236,7 @@ impl CodeGenerator {
             }
 
             self.skeleton.clauses.push_back(clause_index_info);
-            code.extend(clause_code.into_iter());
+            code.extend(clause_code);
         }
 
         let index_code = if clauses_len > 1 || self.settings.is_extensible {
@@ -1313,7 +1313,7 @@ impl CodeGenerator {
                 }
             }
 
-            code.extend(code_segment.into_iter());
+            code.extend(code_segment);
         }
 
         Ok(code)
index 4ad5a83bca815640fa0a4d32cf4ba0ca90b45e1c..ee73d4f29a207505bee367444ebb0c34a44d2d1c 100644 (file)
@@ -54,6 +54,8 @@ pub mod wasm;
 /// The entry point for the Scryer Prolog CLI.
 pub fn run_binary() -> std::process::ExitCode {
     use crate::atom_table::Atom;
+
+    #[cfg(feature = "repl")]
     use crate::machine::INTERRUPT;
 
     #[cfg(feature = "repl")]
index b71db32bc17f0f1b5d584e3cc5ab7a715043269f..43631bf400985029edb36f039e29d25f92d13078 100644 (file)
@@ -247,11 +247,12 @@ impl<T: CopierTarget> CopyTermState<T> {
             self.trail
                 .push((TrailRef::pstr_loc(pstr_loc_idx), old_cell));
 
-            let old_tail_idx = if (pstr_loc + offset + 1) % Heap::heap_cell_alignment() == 0 {
-                cell_index!(pstr_loc + offset) + 2
-            } else {
-                cell_index!(pstr_loc + offset) + 1
-            };
+            let old_tail_idx =
+                if (pstr_loc + offset + 1).is_multiple_of(Heap::heap_cell_alignment()) {
+                    cell_index!(pstr_loc + offset) + 2
+                } else {
+                    cell_index!(pstr_loc + offset) + 1
+                };
 
             let tail_cell = self.target[old_tail_idx];
 
index 65698e36da8fb50e3b01dbd1ccb172d9e9ca3e4b..4548a121e0ef5056cd238f8fe1eb3d90b16b87b9 100644 (file)
@@ -549,7 +549,7 @@ impl VariableClassifier {
 
                             let first_branch_num = Arc::new(self.current_branch_num.split());
                             let branches: Vec<_> = std::iter::once(head)
-                                .chain(unfold_by_str(tail, atom!(";")).into_iter())
+                                .chain(unfold_by_str(tail, atom!(";")))
                                 .collect();
 
                             let mut branch_numbers = vec![first_branch_num];
@@ -571,7 +571,7 @@ impl VariableClassifier {
                                 self.current_branch_num.halve_delta(),
                             )));
 
-                            let iter = branches.into_iter().zip(branch_numbers.into_iter());
+                            let iter = branches.into_iter().zip(branch_numbers);
                             let final_disjunct_loc = state_stack.len();
 
                             for (term, branch_num) in iter.rev() {
index 70ef0ba348e16b4737aa93e27a11c4995864e43e..7902b9e2f0cfce0f8e7ffe35b1189d8b2becf40e 100644 (file)
@@ -577,7 +577,7 @@ impl Heap {
     // takes a heap index, returns a cell index
     #[inline]
     pub const fn pstr_tail_idx(pstr_zero_byte_loc: usize) -> usize {
-        if (pstr_zero_byte_loc + 1) % Heap::heap_cell_alignment() == 0 {
+        if (pstr_zero_byte_loc + 1).is_multiple_of(Heap::heap_cell_alignment()) {
             cell_index!(pstr_zero_byte_loc) + 2
         } else {
             cell_index!(pstr_zero_byte_loc) + 1
index 52a87dfeafd8ffb804901d3b45bddcf64091ef6f..ec1a280d66aeb07f845632681cd04f7b390111e5 100644 (file)
@@ -937,6 +937,7 @@ impl Permission {
 }
 
 #[derive(Debug, Clone, Copy)]
+#[cfg_attr(not(feature = "ffi"), expect(dead_code))]
 pub(crate) enum DomainErrorType {
     IOMode,
     NotLessThanZero,
@@ -987,6 +988,7 @@ impl DomainErrorType {
 
 // from 7.12.2 f) of 13211-1:1995
 #[derive(Debug, Clone, Copy)]
+#[cfg_attr(not(feature = "ffi"), expect(dead_code))]
 pub(crate) enum RepFlag {
     Character,
     CharacterCode,
@@ -1178,6 +1180,7 @@ impl MachineState {
 }
 
 #[derive(Debug)]
+#[cfg_attr(not(feature = "ffi"), expect(dead_code))]
 pub enum ExistenceError {
     Module(Atom),
     ModuleSource(ModuleSource),
index 3744da340a66197e5f4a3730c77be8eb9e30d727..edcd95c0f2187aa9c2249ac8820fdf497aa76357 100644 (file)
@@ -548,8 +548,7 @@ impl MachineState {
             return true;
         }
 
-        // use strict_add once msrv is >= 1.91.0
-        self.cwil.global_count = self.cwil.global_count.checked_add(1).unwrap();
+        self.cwil.global_count = self.cwil.global_count.strict_add(1);
 
         if let Some(&(ref limit, block)) = self.cwil.limits.last() {
             if self.cwil.local_count == *limit {
@@ -651,7 +650,7 @@ impl MachineState {
         mut var_list: Vec<(VarKey, HeapCellValue, usize)>,
         singleton_heap_list: HeapCellValue,
     ) -> CallResult {
-        var_list.sort_by(|(_, _, idx_1), (_, _, idx_2)| idx_1.cmp(idx_2));
+        var_list.sort_by_key(|(_, _, idx_1)| *idx_1);
 
         let singleton_addr = self.registers[3];
         unify_fn!(*self, singleton_heap_list, singleton_addr);
@@ -1128,8 +1127,7 @@ impl CWIL {
     }
 
     pub(crate) fn add_limit(&mut self, mut limit: u128, block: usize) -> u128 {
-        // use strict_add once msrv is >= 1.91.0
-        limit = limit.checked_add(self.local_count).unwrap();
+        limit = limit.strict_add(self.local_count);
 
         match self.limits.last() {
             Some((ref inner_limit, _)) if *inner_limit <= limit => {}
index ad9b4755a779cb35a078ce23b9329b3b9d4e0ddf..c4bed865e0c98fd3f9c123e49e074bce2a1fdf92 100644 (file)
@@ -195,8 +195,7 @@ impl Stack {
                 // exposed provenance, we need to expose the provenance here, even though we don't
                 // actually use the value for anything. This is a reminder that `expose_provenance`
                 // isn't just a cast from a pointer to an integer but has actual side effects.
-                // FIXME(msrv) remove the as_ptr() call once MSRV reaches 1.89.0
-                cell_ptr.as_ptr().expose_provenance();
+                cell_ptr.expose_provenance();
 
                 offset += mem::size_of::<HeapCellValue>();
             }
@@ -228,8 +227,7 @@ impl Stack {
                 // exposed provenance, we need to expose the provenance here, even though we don't
                 // actually use the value for anything. This is a reminder that `expose_provenance`
                 // isn't just a cast from a pointer to an integer but has actual side effects.
-                // FIXME(msrv) remove as_ptr() call once msrv reaches 1.89.0
-                cell_ptr.as_ptr().expose_provenance();
+                cell_ptr.expose_provenance();
 
                 offset += mem::size_of::<HeapCellValue>();
             }
index 9a2d56f46609c8eaa6b1077cb9cb420682541a97..a956a00c7a684cbd84b941ba1cf98f6275f4e442 100644 (file)
@@ -23,6 +23,8 @@ use std::fmt::Debug;
 use std::fs::{File, OpenOptions};
 use std::hash::Hash;
 use std::io;
+use std::io::PipeReader;
+use std::io::PipeWriter;
 use std::io::{Cursor, ErrorKind, Read, Seek, SeekFrom, Write};
 use std::mem::ManuallyDrop;
 use std::net::{Shutdown, TcpStream};
@@ -38,9 +40,6 @@ use native_tls::TlsStream;
 #[cfg(feature = "http")]
 use warp::hyper;
 
-mod compat;
-pub use compat::*;
-
 #[derive(Debug, Specifier, Clone, Copy, PartialEq, Eq, Hash)]
 #[bits = 1]
 pub enum StreamType {
diff --git a/src/machine/streams/compat.rs b/src/machine/streams/compat.rs
deleted file mode 100644 (file)
index 45e370f..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#[cfg(rust_version = "1.87.0")]
-pub use ge_1_87_0::{PipeReader, PipeWriter};
-
-#[cfg(not(rust_version = "1.87.0"))]
-pub use lt_1_87_0::{PipeReader, PipeWriter};
-
-#[cfg(not(rust_version = "1.87.0"))]
-pub(crate) use lt_1_87_0::PipeReaderInner;
-
-#[cfg(not(rust_version = "1.87.0"))]
-mod lt_1_87_0 {
-    use std::process::{ChildStderr, ChildStdout};
-
-    pub type PipeWriter = std::process::ChildStdin;
-
-    #[derive(Debug)]
-    pub struct PipeReader(pub(crate) PipeReaderInner);
-
-    #[derive(Debug)]
-    pub(crate) enum PipeReaderInner {
-        Stdout(ChildStdout),
-        Stderr(ChildStderr),
-    }
-
-    impl std::io::Read for PipeReader {
-        fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
-            match &mut self.0 {
-                PipeReaderInner::Stdout(child_stdout) => child_stdout.read(buf),
-                PipeReaderInner::Stderr(child_stderr) => child_stderr.read(buf),
-            }
-        }
-
-        fn read_vectored(
-            &mut self,
-            bufs: &mut [std::io::IoSliceMut<'_>],
-        ) -> std::io::Result<usize> {
-            match &mut self.0 {
-                PipeReaderInner::Stdout(child_stdout) => child_stdout.read_vectored(bufs),
-                PipeReaderInner::Stderr(child_stderr) => child_stderr.read_vectored(bufs),
-            }
-        }
-
-        fn read_to_end(&mut self, buf: &mut Vec<u8>) -> std::io::Result<usize> {
-            match &mut self.0 {
-                PipeReaderInner::Stdout(child_stdout) => child_stdout.read_to_end(buf),
-                PipeReaderInner::Stderr(child_stderr) => child_stderr.read_to_end(buf),
-            }
-        }
-
-        fn read_to_string(&mut self, buf: &mut String) -> std::io::Result<usize> {
-            match &mut self.0 {
-                PipeReaderInner::Stdout(child_stdout) => child_stdout.read_to_string(buf),
-                PipeReaderInner::Stderr(child_stderr) => child_stderr.read_to_string(buf),
-            }
-        }
-
-        fn read_exact(&mut self, buf: &mut [u8]) -> std::io::Result<()> {
-            match &mut self.0 {
-                PipeReaderInner::Stdout(child_stdout) => child_stdout.read_exact(buf),
-                PipeReaderInner::Stderr(child_stderr) => child_stderr.read_exact(buf),
-            }
-        }
-    }
-}
-
-#[cfg(rust_version = "1.87.0")]
-mod ge_1_87_0 {
-    #![allow(clippy::incompatible_msrv)]
-
-    pub type PipeReader = std::io::PipeReader;
-    pub type PipeWriter = std::io::PipeWriter;
-}
index 692b558ed3feca10e09b8ff354ff54652797460e..5daa2af8a533c1687ab4dae44ba6c2795569f8bf 100644 (file)
@@ -8950,36 +8950,27 @@ impl Machine {
             Some(atom!("std")) => Stdio::inherit(),
             Some(atom!("null")) => Stdio::null(),
             Some(atom!("pipe")) => {
-                #[cfg(rust_version = "1.87.0")]
-                #[allow(clippy::incompatible_msrv)]
-                {
-                    let (reader, writer) = match std::io::pipe() {
-                        Ok(pipe_pair) => pipe_pair,
-                        Err(_) => {
-                            return Err(self.machine_st.open_permission_error(
-                                atom!("anonymous_pipe"),
-                                atom!("process_create"),
-                                3,
-                            ));
-                        }
-                    };
-
-                    let stream = Stream::from_pipe_writer(writer, &mut self.machine_st.arena);
+                let (reader, writer) = match std::io::pipe() {
+                    Ok(pipe_pair) => pipe_pair,
+                    Err(_) => {
+                        return Err(self.machine_st.open_permission_error(
+                            atom!("anonymous_pipe"),
+                            atom!("process_create"),
+                            3,
+                        ));
+                    }
+                };
 
-                    self.indices
-                        .add_stream(stream, atom!("process_create"), 3)
-                        .map_err(|stub_gen| stub_gen(&mut self.machine_st))?;
+                let stream = Stream::from_pipe_writer(writer, &mut self.machine_st.arena);
 
-                    self.machine_st
-                        .bind(args[1].as_var().unwrap(), stream.into());
+                self.indices
+                    .add_stream(stream, atom!("process_create"), 3)
+                    .map_err(|stub_gen| stub_gen(&mut self.machine_st))?;
 
-                    Stdio::from(reader)
-                }
+                self.machine_st
+                    .bind(args[1].as_var().unwrap(), stream.into());
 
-                #[cfg(not(rust_version = "1.87.0"))]
-                {
-                    Stdio::piped()
-                }
+                Stdio::from(reader)
             }
             Some(atom!("file")) => {
                 let path = self.machine_st.value_to_str_like(args[1]).unwrap();
@@ -9613,7 +9604,6 @@ impl Machine {
 
 #[cfg(feature = "crypto-inpure")]
 fn rng() -> &'static dyn SecureRandom {
-    use lazy_static::lazy_static;
     use std::ops::Deref;
 
     static RANDOM: LazyLock<SystemRandom> = LazyLock::new(SystemRandom::new);
index 838f4fa47fcba37f3b8a11d102606d8c69344cf3..1cc9a260b502e5f4b429be1064a2527f8be37511 100644 (file)
@@ -1,6 +1,6 @@
 use crate::helper::load_module_test;
 use crate::helper::load_module_test_with_input;
-#[cfg(not(target_arch = "wasm32"))]
+#[cfg(all(feature = "http", not(target_arch = "wasm32")))]
 use crate::helper::load_module_test_with_tokio_runtime_and_input;
 use serial_test::serial;
 
@@ -164,8 +164,7 @@ fn issue3262_read_from_stdin_no_newline() {
 }
 
 #[test]
-#[cfg(feature = "http")]
-#[cfg(not(target_arch = "wasm32"))]
+#[cfg(all(feature = "http", not(target_arch = "wasm32")))]
 #[cfg_attr(miri, ignore = "it takes too long to run")]
 fn http_open_hanging() {
     load_module_test_with_tokio_runtime_and_input(