From 6e75816a7dd369ff42e7828d874798ea69b7aea5 Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Wed, 8 Jan 2025 13:56:25 -0600 Subject: [PATCH] simpler --- crates/libs/bindgen/src/derive.rs | 10 +++++----- crates/libs/bindgen/src/filter.rs | 10 ++++++---- crates/libs/bindgen/src/lib.rs | 10 +++++----- crates/libs/bindgen/src/libraries.rs | 20 +++++++------------- crates/libs/bindgen/src/references.rs | 6 +++--- crates/libs/bindgen/src/type_map.rs | 3 ++- crates/libs/bindgen/src/winmd/reader.rs | 3 +-- 7 files changed, 29 insertions(+), 33 deletions(-) diff --git a/crates/libs/bindgen/src/derive.rs b/crates/libs/bindgen/src/derive.rs index 6c94712e53..220c1fb937 100644 --- a/crates/libs/bindgen/src/derive.rs +++ b/crates/libs/bindgen/src/derive.rs @@ -3,7 +3,7 @@ use super::*; pub struct Derive(HashMap>); impl Derive { - pub fn new(reader: &Reader, types: &TypeMap, derive: &[&str]) -> Self { + pub fn new(types: &TypeMap, derive: &[&str]) -> Self { let mut map = HashMap::new(); for derive in derive { @@ -11,7 +11,7 @@ impl Derive { panic!("`--derive` must be `=Comma,Separated,List"); }; - let tn = get_type_name(reader, name); + let tn = get_type_name(name); if !types.contains_key(&tn) { panic!("type not included: `{name}`"); @@ -33,15 +33,15 @@ impl Derive { } } -fn get_type_name(reader: &Reader, path: &str) -> TypeName { +fn get_type_name(path: &str) -> TypeName { if let Some((namespace, name)) = path.rsplit_once('.') { - if let Some((namespace, types)) = reader.get_key_value(namespace) { + if let Some((namespace, types)) = reader().get_key_value(namespace) { if let Some((name, _)) = types.get_key_value(name) { return TypeName(namespace, name); } } } else { - for (namespace, types) in reader.iter() { + for (namespace, types) in reader().iter() { if let Some((name, _)) = types.get_key_value(path) { return TypeName(namespace, name); } diff --git a/crates/libs/bindgen/src/filter.rs b/crates/libs/bindgen/src/filter.rs index 6666e4d863..6472076408 100644 --- a/crates/libs/bindgen/src/filter.rs +++ b/crates/libs/bindgen/src/filter.rs @@ -4,15 +4,15 @@ use super::*; pub struct Filter(Vec<(String, bool)>); impl Filter { - pub fn new(reader: &Reader, include: &[&str], exclude: &[&str]) -> Self { + pub fn new(include: &[&str], exclude: &[&str]) -> Self { let mut rules = vec![]; for filter in include { - push_filter(reader, &mut rules, filter, true); + push_filter(&mut rules, filter, true); } for filter in exclude { - push_filter(reader, &mut rules, filter, false) + push_filter(&mut rules, filter, false) } debug_assert!(!rules.is_empty()); @@ -68,7 +68,9 @@ impl Filter { } } -fn push_filter(reader: &Reader, rules: &mut Vec<(String, bool)>, filter: &str, include: bool) { +fn push_filter(rules: &mut Vec<(String, bool)>, filter: &str, include: bool) { + let reader = reader(); + if reader.contains_key(filter) { rules.push((filter.to_string(), include)); return; diff --git a/crates/libs/bindgen/src/lib.rs b/crates/libs/bindgen/src/lib.rs index fd2d363d39..1c65fa3602 100644 --- a/crates/libs/bindgen/src/lib.rs +++ b/crates/libs/bindgen/src/lib.rs @@ -159,11 +159,11 @@ where panic!("at least one `--filter` required"); } - let reader = Reader::new(expand_input(&input)); - let filter = Filter::new(reader, &include, &exclude); - let references = References::new(reader, references); - let types = TypeMap::filter(reader, &filter, &references); - let derive = Derive::new(reader, &types, &derive); + Reader::init(expand_input(&input)); + let filter = Filter::new(&include, &exclude); + let references = References::new(references); + let types = TypeMap::filter(&filter, &references); + let derive = Derive::new(&types, &derive); let config = Box::leak(Box::new(Config { types, diff --git a/crates/libs/bindgen/src/libraries.rs b/crates/libs/bindgen/src/libraries.rs index eaece2a530..a4041427e3 100644 --- a/crates/libs/bindgen/src/libraries.rs +++ b/crates/libs/bindgen/src/libraries.rs @@ -9,18 +9,10 @@ pub enum CallingConvention { // Returns the libraries and their function and stack sizes used by the gnu and msvc tools to build the umbrella libs. #[doc(hidden)] pub fn libraries() -> BTreeMap> { - let mut libraries = BTreeMap::new(); + Reader::init(expand_input(&["default"])); + let mut result = BTreeMap::>::new(); - let reader = Reader::new(expand_input(&["default"])); - combine_libraries(reader, &mut libraries); - libraries -} - -fn combine_libraries( - reader: &Reader, - libraries: &mut BTreeMap>, -) { - for types in reader.values() { + for types in reader().values() { for ty in types.values() { let Some(ty) = cpp_fn(ty) else { continue; @@ -40,12 +32,12 @@ fn combine_libraries( 0 }; - libraries + result .entry(library) .or_default() .insert(name, CallingConvention::Stdcall(params)); } else if flags.contains(PInvokeAttributes::CallConvCdecl) { - libraries + result .entry(library) .or_default() .insert(name, CallingConvention::Cdecl); @@ -54,6 +46,8 @@ fn combine_libraries( } } } + + result } fn cpp_fn(types: &[Type]) -> Option { diff --git a/crates/libs/bindgen/src/references.rs b/crates/libs/bindgen/src/references.rs index 7454a2dc97..fa869e22bb 100644 --- a/crates/libs/bindgen/src/references.rs +++ b/crates/libs/bindgen/src/references.rs @@ -68,13 +68,13 @@ pub struct Reference { pub struct References(Vec); impl References { - pub fn new(reader: &'static Reader, stage: Vec) -> Self { + pub fn new(stage: Vec) -> Self { Self( stage .into_iter() .map(|stage| { - let filter = Filter::new(reader, &[&stage.path], &[]); - let types = TypeMap::filter(reader, &filter, &References::default()); + let filter = Filter::new(&[&stage.path], &[]); + let types = TypeMap::filter(&filter, &References::default()); Reference { name: stage.name, diff --git a/crates/libs/bindgen/src/type_map.rs b/crates/libs/bindgen/src/type_map.rs index 17fe42ae9c..c2c8b279ac 100644 --- a/crates/libs/bindgen/src/type_map.rs +++ b/crates/libs/bindgen/src/type_map.rs @@ -17,8 +17,9 @@ impl TypeMap { } #[track_caller] - pub fn filter(reader: &'static Reader, filter: &Filter, references: &References) -> Self { + pub fn filter(filter: &Filter, references: &References) -> Self { let mut dependencies = Self::new(); + let reader = reader(); for namespace in reader.keys() { if filter.includes_namespace(namespace) { diff --git a/crates/libs/bindgen/src/winmd/reader.rs b/crates/libs/bindgen/src/winmd/reader.rs index 8d59b32cf4..060253f832 100644 --- a/crates/libs/bindgen/src/winmd/reader.rs +++ b/crates/libs/bindgen/src/winmd/reader.rs @@ -28,7 +28,7 @@ impl std::ops::Deref for Reader { } impl Reader { - pub fn new(files: Vec) -> &'static Self { + pub fn init(files: Vec) { let reader = Box::leak(Box::new(Self(HashMap::new()))); for file in files { @@ -180,7 +180,6 @@ impl Reader { } READER.store(reader, Ordering::Relaxed); - reader } #[track_caller]