diff options
| author | Johannes Löthberg <johannes@kyriasis.com> | 2017-07-18 01:27:55 +0200 |
|---|---|---|
| committer | Johannes Löthberg <johannes@kyriasis.com> | 2017-07-18 01:27:55 +0200 |
| commit | 2161fb25ca9986c11212e447d88da592bcf736ce (patch) | |
| tree | df7ddf9c531d83e704a130a7e68cd60c97c01ac7 /src | |
| parent | 6a8328cfa30543614cb776dd66334bc0f8f2cdfc (diff) | |
| download | rust-2161fb25ca9986c11212e447d88da592bcf736ce.tar.gz rust-2161fb25ca9986c11212e447d88da592bcf736ce.zip | |
Implement FromStr for RelroLevel rather than duplicating the match
Signed-off-by: Johannes Löthberg <johannes@kyriasis.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/session/config.rs | 9 | ||||
| -rw-r--r-- | src/librustc_back/lib.rs | 15 | ||||
| -rw-r--r-- | src/librustc_back/target/mod.rs | 6 |
3 files changed, 23 insertions, 7 deletions
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index a5fa6c845bb..5661c412302 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -790,9 +790,12 @@ macro_rules! options { fn parse_relro_level(slot: &mut Option<RelroLevel>, v: Option<&str>) -> bool { match v { - Some("full") => *slot = Some(RelroLevel::Full), - Some("partial") => *slot = Some(RelroLevel::Partial), - Some("off") => *slot = Some(RelroLevel::Off), + Some(s) => { + match s.parse::<RelroLevel>() { + Ok(level) => *slot = Some(level), + _ => return false + } + }, _ => return false } true diff --git a/src/librustc_back/lib.rs b/src/librustc_back/lib.rs index 7ec9b77af4b..55b39f22670 100644 --- a/src/librustc_back/lib.rs +++ b/src/librustc_back/lib.rs @@ -47,6 +47,8 @@ pub mod target; pub mod slice; pub mod dynamic_lib; +use std::str::FromStr; + use serialize::json::{Json, ToJson}; macro_rules! linker_flavor { @@ -132,6 +134,19 @@ impl RelroLevel { } } +impl FromStr for RelroLevel { + type Err = (); + + fn from_str(s: &str) -> Result<RelroLevel, ()> { + match s { + "full" => Ok(RelroLevel::Full), + "partial" => Ok(RelroLevel::Partial), + "off" => Ok(RelroLevel::Off), + _ => Err(()), + } + } +} + impl ToJson for RelroLevel { fn to_json(&self) -> Json { match *self { diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs index a07f5d154a1..0dbfdb4d809 100644 --- a/src/librustc_back/target/mod.rs +++ b/src/librustc_back/target/mod.rs @@ -588,10 +588,8 @@ impl Target { ($key_name:ident, RelroLevel) => ( { let name = (stringify!($key_name)).replace("_", "-"); obj.find(&name[..]).and_then(|o| o.as_string().and_then(|s| { - match s { - "full" => base.options.$key_name = RelroLevel::Full, - "partial" => base.options.$key_name = RelroLevel::Partial, - "off" => base.options.$key_name = RelroLevel::Off, + match s.parse::<RelroLevel>() { + Ok(level) => base.options.$key_name = level, _ => return Some(Err(format!("'{}' is not a valid value for \ relro-level. Use 'full', 'partial, or 'off'.", s))), |
