aboutsummaryrefslogtreecommitdiff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <[email protected]>2011-03-25 13:50:10 +0100
committerGraydon Hoare <[email protected]>2011-03-25 07:59:13 -0700
commitd3b49f5aab6a9e9efc2ab1d6713cc0d2bde94f4e (patch)
treebae28f87291e36eeeb08cff07d06d1728521da54 /src/comp
parentDon't delete rust.texi on 'make clean' (diff)
downloadrust-d3b49f5aab6a9e9efc2ab1d6713cc0d2bde94f4e.tar.xz
rust-d3b49f5aab6a9e9efc2ab1d6713cc0d2bde94f4e.zip
fix pretty-printer
A change in 54587bdccb7b6771cfc704a30fc0ef2c65824a15 (the vec appending overhaul) had broken it. (Apparently modifying a vec while iterating over it can corrupt memory.)
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/pretty/pp.rs16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/comp/pretty/pp.rs b/src/comp/pretty/pp.rs
index 0c355001..69eb01bc 100644
--- a/src/comp/pretty/pp.rs
+++ b/src/comp/pretty/pp.rs
@@ -99,8 +99,10 @@ impure fn buffer_token(ps p, token tok) {
}
impure fn finish_block_scan(ps p, contexttype tp) {
+ auto buf = p.buffered;
+ auto front = _vec.shift[token](buf);
auto indent;
- alt (p.buffered.(0)){
+ alt (front){
case (open(box_hv,?ind)) {
indent = ind;
}
@@ -109,25 +111,27 @@ impure fn finish_block_scan(ps p, contexttype tp) {
}
}
p.scandepth = 0u;
+ p.buffered = vec();
push_context(p, tp, indent);
- _vec.shift[token](p.buffered);
- for (token t in p.buffered) { add_token(p, t); }
+ for (token t in buf) { add_token(p, t); }
}
impure fn finish_break_scan(ps p) {
+ auto buf = p.buffered;
+ auto front = _vec.shift[token](buf);
if (p.bufferedcol > p.width) {
line_break(p);
}
else {
auto width;
- alt (p.buffered.(0)) {case(brk(?w)) {width = w;}}
+ alt (front) {case(brk(?w)) {width = w;}}
auto i = 0u;
while (i < width) {p.out.write_str(" "); i+=1u;}
p.col += width;
}
p.scandepth = 0u;
- _vec.shift[token](p.buffered);
- for (token t in p.buffered) { add_token(p, t); }
+ p.buffered = vec();
+ for (token t in buf) { add_token(p, t); }
}
impure fn start_scan(ps p, token tok) {