Skip to content

Commit caf4a90

Browse files
committed
syntax: Rewrite pp advance_left to use a constant stack size
1 parent 92b4855 commit caf4a90

File tree

1 file changed

+37
-31
lines changed

1 file changed

+37
-31
lines changed

src/libsyntax/print/pp.rs

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,7 @@ impl Printer {
317317
Token::Eof => {
318318
if !self.scan_stack_empty {
319319
self.check_stack(0);
320-
let left = self.token[self.left].clone();
321-
let left_size = self.size[self.left];
322-
try!(self.advance_left(left, left_size));
320+
try!(self.advance_left());
323321
}
324322
self.indent(0);
325323
Ok(())
@@ -370,16 +368,16 @@ impl Printer {
370368
self.right_total += b.blank_space;
371369
Ok(())
372370
}
373-
Token::String(ref s, len) => {
371+
Token::String(s, len) => {
374372
if self.scan_stack_empty {
375373
debug!("pp String('{}')/print ~[{},{}]",
376-
*s, self.left, self.right);
377-
self.print(token.clone(), len)
374+
s, self.left, self.right);
375+
self.print(Token::String(s, len), len)
378376
} else {
379377
debug!("pp String('{}')/buffer ~[{},{}]",
380-
*s, self.left, self.right);
378+
s, self.left, self.right);
381379
self.advance_right();
382-
self.token[self.right] = token.clone();
380+
self.token[self.right] = Token::String(s, len);
383381
self.size[self.right] = len;
384382
self.right_total += len;
385383
self.check_stream()
@@ -400,9 +398,7 @@ impl Printer {
400398
self.size[scanned] = SIZE_INFINITY;
401399
}
402400
}
403-
let left = self.token[self.left].clone();
404-
let left_size = self.size[self.left];
405-
try!(self.advance_left(left, left_size));
401+
try!(self.advance_left());
406402
if self.left != self.right {
407403
try!(self.check_stream());
408404
}
@@ -449,29 +445,39 @@ impl Printer {
449445
self.right %= self.buf_len;
450446
assert!((self.right != self.left));
451447
}
452-
pub fn advance_left(&mut self, x: Token, l: int) -> io::IoResult<()> {
448+
pub fn advance_left(&mut self) -> io::IoResult<()> {
453449
debug!("advance_left ~[{},{}], sizeof({})={}", self.left, self.right,
454-
self.left, l);
455-
if l >= 0 {
456-
let ret = self.print(x.clone(), l);
457-
match x {
458-
Token::Break(b) => self.left_total += b.blank_space,
459-
Token::String(_, len) => {
460-
assert_eq!(len, l); self.left_total += len;
461-
}
462-
_ => ()
463-
}
464-
if self.left != self.right {
465-
self.left += 1u;
466-
self.left %= self.buf_len;
467-
let left = self.token[self.left].clone();
468-
let left_size = self.size[self.left];
469-
try!(self.advance_left(left, left_size));
450+
self.left, self.size[self.left]);
451+
452+
let mut left_size = self.size[self.left];
453+
454+
while left_size >= 0 {
455+
let left = self.token[self.left].clone();
456+
457+
let len = match left {
458+
Token::Break(b) => b.blank_space,
459+
Token::String(_, len) => {
460+
assert_eq!(len, left_size);
461+
len
462+
}
463+
_ => 0
464+
};
465+
466+
try!(self.print(left, left_size));
467+
468+
self.left_total += len;
469+
470+
if self.left == self.right {
471+
break;
470472
}
471-
ret
472-
} else {
473-
Ok(())
473+
474+
self.left += 1u;
475+
self.left %= self.buf_len;
476+
477+
left_size = self.size[self.left];
474478
}
479+
480+
Ok(())
475481
}
476482
pub fn check_stack(&mut self, k: int) {
477483
if !self.scan_stack_empty {

0 commit comments

Comments
 (0)