@@ -7,28 +7,35 @@ use goblin::{mach::Mach, Object};
77use libloading:: Library ;
88use ra_proc_macro:: ProcMacroKind ;
99
10- static NEW_REGISTRAR_SYMBOL : & str = "_rustc_proc_macro_decls_" ;
10+ use std:: io:: Error as IoError ;
11+ use std:: io:: ErrorKind as IoErrorKind ;
1112
12- fn get_symbols_from_lib ( file : & Path ) -> Option < Vec < String > > {
13- let buffer = std:: fs:: read ( file) . ok ( ) ?;
14- let object = Object :: parse ( & buffer) . ok ( ) ?;
13+ const NEW_REGISTRAR_SYMBOL : & str = "_rustc_proc_macro_decls_" ;
1514
16- return match object {
15+ fn invalid_data_err ( e : impl Into < Box < dyn std:: error:: Error + Send + Sync > > ) -> IoError {
16+ IoError :: new ( IoErrorKind :: InvalidData , e)
17+ }
18+
19+ fn get_symbols_from_lib ( file : & Path ) -> Result < Vec < String > , IoError > {
20+ let buffer = std:: fs:: read ( file) ?;
21+ let object = Object :: parse ( & buffer) . map_err ( invalid_data_err) ?;
22+
23+ match object {
1724 Object :: Elf ( elf) => {
18- let symbols = elf. dynstrtab . to_vec ( ) . ok ( ) ?;
25+ let symbols = elf. dynstrtab . to_vec ( ) . map_err ( invalid_data_err ) ?;
1926 let names = symbols. iter ( ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
20- Some ( names)
27+ Ok ( names)
2128 }
2229 Object :: PE ( pe) => {
2330 let symbol_names =
2431 pe. exports . iter ( ) . flat_map ( |s| s. name ) . map ( |n| n. to_string ( ) ) . collect ( ) ;
25- Some ( symbol_names)
32+ Ok ( symbol_names)
2633 }
2734 Object :: Mach ( mach) => match mach {
2835 Mach :: Binary ( binary) => {
29- let exports = binary. exports ( ) . ok ( ) ?;
36+ let exports = binary. exports ( ) . map_err ( invalid_data_err ) ?;
3037 let names = exports
31- . iter ( )
38+ . into_iter ( )
3239 . map ( |s| {
3340 // In macos doc:
3441 // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/dlsym.3.html
@@ -37,26 +44,25 @@ fn get_symbols_from_lib(file: &Path) -> Option<Vec<String>> {
3744 if s. name . starts_with ( "_" ) {
3845 s. name [ 1 ..] . to_string ( )
3946 } else {
40- s. name . to_string ( )
47+ s. name
4148 }
4249 } )
4350 . collect ( ) ;
44- Some ( names)
51+ Ok ( names)
4552 }
46- Mach :: Fat ( _) => None ,
53+ Mach :: Fat ( _) => Ok ( vec ! [ ] ) ,
4754 } ,
48- Object :: Archive ( _) | Object :: Unknown ( _) => None ,
49- } ;
55+ Object :: Archive ( _) | Object :: Unknown ( _) => Ok ( vec ! [ ] ) ,
56+ }
5057}
5158
5259fn is_derive_registrar_symbol ( symbol : & str ) -> bool {
5360 symbol. contains ( NEW_REGISTRAR_SYMBOL )
5461}
5562
56- fn find_registrar_symbol ( file : & Path ) -> Option < String > {
63+ fn find_registrar_symbol ( file : & Path ) -> Result < Option < String > , IoError > {
5764 let symbols = get_symbols_from_lib ( file) ?;
58-
59- symbols. iter ( ) . find ( |s| is_derive_registrar_symbol ( s) ) . map ( |s| s. clone ( ) )
65+ Ok ( symbols. into_iter ( ) . find ( |s| is_derive_registrar_symbol ( s) ) )
6066}
6167
6268/// Loads dynamic library in platform dependent manner.
@@ -92,14 +98,14 @@ struct ProcMacroLibraryLibloading {
9298}
9399
94100impl ProcMacroLibraryLibloading {
95- fn open ( file : & Path ) -> Result < Self , String > {
96- let symbol_name = find_registrar_symbol ( file)
97- . ok_or ( format ! ( "Cannot find registrar symbol in file {:?}" , file) ) ?;
101+ fn open ( file : & Path ) -> Result < Self , IoError > {
102+ let symbol_name = find_registrar_symbol ( file) ?
103+ . ok_or ( invalid_data_err ( format ! ( "Cannot find registrar symbol in file {:?}" , file) ) ) ?;
98104
99- let lib = load_library ( file) . map_err ( |e| e . to_string ( ) ) ?;
105+ let lib = load_library ( file) . map_err ( invalid_data_err ) ?;
100106 let exported_macros = {
101107 let macros: libloading:: Symbol < & & [ bridge:: client:: ProcMacro ] > =
102- unsafe { lib. get ( symbol_name. as_bytes ( ) ) } . map_err ( |e| e . to_string ( ) ) ?;
108+ unsafe { lib. get ( symbol_name. as_bytes ( ) ) } . map_err ( invalid_data_err ) ?;
103109 macros. to_vec ( )
104110 } ;
105111
@@ -122,7 +128,7 @@ impl Expander {
122128 let lib =
123129 lib. as_ref ( ) . canonicalize ( ) . expect ( & format ! ( "Cannot canonicalize {:?}" , lib. as_ref( ) ) ) ;
124130
125- let library = ProcMacroLibraryImpl :: open ( & lib) ?;
131+ let library = ProcMacroLibraryImpl :: open ( & lib) . map_err ( |e| e . to_string ( ) ) ?;
126132 libs. push ( library) ;
127133
128134 Ok ( Expander { libs } )
0 commit comments