Skip to content

Commit 31d163a

Browse files
committed
Improve error handling
1 parent 5fc8f90 commit 31d163a

File tree

1 file changed

+30
-24
lines changed

1 file changed

+30
-24
lines changed

crates/ra_proc_macro_srv/src/dylib.rs

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,35 @@ use goblin::{mach::Mach, Object};
77
use libloading::Library;
88
use 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

5259
fn 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

94100
impl 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

Comments
 (0)