Updates for panic-safety
This commit is contained in:
parent
5670d235e9
commit
ba448f4033
20
src/lib.rs
20
src/lib.rs
|
@ -29,6 +29,9 @@ fn parse_digits(str: &str) -> Option<(usize, &str)> {
|
||||||
fn demangle_template_args(mut str: &str) -> Option<(&str, String)> {
|
fn demangle_template_args(mut str: &str) -> Option<(&str, String)> {
|
||||||
let tmpl_args = if let Some(start_idx) = str.find('<') {
|
let tmpl_args = if let Some(start_idx) = str.find('<') {
|
||||||
let end_idx = str.rfind('>')?;
|
let end_idx = str.rfind('>')?;
|
||||||
|
if end_idx < start_idx {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
let mut args = &str[start_idx + 1..end_idx];
|
let mut args = &str[start_idx + 1..end_idx];
|
||||||
str = &str[..start_idx];
|
str = &str[..start_idx];
|
||||||
let mut tmpl_args = "<".to_string();
|
let mut tmpl_args = "<".to_string();
|
||||||
|
@ -58,12 +61,18 @@ fn demangle_name(str: &str) -> Option<(String, String, &str)> {
|
||||||
let out = format!("{}", size);
|
let out = format!("{}", size);
|
||||||
return Some((out.clone(), out, rest));
|
return Some((out.clone(), out, rest));
|
||||||
}
|
}
|
||||||
|
if rest.len() < size {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
let (name, args) = demangle_template_args(&rest[..size])?;
|
let (name, args) = demangle_template_args(&rest[..size])?;
|
||||||
Some((name.to_string(), format!("{}{}", name, args), &rest[size..]))
|
Some((name.to_string(), format!("{}{}", name, args), &rest[size..]))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn demangle_qualified_name(mut str: &str) -> Option<(String, String, &str)> {
|
fn demangle_qualified_name(mut str: &str) -> Option<(String, String, &str)> {
|
||||||
if str.starts_with('Q') {
|
if str.starts_with('Q') {
|
||||||
|
if str.len() < 3 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
let count = usize::from_str(&str[1..2]).ok()?;
|
let count = usize::from_str(&str[1..2]).ok()?;
|
||||||
str = &str[2..];
|
str = &str[2..];
|
||||||
let mut last_class = String::new();
|
let mut last_class = String::new();
|
||||||
|
@ -146,7 +155,7 @@ fn demangle_arg(mut str: &str) -> Option<(String, String, &str)> {
|
||||||
let ret_post = format!("[{}]{}", count, arg_post);
|
let ret_post = format!("[{}]{}", count, arg_post);
|
||||||
return Some((result, ret_post, rest));
|
return Some((result, ret_post, rest));
|
||||||
}
|
}
|
||||||
result.push_str(match str.chars().next().unwrap() {
|
result.push_str(match str.chars().next()? {
|
||||||
'i' => "int",
|
'i' => "int",
|
||||||
'b' => "bool",
|
'b' => "bool",
|
||||||
'c' => "char",
|
'c' => "char",
|
||||||
|
@ -242,6 +251,10 @@ fn demangle_special_function(str: &str, class_name: &str) -> Option<String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn demangle(mut str: &str) -> Option<String> {
|
pub fn demangle(mut str: &str) -> Option<String> {
|
||||||
|
if !str.is_ascii() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
let mut special = false;
|
let mut special = false;
|
||||||
let mut cnst = false;
|
let mut cnst = false;
|
||||||
let mut fn_name: String;
|
let mut fn_name: String;
|
||||||
|
@ -587,5 +600,10 @@ mod tests {
|
||||||
"nw4r::g3d::GetAnmPlayPolicy(nw4r::g3d::AnmPolicy)::policyTable guard".to_string()
|
"nw4r::g3d::GetAnmPlayPolicy(nw4r::g3d::AnmPolicy)::policyTable guard".to_string()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
// Truncated symbol
|
||||||
|
assert_eq!(
|
||||||
|
demangle("lower_bound<Q24rstl180const_pointer_iterator<Q24rstl33pair<Ui,22CAdditiveAnimationInfo>,Q24rstl77vector<Q24rstl33pair<Ui,22CAdditiveAnimationInfo>,Q24rstl17rmemory_allocator>,Q24rstl17rmemory_allocator>,Ui,Q24rstl79pair_sorter_finder<Q24rstl33pair<Ui,22CAdditiveAnimationInfo>,Q24rstl8less<Ui>>>__4rstlFQ24rstl180const_pointer_iterator<Q24rstl33pair<Ui,22CAdditiveAnimationInfo>,Q24rstl77vector<Q24rstl33pair<Ui,22CAdditiveAnimationInfo>,Q24rstl17rmemory_allocator>,Q24rstl17rmemory_allocator>Q24rstl180const_p"),
|
||||||
|
None
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue