From 1d66f91a41858a06770e227a4a37f8831d1df04a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bennet=20Ble=C3=9Fmann?= Date: Sat, 6 Jul 2024 16:56:41 +0200 Subject: [PATCH] replace `ref_thread_local::ref_thread_local!` with `std::thread_local!` removes `ref_thread_local` which was still at 0.0.0 released October 2018 while latest 0.1.1 was released mid November 2021 fixes libraries.rs UB --- Cargo.lock | 7 ------- Cargo.toml | 1 - build/main.rs | 4 ++-- src/machine/lib_machine.rs | 2 +- src/machine/load_state.rs | 5 ++--- src/machine/loader.rs | 2 +- src/machine/mod.rs | 30 ++++++++++++++++++++++++------ src/machine/system_calls.rs | 9 +++------ 8 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb2bd1b2..6b3d3394 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2297,12 +2297,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "ref_thread_local" -version = "0.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d813022b2e00774a48eaf43caaa3c20b45f040ba8cbf398e2e8911a06668dbe6" - [[package]] name = "regex" version = "1.10.2" @@ -2605,7 +2599,6 @@ dependencies = [ "proc-macro2", "quote", "rand", - "ref_thread_local", "regex", "reqwest", "ring 0.17.7", diff --git a/Cargo.toml b/Cargo.toml index 45ba6d6e..67c3e60d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,7 +61,6 @@ num-order = { version = "1.2.0" } ordered-float = "2.6.0" phf = { version = "0.9", features = ["macros"] } rand = "0.8.5" -ref_thread_local = "0.0.0" regex = "1.9.1" ring = { version = "0.17.5", features = ["wasm32_unknown_unknown_js"] } ripemd160 = "0.8.0" diff --git a/build/main.rs b/build/main.rs index bd254c93..b7a66f03 100644 --- a/build/main.rs +++ b/build/main.rs @@ -82,8 +82,8 @@ use indexmap::IndexMap;\ writeln!( libraries, "\ -ref_thread_local::ref_thread_local! {{ - pub(crate) static managed LIBRARIES: IndexMap<&'static str, &'static str> = {{ +std::thread_local!{{ + static LIBRARIES: IndexMap<&'static str, &'static str> = {{ let mut m = IndexMap::new();" ) .unwrap(); diff --git a/src/machine/lib_machine.rs b/src/machine/lib_machine.rs index 80e0d1c6..57bb45a9 100644 --- a/src/machine/lib_machine.rs +++ b/src/machine/lib_machine.rs @@ -238,7 +238,7 @@ mod tests { use crate::machine::{QueryMatch, QueryResolution, Value}; #[test] - #[cfg_attr(miri, ignore = "blocked on libraries.rs UB")] + #[cfg_attr(miri, ignore = "it takes too long to run")] fn programatic_query() { let mut machine = Machine::new_lib(); diff --git a/src/machine/load_state.rs b/src/machine/load_state.rs index f340ad03..121c0c1b 100644 --- a/src/machine/load_state.rs +++ b/src/machine/load_state.rs @@ -9,7 +9,6 @@ use crate::parser::ast::*; use fxhash::FxBuildHasher; use indexmap::IndexSet; -pub use ref_thread_local::RefThreadLocal; use std::collections::VecDeque; use std::fs::File; @@ -1176,7 +1175,7 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> { ListingSource::File(filename, path_buf), ) } - ModuleSource::Library(library) => match LIBRARIES.borrow().get(&*library.as_str()) { + ModuleSource::Library(library) => match libraries::get(&library.as_str()) { Some(code) => { if let Some(module) = self.wam_prelude.indices.modules.get(&library) { if let ListingSource::DynamicallyGenerated = &module.listing_src { @@ -1257,7 +1256,7 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> { ListingSource::File(filename, path_buf), ) } - ModuleSource::Library(library) => match LIBRARIES.borrow().get(&*library.as_str()) { + ModuleSource::Library(library) => match libraries::get(&library.as_str()) { Some(code) => { if self.wam_prelude.indices.modules.contains_key(&library) { return self.import_qualified_module(library, exports); diff --git a/src/machine/loader.rs b/src/machine/loader.rs index dd4f54bd..88666330 100644 --- a/src/machine/loader.rs +++ b/src/machine/loader.rs @@ -353,7 +353,7 @@ impl<'a> LoadState<'a> for LiveLoadAndMachineState<'a> { #[inline] fn err_on_builtin_module_overwrite(module_name: Atom) -> Result<(), SessionError> { - if LIBRARIES.borrow().contains_key(&*module_name.as_str()) { + if libraries::contains(&module_name.as_str()) { Err(SessionError::CannotOverwriteBuiltInModule(module_name)) } else { Ok(()) diff --git a/src/machine/mod.rs b/src/machine/mod.rs index d3d22953..6a9c74e6 100644 --- a/src/machine/mod.rs +++ b/src/machine/mod.rs @@ -119,9 +119,25 @@ fn current_dir() -> PathBuf { mod libraries { include!(concat!(env!("OUT_DIR"), "/libraries.rs")); -} -pub(crate) use libraries::LIBRARIES; + pub(crate) fn contains(name: &str) -> bool { + LIBRARIES.with(|libs| libs.contains_key(name)) + } + + pub(crate) fn get(name: &str) -> Option<&'static str> { + LIBRARIES.with(|libs| libs.get(name).map(|&lib| lib)) + } + + #[cfg(test)] + std::thread_local! { + #[allow(dead_code)] + static LIBRARIES2 : IndexMap<&'static str, &'static str> = { + let mut m = IndexMap::new(); + m.insert("test", "test2"); + m + }; + } +} pub static BREAK_FROM_DISPATCH_LOOP_LOC: usize = 0; pub static INSTALL_VERIFY_ATTR_INTERRUPT: usize = 1; @@ -456,8 +472,6 @@ impl Machine { #[allow(clippy::new_without_default)] pub fn new(config: MachineConfig) -> Self { - use ref_thread_local::RefThreadLocal; - let args = MachineArgs::new(); let mut machine_st = MachineState::new(); @@ -496,7 +510,8 @@ impl Machine { bootstrapping_compile( Stream::from_static_string( - libraries::LIBRARIES.borrow()["ops_and_meta_predicates"], + libraries::get("ops_and_meta_predicates") + .expect("library ops_and_meta_predicates should exist"), &mut wam.machine_st.arena, ), &mut wam, @@ -508,7 +523,10 @@ impl Machine { .unwrap(); bootstrapping_compile( - Stream::from_static_string(LIBRARIES.borrow()["builtins"], &mut wam.machine_st.arena), + Stream::from_static_string( + libraries::get("builtins").expect("library builtins should exist"), + &mut wam.machine_st.arena, + ), &mut wam, ListingSource::from_file_and_path(atom!("builtins.pl"), lib_path.clone()), ) diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 5cddb644..17095a36 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -39,8 +39,6 @@ use ordered_float::OrderedFloat; use fxhash::{FxBuildHasher, FxHasher}; use indexmap::IndexSet; -pub(crate) use ref_thread_local::RefThreadLocal; - use std::cell::Cell; use std::cmp::Ordering; use std::collections::BTreeSet; @@ -105,6 +103,8 @@ use warp::hyper::{HeaderMap, Method}; #[cfg(feature = "http")] use warp::{Buf, Filter}; +use super::libraries; + #[cfg(feature = "repl")] pub(crate) fn get_key() -> KeyEvent { let key; @@ -7998,10 +7998,7 @@ impl Machine { pub(crate) fn load_library_as_stream(&mut self) -> CallResult { let library_name = cell_as_atom!(self.deref_register(1)); - use crate::machine::LIBRARIES; - - let lib_ref = LIBRARIES.borrow(); - let lib = lib_ref.get(&*library_name.as_str()); + let lib = libraries::get(&library_name.as_str()); match lib { Some(library) => { let lib_stream = Stream::from_static_string(library, &mut self.machine_st.arena); -- 2.54.0