mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
syntax: Rewrite pp advance_left to use a constant stack size
This commit is contained in:
parent
92b48556e0
commit
caf4a90c66
@ -317,9 +317,7 @@ impl Printer {
|
|||||||
Token::Eof => {
|
Token::Eof => {
|
||||||
if !self.scan_stack_empty {
|
if !self.scan_stack_empty {
|
||||||
self.check_stack(0);
|
self.check_stack(0);
|
||||||
let left = self.token[self.left].clone();
|
try!(self.advance_left());
|
||||||
let left_size = self.size[self.left];
|
|
||||||
try!(self.advance_left(left, left_size));
|
|
||||||
}
|
}
|
||||||
self.indent(0);
|
self.indent(0);
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -370,16 +368,16 @@ impl Printer {
|
|||||||
self.right_total += b.blank_space;
|
self.right_total += b.blank_space;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
Token::String(ref s, len) => {
|
Token::String(s, len) => {
|
||||||
if self.scan_stack_empty {
|
if self.scan_stack_empty {
|
||||||
debug!("pp String('{}')/print ~[{},{}]",
|
debug!("pp String('{}')/print ~[{},{}]",
|
||||||
*s, self.left, self.right);
|
s, self.left, self.right);
|
||||||
self.print(token.clone(), len)
|
self.print(Token::String(s, len), len)
|
||||||
} else {
|
} else {
|
||||||
debug!("pp String('{}')/buffer ~[{},{}]",
|
debug!("pp String('{}')/buffer ~[{},{}]",
|
||||||
*s, self.left, self.right);
|
s, self.left, self.right);
|
||||||
self.advance_right();
|
self.advance_right();
|
||||||
self.token[self.right] = token.clone();
|
self.token[self.right] = Token::String(s, len);
|
||||||
self.size[self.right] = len;
|
self.size[self.right] = len;
|
||||||
self.right_total += len;
|
self.right_total += len;
|
||||||
self.check_stream()
|
self.check_stream()
|
||||||
@ -400,9 +398,7 @@ impl Printer {
|
|||||||
self.size[scanned] = SIZE_INFINITY;
|
self.size[scanned] = SIZE_INFINITY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let left = self.token[self.left].clone();
|
try!(self.advance_left());
|
||||||
let left_size = self.size[self.left];
|
|
||||||
try!(self.advance_left(left, left_size));
|
|
||||||
if self.left != self.right {
|
if self.left != self.right {
|
||||||
try!(self.check_stream());
|
try!(self.check_stream());
|
||||||
}
|
}
|
||||||
@ -449,29 +445,39 @@ impl Printer {
|
|||||||
self.right %= self.buf_len;
|
self.right %= self.buf_len;
|
||||||
assert!((self.right != self.left));
|
assert!((self.right != self.left));
|
||||||
}
|
}
|
||||||
pub fn advance_left(&mut self, x: Token, l: int) -> io::IoResult<()> {
|
pub fn advance_left(&mut self) -> io::IoResult<()> {
|
||||||
debug!("advance_left ~[{},{}], sizeof({})={}", self.left, self.right,
|
debug!("advance_left ~[{},{}], sizeof({})={}", self.left, self.right,
|
||||||
self.left, l);
|
self.left, self.size[self.left]);
|
||||||
if l >= 0 {
|
|
||||||
let ret = self.print(x.clone(), l);
|
let mut left_size = self.size[self.left];
|
||||||
match x {
|
|
||||||
Token::Break(b) => self.left_total += b.blank_space,
|
while left_size >= 0 {
|
||||||
Token::String(_, len) => {
|
let left = self.token[self.left].clone();
|
||||||
assert_eq!(len, l); self.left_total += len;
|
|
||||||
}
|
let len = match left {
|
||||||
_ => ()
|
Token::Break(b) => b.blank_space,
|
||||||
|
Token::String(_, len) => {
|
||||||
|
assert_eq!(len, left_size);
|
||||||
|
len
|
||||||
|
}
|
||||||
|
_ => 0
|
||||||
|
};
|
||||||
|
|
||||||
|
try!(self.print(left, left_size));
|
||||||
|
|
||||||
|
self.left_total += len;
|
||||||
|
|
||||||
|
if self.left == self.right {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if self.left != self.right {
|
|
||||||
self.left += 1u;
|
self.left += 1u;
|
||||||
self.left %= self.buf_len;
|
self.left %= self.buf_len;
|
||||||
let left = self.token[self.left].clone();
|
|
||||||
let left_size = self.size[self.left];
|
left_size = self.size[self.left];
|
||||||
try!(self.advance_left(left, left_size));
|
|
||||||
}
|
|
||||||
ret
|
|
||||||
} else {
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
pub fn check_stack(&mut self, k: int) {
|
pub fn check_stack(&mut self, k: int) {
|
||||||
if !self.scan_stack_empty {
|
if !self.scan_stack_empty {
|
||||||
|
Loading…
Reference in New Issue
Block a user