From a62323cafeb4d360ec19f01ee5a287525479b6ff Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Fri, 27 Mar 2015 11:50:14 -0700 Subject: [PATCH 1/2] refactor(hyper): remove need for collections feature --- src/header/mod.rs | 12 +++++++++++- src/header/shared/entity.rs | 14 +++++++------- src/lib.rs | 2 +- src/server/listener.rs | 15 ++++----------- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/header/mod.rs b/src/header/mod.rs index 40fa0718..49a25dd8 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -356,11 +356,21 @@ mod tests { use test::Bencher; + // Slice.position_elem is unstable + fn index_of(slice: &[u8], byte: u8) -> Option { + for (index, &b) in slice.iter().enumerate() { + if b == byte { + return Some(index); + } + } + None + } + macro_rules! raw { ($($line:expr),*) => ({ [$({ let line = $line; - let pos = line.position_elem(&b':').expect("raw splits on :, not found"); + let pos = index_of(line, b':').expect("raw splits on ':', not found"); httparse::Header { name: ::std::str::from_utf8(&line[..pos]).unwrap(), value: &line[pos + 2..] diff --git a/src/header/shared/entity.rs b/src/header/shared/entity.rs index 18b05ce9..5d193f56 100644 --- a/src/header/shared/entity.rs +++ b/src/header/shared/entity.rs @@ -47,29 +47,29 @@ impl FromStr for EntityTag { // Early exits: // 1. The string is empty, or, // 2. it doesn't terminate in a DQUOTE. - if slice.is_empty() || !slice.ends_with("\"") { + if slice.is_empty() || !slice.ends_with('"') { return Err(()); } // The etag is weak if its first char is not a DQUOTE. - if slice.chars().next().unwrap() == '"' /* '"' */ { + if slice.starts_with('"') /* '"' */ { // No need to check if the last char is a DQUOTE, // we already did that above. - if check_slice_validity(slice.slice_chars(1, length-1)) { + if check_slice_validity(&slice[1..length-1]) { return Ok(EntityTag { weak: false, - tag: slice.slice_chars(1, length-1).to_string() + tag: slice[1..length-1].to_string() }); } else { return Err(()); } } - if slice.slice_chars(0, 3) == "W/\"" { - if check_slice_validity(slice.slice_chars(3, length-1)) { + if slice.starts_with("W/\"") { + if check_slice_validity(&slice[3..length-1]) { return Ok(EntityTag { weak: true, - tag: slice.slice_chars(3, length-1).to_string() + tag: slice[3..length-1].to_string() }); } else { return Err(()); diff --git a/src/lib.rs b/src/lib.rs index 076b3682..9325539d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ #![doc(html_root_url = "https://hyperium.github.io/hyper/hyper/index.html")] -#![feature(core, collections, io, +#![feature(core, io, box_syntax, unsafe_destructor, into_cow, convert)] #![deny(missing_docs)] #![cfg_attr(test, deny(warnings))] diff --git a/src/server/listener.rs b/src/server/listener.rs index 86e64a19..a2e0714c 100644 --- a/src/server/listener.rs +++ b/src/server/listener.rs @@ -1,6 +1,5 @@ use std::thread::{self, JoinGuard}; use std::sync::mpsc; -use std::collections::VecMap; use net::NetworkListener; pub struct ListenerPool { @@ -24,22 +23,16 @@ impl<'a, A: NetworkListener + Send + 'a> ListenerPool { let (super_tx, supervisor_rx) = mpsc::channel(); - let counter = &mut 0; let work = &work; - let mut spawn = move || { - let id = *counter; - let guard = spawn_with(super_tx.clone(), work, self.acceptor.clone(), id); - *counter += 1; - (id, guard) + let spawn = move |id| { + spawn_with(super_tx.clone(), work, self.acceptor.clone(), id) }; // Go - let mut guards: VecMap<_> = (0..threads).map(|_| spawn()).collect(); + let mut guards: Vec<_> = (0..threads).map(|id| spawn(id)).collect(); for id in supervisor_rx.iter() { - guards.remove(&id); - let (id, guard) = spawn(); - guards.insert(id, guard); + guards[id] = spawn(id); } } } From dbee6af8df1ca9bb89b71ccb9a52192a672c6a8f Mon Sep 17 00:00:00 2001 From: Jonathan Reem Date: Mon, 23 Mar 2015 13:29:17 -0700 Subject: [PATCH 2/2] refactor(hyper): Remove the box_syntax feature gate. --- src/client/request.rs | 2 +- src/client/response.rs | 12 ++++++------ src/header/internals/item.rs | 2 +- src/lib.rs | 3 +-- src/net.rs | 8 ++++---- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/client/request.rs b/src/client/request.rs index 5fa47d50..338bb52d 100644 --- a/src/client/request.rs +++ b/src/client/request.rs @@ -57,7 +57,7 @@ impl Request { let stream = try!(connector.connect(&*host, port, &*url.scheme)); // FIXME: Use Type ascription - let stream: Box = box stream; + let stream: Box = Box::new(stream); let stream = ThroughWriter(BufWriter::new(stream)); let mut headers = Headers::new(); diff --git a/src/client/response.rs b/src/client/response.rs index a450258e..8abb493e 100644 --- a/src/client/response.rs +++ b/src/client/response.rs @@ -130,13 +130,13 @@ mod tests { status: status::StatusCode::Ok, headers: Headers::new(), version: version::HttpVersion::Http11, - body: EofReader(BufReader::new(box MockStream::new())), + body: EofReader(BufReader::new(Box::new(MockStream::new()))), status_raw: RawStatus(200, Borrowed("OK")), _marker: PhantomData, }; let b = res.into_inner().downcast::().ok().unwrap(); - assert_eq!(b, box MockStream::new()); + assert_eq!(b, Box::new(MockStream::new())); } @@ -156,7 +156,7 @@ mod tests { \r\n" ); - let res = Response::new(box stream).unwrap(); + let res = Response::new(Box::new(stream)).unwrap(); // The status line is correct? assert_eq!(res.status, status::StatusCode::Ok); @@ -187,7 +187,7 @@ mod tests { \r\n" ); - let res = Response::new(box stream).unwrap(); + let res = Response::new(Box::new(stream)).unwrap(); assert!(read_to_string(res).is_err()); } @@ -206,7 +206,7 @@ mod tests { \r\n" ); - let res = Response::new(box stream).unwrap(); + let res = Response::new(Box::new(stream)).unwrap(); assert!(read_to_string(res).is_err()); } @@ -225,7 +225,7 @@ mod tests { \r\n" ); - let res = Response::new(box stream).unwrap(); + let res = Response::new(Box::new(stream)).unwrap(); assert_eq!(read_to_string(res), Ok("1".to_string())); } diff --git a/src/header/internals/item.rs b/src/header/internals/item.rs index 7a7dccd9..f6d11af0 100644 --- a/src/header/internals/item.rs +++ b/src/header/internals/item.rs @@ -85,7 +85,7 @@ impl Item { fn parse(raw: &Vec>) -> Option> { Header::parse_header(&raw[..]).map(|h: H| { // FIXME: Use Type ascription - let h: Box = box h; + let h: Box = Box::new(h); h }) } diff --git a/src/lib.rs b/src/lib.rs index 9325539d..86aa445f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,5 @@ #![doc(html_root_url = "https://hyperium.github.io/hyper/hyper/index.html")] -#![feature(core, io, - box_syntax, unsafe_destructor, into_cow, convert)] +#![feature(core, io, unsafe_destructor, into_cow, convert)] #![deny(missing_docs)] #![cfg_attr(test, deny(warnings))] #![cfg_attr(test, feature(alloc, test))] diff --git a/src/net.rs b/src/net.rs index 2a800ef9..1157514c 100644 --- a/src/net.rs +++ b/src/net.rs @@ -355,20 +355,20 @@ mod tests { #[test] fn test_downcast_box_stream() { // FIXME: Use Type ascription - let stream: Box = box MockStream::new(); + let stream: Box = Box::new(MockStream::new()); let mock = stream.downcast::().ok().unwrap(); - assert_eq!(mock, box MockStream::new()); + assert_eq!(mock, Box::new(MockStream::new())); } #[test] fn test_downcast_unchecked_box_stream() { // FIXME: Use Type ascription - let stream: Box = box MockStream::new(); + let stream: Box = Box::new(MockStream::new()); let mock = unsafe { stream.downcast_unchecked::() }; - assert_eq!(mock, box MockStream::new()); + assert_eq!(mock, Box::new(MockStream::new())); }