X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=crates%2Fproc_macro_srv%2Fsrc%2Fabis%2Fmod.rs;h=c78e88dcb8d8834c738e561cd5b09e7ac59684fe;hb=c934a99fd3ae6b8a3c19ce2d02173031bf81532c;hp=3b30aaa90bd2f0da6be86aaf2676d8f4612ad716;hpb=e240eb67a86bb4deff2762e3c46f47278ccd975c;p=rust.git diff --git a/crates/proc_macro_srv/src/abis/mod.rs b/crates/proc_macro_srv/src/abis/mod.rs index 3b30aaa90bd..c78e88dcb8d 100644 --- a/crates/proc_macro_srv/src/abis/mod.rs +++ b/crates/proc_macro_srv/src/abis/mod.rs @@ -25,11 +25,15 @@ // pub(crate) so tests can use the TokenStream, more notes in test/utils.rs pub(crate) mod abi_1_47; -mod abi_1_55; +mod abi_1_54; +mod abi_1_56; +mod abi_1_58; use super::dylib::LoadProcMacroDylibError; pub(crate) use abi_1_47::Abi as Abi_1_47; -pub(crate) use abi_1_55::Abi as Abi_1_55; +pub(crate) use abi_1_54::Abi as Abi_1_54; +pub(crate) use abi_1_56::Abi as Abi_1_56; +pub(crate) use abi_1_58::Abi as Abi_1_58; use libloading::Library; use proc_macro_api::{ProcMacroKind, RustCInfo}; @@ -45,7 +49,9 @@ pub fn as_str(&self) -> Option { pub(crate) enum Abi { Abi1_47(Abi_1_47), - Abi1_55(Abi_1_55), + Abi1_54(Abi_1_54), + Abi1_56(Abi_1_56), + Abi1_58(Abi_1_58), } impl Abi { @@ -63,16 +69,26 @@ pub fn from_lib( symbol_name: String, info: RustCInfo, ) -> Result { - if info.version.0 != 1 { - Err(LoadProcMacroDylibError::UnsupportedABI) - } else if info.version.1 < 47 { - Err(LoadProcMacroDylibError::UnsupportedABI) - } else if info.version.1 < 54 { - let inner = unsafe { Abi_1_47::from_lib(lib, symbol_name) }?; - Ok(Abi::Abi1_47(inner)) - } else { - let inner = unsafe { Abi_1_55::from_lib(lib, symbol_name) }?; - Ok(Abi::Abi1_55(inner)) + // FIXME: this should use exclusive ranges when they're stable + // https://github.com/rust-lang/rust/issues/37854 + match (info.version.0, info.version.1) { + (1, 47..=53) => { + let inner = unsafe { Abi_1_47::from_lib(lib, symbol_name) }?; + Ok(Abi::Abi1_47(inner)) + } + (1, 54..=55) => { + let inner = unsafe { Abi_1_54::from_lib(lib, symbol_name) }?; + Ok(Abi::Abi1_54(inner)) + } + (1, 56..=57) => { + let inner = unsafe { Abi_1_56::from_lib(lib, symbol_name) }?; + Ok(Abi::Abi1_56(inner)) + } + (1, 58..) => { + let inner = unsafe { Abi_1_58::from_lib(lib, symbol_name) }?; + Ok(Abi::Abi1_58(inner)) + } + _ => Err(LoadProcMacroDylibError::UnsupportedABI), } } @@ -83,15 +99,19 @@ pub fn expand( attributes: Option<&tt::Subtree>, ) -> Result { match self { - Self::Abi1_55(abi) => abi.expand(macro_name, macro_body, attributes), Self::Abi1_47(abi) => abi.expand(macro_name, macro_body, attributes), + Self::Abi1_54(abi) => abi.expand(macro_name, macro_body, attributes), + Self::Abi1_56(abi) => abi.expand(macro_name, macro_body, attributes), + Self::Abi1_58(abi) => abi.expand(macro_name, macro_body, attributes), } } pub fn list_macros(&self) -> Vec<(String, ProcMacroKind)> { match self { Self::Abi1_47(abi) => abi.list_macros(), - Self::Abi1_55(abi) => abi.list_macros(), + Self::Abi1_54(abi) => abi.list_macros(), + Self::Abi1_56(abi) => abi.list_macros(), + Self::Abi1_58(abi) => abi.list_macros(), } } }