|
17 | 17 |
|
18 | 18 | pub use self::IpAddr::*;
|
19 | 19 |
|
| 20 | +use boxed::Box; |
20 | 21 | use fmt;
|
21 | 22 | use io::{self, IoResult, IoError};
|
22 | 23 | use io::net;
|
23 | 24 | use iter::{Iterator, IteratorExt};
|
24 |
| -use ops::FnOnce; |
| 25 | +use ops::{FnOnce, FnMut}; |
25 | 26 | use option::Option;
|
26 | 27 | use option::Option::{None, Some};
|
27 | 28 | use result::Result::{Ok, Err};
|
@@ -120,10 +121,10 @@ impl<'a> Parser<'a> {
|
120 | 121 | }
|
121 | 122 |
|
122 | 123 | // Return result of first successful parser
|
123 |
| - fn read_or<T>(&mut self, parsers: &mut [|&mut Parser| -> Option<T>]) |
| 124 | + fn read_or<T>(&mut self, parsers: &mut [Box<FnMut(&mut Parser) -> Option<T>>]) |
124 | 125 | -> Option<T> {
|
125 | 126 | for pf in parsers.iter_mut() {
|
126 |
| - match self.read_atomically(|p: &mut Parser| (*pf)(p)) { |
| 127 | + match self.read_atomically(|p: &mut Parser| pf.call_mut((p,))) { |
127 | 128 | Some(r) => return Some(r),
|
128 | 129 | None => {}
|
129 | 130 | }
|
@@ -320,22 +321,22 @@ impl<'a> Parser<'a> {
|
320 | 321 | }
|
321 | 322 |
|
322 | 323 | fn read_ip_addr(&mut self) -> Option<IpAddr> {
|
323 |
| - let ipv4_addr = |p: &mut Parser| p.read_ipv4_addr(); |
324 |
| - let ipv6_addr = |p: &mut Parser| p.read_ipv6_addr(); |
325 |
| - self.read_or(&mut [ipv4_addr, ipv6_addr]) |
| 324 | + let ipv4_addr = |&mut: p: &mut Parser| p.read_ipv4_addr(); |
| 325 | + let ipv6_addr = |&mut: p: &mut Parser| p.read_ipv6_addr(); |
| 326 | + self.read_or(&mut [box ipv4_addr, box ipv6_addr]) |
326 | 327 | }
|
327 | 328 |
|
328 | 329 | fn read_socket_addr(&mut self) -> Option<SocketAddr> {
|
329 | 330 | let ip_addr = |&: p: &mut Parser| {
|
330 |
| - let ipv4_p = |p: &mut Parser| p.read_ip_addr(); |
331 |
| - let ipv6_p = |p: &mut Parser| { |
| 331 | + let ipv4_p = |&mut: p: &mut Parser| p.read_ip_addr(); |
| 332 | + let ipv6_p = |&mut: p: &mut Parser| { |
332 | 333 | let open_br = |&: p: &mut Parser| p.read_given_char('[');
|
333 | 334 | let ip_addr = |&: p: &mut Parser| p.read_ipv6_addr();
|
334 | 335 | let clos_br = |&: p: &mut Parser| p.read_given_char(']');
|
335 | 336 | p.read_seq_3::<char, IpAddr, char, _, _, _>(open_br, ip_addr, clos_br)
|
336 | 337 | .map(|t| match t { (_, ip, _) => ip })
|
337 | 338 | };
|
338 |
| - p.read_or(&mut [ipv4_p, ipv6_p]) |
| 339 | + p.read_or(&mut [box ipv4_p, box ipv6_p]) |
339 | 340 | };
|
340 | 341 | let colon = |&: p: &mut Parser| p.read_given_char(':');
|
341 | 342 | let port = |&: p: &mut Parser| p.read_number(10, 5, 0x10000).map(|n| n as u16);
|
|
0 commit comments