From 3b2e53dd629e31596a31c12d2275565bc3eacdbf Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Tue, 21 Apr 2015 21:32:12 -0700 Subject: [PATCH 1/4] syntax: Copy unstable str::slice_shift_char into libsyntax --- src/libsyntax/ext/asm.rs | 3 ++- src/libsyntax/lib.rs | 1 - src/libsyntax/print/pprust.rs | 3 ++- src/libsyntax/str.rs | 12 ++++++++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs index 6915969032810..2e48197a841f2 100644 --- a/src/libsyntax/ext/asm.rs +++ b/src/libsyntax/ext/asm.rs @@ -22,6 +22,7 @@ use feature_gate; use parse::token::InternedString; use parse::token; use ptr::P; +use str::slice_shift_char; enum State { Asm, @@ -109,7 +110,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) // It's the opposite of '=&' which means that the memory // cannot be shared with any other operand (usually when // a register is clobbered early.) - let output = match constraint.slice_shift_char() { + let output = match slice_shift_char(&constraint) { Some(('=', _)) => None, Some(('+', operand)) => { Some(token::intern_and_get_ident(&format!( diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index d8beeb6a5503b..3dd4f7c2be636 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -31,7 +31,6 @@ #![feature(rustc_private)] #![feature(staged_api)] #![feature(unicode)] -#![feature(str_char)] extern crate arena; extern crate fmt_macros; diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 36364eb9bf3d5..eae5c17c1807a 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -27,6 +27,7 @@ use print::pp::{Breaks, eof}; use print::pp::Breaks::{Consistent, Inconsistent}; use ptr::P; use std_inject; +use str::slice_shift_char; use std::ascii; use std::io::{self, Write, Read}; @@ -1873,7 +1874,7 @@ impl<'a> State<'a> { try!(self.commasep(Inconsistent, &a.outputs, |s, &(ref co, ref o, is_rw)| { - match co.slice_shift_char() { + match slice_shift_char(co) { Some(('=', operand)) if is_rw => { try!(s.print_string(&format!("+{}", operand), ast::CookedStr)) diff --git a/src/libsyntax/str.rs b/src/libsyntax/str.rs index d0f47629b10e5..d30207f2f2cc4 100644 --- a/src/libsyntax/str.rs +++ b/src/libsyntax/str.rs @@ -8,6 +8,18 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// FIXME: This was copied from core/str/mod.rs because it is currently unstable. pub fn char_at(s: &str, byte: usize) -> char { s[byte..].chars().next().unwrap() } + +// FIXME: This was copied from core/str/mod.rs because it is currently unstable. +#[inline] +pub fn slice_shift_char(s: &str) -> Option<(char, &str)> { + if s.is_empty() { + None + } else { + let ch = char_at(s, 0); + Some((ch, &s[ch.len_utf8()..])) + } +} From 7770d0ca31cbe665ccafcee7a41da309fe497b2a Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Tue, 21 Apr 2015 21:52:38 -0700 Subject: [PATCH 2/4] syntax: Minor cleanup --- src/libsyntax/codemap.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index 5e0cb647c8b41..5cc6ff92c3437 100644 --- a/src/libsyntax/codemap.rs +++ b/src/libsyntax/codemap.rs @@ -20,11 +20,10 @@ pub use self::MacroFormat::*; use std::cell::RefCell; +use std::fmt; use std::ops::{Add, Sub}; use std::rc::Rc; -use std::fmt; - use serialize::{Encodable, Decodable, Encoder, Decoder}; From b41560acd0421644546f2d9584ef1088fd283a49 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Wed, 22 Apr 2015 07:34:13 -0700 Subject: [PATCH 3/4] syntax: Rewrite P::map and MoveMap to not use unstable ptr::read_and_drop While this is slower than before, it's not necessarily forward compatible with planned changes to the drop flag. Benchmarking suggests that this does not dramatically impact the compile times of rust. --- src/libsyntax/fold.rs | 11 ++--------- src/libsyntax/ptr.rs | 10 ++-------- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 5352a191b095f..a9cefd538e785 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -25,7 +25,6 @@ use codemap::{respan, Span, Spanned}; use owned_slice::OwnedSlice; use parse::token; use ptr::P; -use std::ptr; use util::small_vector::SmallVector; use std::rc::Rc; @@ -36,14 +35,8 @@ pub trait MoveMap { } impl MoveMap for Vec { - fn move_map(mut self, mut f: F) -> Vec where F: FnMut(T) -> T { - for p in &mut self { - unsafe { - // FIXME(#5016) this shouldn't need to zero to be safe. - ptr::write(p, f(ptr::read_and_drop(p))); - } - } - self + fn move_map(self, mut f: F) -> Vec where F: FnMut(T) -> T { + self.into_iter().map(|p| f(p)).collect() } } diff --git a/src/libsyntax/ptr.rs b/src/libsyntax/ptr.rs index 83e321f110c58..aa02f1ef3535b 100644 --- a/src/libsyntax/ptr.rs +++ b/src/libsyntax/ptr.rs @@ -39,7 +39,6 @@ use std::fmt::{self, Display, Debug}; use std::hash::{Hash, Hasher}; use std::ops::Deref; -use std::ptr; use serialize::{Encodable, Decodable, Encoder, Decoder}; @@ -66,15 +65,10 @@ impl P { } /// Transform the inner value, consuming `self` and producing a new `P`. - pub fn map(mut self, f: F) -> P where + pub fn map(self, f: F) -> P where F: FnOnce(T) -> T, { - unsafe { - let p = &mut *self.ptr; - // FIXME(#5016) this shouldn't need to drop-fill to be safe. - ptr::write(p, f(ptr::read_and_drop(p))); - } - self + P(f(*self.ptr)) } } From 3eeeaf7fa30769e4e8592c225d8f56141b2e1748 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Wed, 22 Apr 2015 07:59:10 -0700 Subject: [PATCH 4/4] syntax: Replace stable slice::ref_slice with unsafe slice::from_raw_parts --- src/libsyntax/parse/parser.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 5f097256318c0..d78d8b4829c16 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -404,7 +404,11 @@ impl<'a> Parser<'a> { this_token_str))) } } else { - self.expect_one_of(slice::ref_slice(t), &[]) + // FIXME: Using this because `slice::ref_slice` is unstable. + let slice = unsafe { + slice::from_raw_parts(t, 1) + }; + self.expect_one_of(slice, &[]) } }