From 2161fb25ca9986c11212e447d88da592bcf736ce Mon Sep 17 00:00:00 2001 From: =?utf8?q?Johannes=20L=C3=B6thberg?= Date: Tue, 18 Jul 2017 01:27:55 +0200 Subject: [PATCH] Implement FromStr for RelroLevel rather than duplicating the match MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Johannes Löthberg --- src/librustc/session/config.rs | 9 ++++++--- src/librustc_back/lib.rs | 15 +++++++++++++++ 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 @@ fn parse_panic_strategy(slot: &mut Option, v: Option<&str>) -> bo fn parse_relro_level(slot: &mut Option, 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::() { + 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 slice; pub mod dynamic_lib; +use std::str::FromStr; + use serialize::json::{Json, ToJson}; macro_rules! linker_flavor { @@ -132,6 +134,19 @@ pub fn desc(&self) -> &str { } } +impl FromStr for RelroLevel { + type Err = (); + + fn from_str(s: &str) -> Result { + 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 @@ macro_rules! key { ($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::() { + 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))), -- 2.44.0