Skip to content

Commit 67a5444

Browse files
committed
Merge Printer::token and Printer::size.
Logically, it's a vector of pairs, so might as well represent it that way. The commit also changes `scan_stack` so that it is initialized with the default size, instead of the excessive `55 * linewidth` size, which it usually doesn't get even close to reaching.
1 parent a5dac7a commit 67a5444

File tree

1 file changed

+31
-38
lines changed

1 file changed

+31
-38
lines changed

src/libsyntax/print/pp.rs

+31-38
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,8 @@ impl fmt::Display for Token {
125125
}
126126
}
127127

128-
fn buf_str(toks: &[Token], szs: &[isize], left: usize, right: usize, lim: usize) -> String {
129-
let n = toks.len();
130-
assert_eq!(n, szs.len());
128+
fn buf_str(buf: &[BufEntry], left: usize, right: usize, lim: usize) -> String {
129+
let n = buf.len();
131130
let mut i = left;
132131
let mut l = lim;
133132
let mut s = String::from("[");
@@ -136,7 +135,7 @@ fn buf_str(toks: &[Token], szs: &[isize], left: usize, right: usize, lim: usize)
136135
if i != left {
137136
s.push_str(", ");
138137
}
139-
s.push_str(&format!("{}={}", szs[i], &toks[i]));
138+
s.push_str(&format!("{}={}", buf[i].size, &buf[i].token));
140139
i += 1;
141140
i %= n;
142141
}
@@ -159,25 +158,20 @@ pub struct PrintStackElem {
159158
const SIZE_INFINITY: isize = 0xffff;
160159

161160
pub fn mk_printer<'a>(out: Box<io::Write+'a>, linewidth: usize) -> Printer<'a> {
162-
// Yes 55, it makes the ring buffers big enough to never
163-
// fall behind.
161+
// Yes 55, it makes the ring buffers big enough to never fall behind.
164162
let n: usize = 55 * linewidth;
165163
debug!("mk_printer {}", linewidth);
166-
let token = vec![Token::Eof; n];
167-
let size = vec![0; n];
168-
let scan_stack = VecDeque::with_capacity(n);
169164
Printer {
170165
out: out,
171166
buf_len: n,
172167
margin: linewidth as isize,
173168
space: linewidth as isize,
174169
left: 0,
175170
right: 0,
176-
token: token,
177-
size: size,
171+
buf: vec![BufEntry { token: Token::Eof, size: 0 }; n],
178172
left_total: 0,
179173
right_total: 0,
180-
scan_stack: scan_stack,
174+
scan_stack: VecDeque::new(),
181175
print_stack: Vec::new(),
182176
pending_indentation: 0
183177
}
@@ -269,10 +263,8 @@ pub struct Printer<'a> {
269263
left: usize,
270264
/// Index of right side of input stream
271265
right: usize,
272-
/// Ring-buffer stream goes through
273-
token: Vec<Token> ,
274-
/// Ring-buffer of calculated sizes
275-
size: Vec<isize> ,
266+
/// Ring-buffer of tokens and calculated sizes
267+
buf: Vec<BufEntry>,
276268
/// Running size of stream "...left"
277269
left_total: isize,
278270
/// Running size of stream "...right"
@@ -283,20 +275,26 @@ pub struct Printer<'a> {
283275
/// Begin (if there is any) on top of it. Stuff is flushed off the
284276
/// bottom as it becomes irrelevant due to the primary ring-buffer
285277
/// advancing.
286-
scan_stack: VecDeque<usize> ,
278+
scan_stack: VecDeque<usize>,
287279
/// Stack of blocks-in-progress being flushed by print
288280
print_stack: Vec<PrintStackElem> ,
289281
/// Buffered indentation to avoid writing trailing whitespace
290282
pending_indentation: isize,
291283
}
292284

285+
#[derive(Clone)]
286+
struct BufEntry {
287+
token: Token,
288+
size: isize,
289+
}
290+
293291
impl<'a> Printer<'a> {
294292
pub fn last_token(&mut self) -> Token {
295-
self.token[self.right].clone()
293+
self.buf[self.right].token.clone()
296294
}
297295
// be very careful with this!
298296
pub fn replace_last_token(&mut self, t: Token) {
299-
self.token[self.right] = t;
297+
self.buf[self.right].token = t;
300298
}
301299
pub fn pretty_print(&mut self, token: Token) -> io::Result<()> {
302300
debug!("pp Vec<{},{}>", self.left, self.right);
@@ -318,8 +316,7 @@ impl<'a> Printer<'a> {
318316
} else { self.advance_right(); }
319317
debug!("pp Begin({})/buffer Vec<{},{}>",
320318
b.offset, self.left, self.right);
321-
self.token[self.right] = token;
322-
self.size[self.right] = -self.right_total;
319+
self.buf[self.right] = BufEntry { token: token, size: -self.right_total };
323320
let right = self.right;
324321
self.scan_push(right);
325322
Ok(())
@@ -331,8 +328,7 @@ impl<'a> Printer<'a> {
331328
} else {
332329
debug!("pp End/buffer Vec<{},{}>", self.left, self.right);
333330
self.advance_right();
334-
self.token[self.right] = token;
335-
self.size[self.right] = -1;
331+
self.buf[self.right] = BufEntry { token: token, size: -1 };
336332
let right = self.right;
337333
self.scan_push(right);
338334
Ok(())
@@ -350,8 +346,7 @@ impl<'a> Printer<'a> {
350346
self.check_stack(0);
351347
let right = self.right;
352348
self.scan_push(right);
353-
self.token[self.right] = token;
354-
self.size[self.right] = -self.right_total;
349+
self.buf[self.right] = BufEntry { token: token, size: -self.right_total };
355350
self.right_total += b.blank_space;
356351
Ok(())
357352
}
@@ -364,8 +359,7 @@ impl<'a> Printer<'a> {
364359
debug!("pp String('{}')/buffer Vec<{},{}>",
365360
s, self.left, self.right);
366361
self.advance_right();
367-
self.token[self.right] = Token::String(s, len);
368-
self.size[self.right] = len;
362+
self.buf[self.right] = BufEntry { token: Token::String(s, len), size: len };
369363
self.right_total += len;
370364
self.check_stream()
371365
}
@@ -381,7 +375,7 @@ impl<'a> Printer<'a> {
381375
if Some(&self.left) == self.scan_stack.back() {
382376
debug!("setting {} to infinity and popping", self.left);
383377
let scanned = self.scan_pop_bottom();
384-
self.size[scanned] = SIZE_INFINITY;
378+
self.buf[scanned].size = SIZE_INFINITY;
385379
}
386380
self.advance_left()?;
387381
if self.left != self.right {
@@ -410,12 +404,12 @@ impl<'a> Printer<'a> {
410404
}
411405
pub fn advance_left(&mut self) -> io::Result<()> {
412406
debug!("advance_left Vec<{},{}>, sizeof({})={}", self.left, self.right,
413-
self.left, self.size[self.left]);
407+
self.left, self.buf[self.left].size);
414408

415-
let mut left_size = self.size[self.left];
409+
let mut left_size = self.buf[self.left].size;
416410

417411
while left_size >= 0 {
418-
let left = self.token[self.left].clone();
412+
let left = self.buf[self.left].token.clone();
419413

420414
let len = match left {
421415
Token::Break(b) => b.blank_space,
@@ -437,31 +431,31 @@ impl<'a> Printer<'a> {
437431
self.left += 1;
438432
self.left %= self.buf_len;
439433

440-
left_size = self.size[self.left];
434+
left_size = self.buf[self.left].size;
441435
}
442436

443437
Ok(())
444438
}
445439
pub fn check_stack(&mut self, k: isize) {
446440
if !self.scan_stack.is_empty() {
447441
let x = self.scan_top();
448-
match self.token[x] {
442+
match self.buf[x].token {
449443
Token::Begin(_) => {
450444
if k > 0 {
451445
let popped = self.scan_pop();
452-
self.size[popped] = self.size[x] + self.right_total;
446+
self.buf[popped].size = self.buf[x].size + self.right_total;
453447
self.check_stack(k - 1);
454448
}
455449
}
456450
Token::End => {
457451
// paper says + not =, but that makes no sense.
458452
let popped = self.scan_pop();
459-
self.size[popped] = 1;
453+
self.buf[popped].size = 1;
460454
self.check_stack(k + 1);
461455
}
462456
_ => {
463457
let popped = self.scan_pop();
464-
self.size[popped] = self.size[x] + self.right_total;
458+
self.buf[popped].size = self.buf[x].size + self.right_total;
465459
if k > 0 {
466460
self.check_stack(k);
467461
}
@@ -499,8 +493,7 @@ impl<'a> Printer<'a> {
499493
pub fn print(&mut self, token: Token, l: isize) -> io::Result<()> {
500494
debug!("print {} {} (remaining line space={})", token, l,
501495
self.space);
502-
debug!("{}", buf_str(&self.token,
503-
&self.size,
496+
debug!("{}", buf_str(&self.buf,
504497
self.left,
505498
self.right,
506499
6));

0 commit comments

Comments
 (0)