Skip to content

Commit bbf497f

Browse files
committed
---
yaml --- r: 56205 b: refs/heads/auto c: d32d4d1 h: refs/heads/master i: 56203: 1ec531e v: v3
1 parent 1b69605 commit bbf497f

File tree

4 files changed

+69
-149
lines changed

4 files changed

+69
-149
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0
1414
refs/tags/release-0.3.1: 495bae036dfe5ec6ceafd3312b4dca48741e845b
1515
refs/tags/release-0.4: e828ea2080499553b97dfe33b3f4d472b4562ad7
1616
refs/tags/release-0.5: 7e3bcfbf21278251ee936ad53e92e9b719702d73
17-
refs/heads/auto: 6030e3982a52c8d9ede225f992088bb75fba4ef1
17+
refs/heads/auto: d32d4d12096dc39ff428f606e2242eaae0c6a0de
1818
refs/heads/servo: af82457af293e2a842ba6b7759b70288da276167
1919
refs/tags/release-0.6: b4ebcfa1812664df5e142f0134a5faea3918544c

branches/auto/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,4 @@ config.stamp
8686
.DS_Store
8787
src/etc/dl
8888
.settings/
89+
build/

branches/auto/src/libcore/vec.rs

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Less, Equal, Greater};
1818
use clone::Clone;
1919
use iter::BaseIter;
2020
use iter;
21+
#[cfg(stage1)]
22+
#[cfg(stage2)]
23+
#[cfg(stage3)]
24+
use iterator::Iterator;
2125
use kinds::Copy;
2226
use libc;
2327
use option::{None, Option, Some};
@@ -1919,6 +1923,7 @@ impl<'self,T> ImmutableVector<T> for &'self [T] {
19191923
#[cfg(stage3)]
19201924
pub trait ImmutableVector<'self, T> {
19211925
fn slice(&self, start: uint, end: uint) -> &'self [T];
1926+
fn iter(self) -> VecIterator<'self, T>;
19221927
fn head(&self) -> &'self T;
19231928
fn head_opt(&self) -> Option<&'self T>;
19241929
fn tail(&self) -> &'self [T];
@@ -1949,6 +1954,15 @@ impl<'self,T> ImmutableVector<'self, T> for &'self [T] {
19491954
slice(*self, start, end)
19501955
}
19511956

1957+
#[inline]
1958+
fn iter(self) -> VecIterator<'self, T> {
1959+
unsafe {
1960+
let p = vec::raw::to_ptr(self);
1961+
VecIterator{ptr: p, end: p.offset(self.len()),
1962+
lifetime: cast::transmute(p)}
1963+
}
1964+
}
1965+
19521966
/// Returns the first element of a vector, failing if the vector is empty.
19531967
#[inline]
19541968
fn head(&self) -> &'self T { head(*self) }
@@ -2795,7 +2809,33 @@ impl<A:Clone> Clone for ~[A] {
27952809
}
27962810
}
27972811

2798-
// ___________________________________________________________________________
2812+
// could be implemented with &[T] with .slice(), but this avoids bounds checks
2813+
#[cfg(stage1)]
2814+
#[cfg(stage2)]
2815+
#[cfg(stage3)]
2816+
pub struct VecIterator<'self, T> {
2817+
priv ptr: *T,
2818+
priv end: *T,
2819+
priv lifetime: &'self T // FIXME: #5922
2820+
}
2821+
2822+
#[cfg(stage1)]
2823+
#[cfg(stage2)]
2824+
#[cfg(stage3)]
2825+
impl<'self, T> Iterator<&'self T> for VecIterator<'self, T> {
2826+
#[inline]
2827+
fn next(&mut self) -> Option<&'self T> {
2828+
unsafe {
2829+
if self.ptr == self.end {
2830+
None
2831+
} else {
2832+
let old = self.ptr;
2833+
self.ptr = self.ptr.offset(1);
2834+
Some(cast::transmute(old))
2835+
}
2836+
}
2837+
}
2838+
}
27992839

28002840
#[cfg(test)]
28012841
mod tests {
@@ -4421,6 +4461,19 @@ mod tests {
44214461
[1, 2, 3, 4, 5, 5, 5, 5].cmp(& &[1, 2, 3, 4, 5, 6]) == Less;
44224462
[2, 2].cmp(& &[1, 2, 3, 4]) == Greater;
44234463
}
4464+
4465+
#[test]
4466+
fn test_iterator() {
4467+
use iterator::*;
4468+
let xs = [1, 2, 5, 10, 11];
4469+
let ys = [1, 2, 5, 10, 11, 19];
4470+
let mut it = xs.iter();
4471+
let mut i = 0;
4472+
for it.advance |&x| {
4473+
assert_eq!(x, ys[i]);
4474+
i += 1;
4475+
}
4476+
}
44244477
}
44254478

44264479
// Local Variables:

branches/auto/src/libsyntax/diagnostic.rs

Lines changed: 13 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ pub trait handler {
3333
fn bump_err_count(@mut self);
3434
fn has_errors(@mut self) -> bool;
3535
fn abort_if_errors(@mut self);
36-
fn abort_error_print(@mut self);
3736
fn warn(@mut self, msg: &str);
3837
fn note(@mut self, msg: &str);
3938
// used to indicate a bug in the compiler:
@@ -43,7 +42,6 @@ pub trait handler {
4342
cmsp: Option<(@codemap::CodeMap, span)>,
4443
msg: &str,
4544
lvl: level);
46-
fn emit_print(@mut self, lvl: level);
4745
}
4846

4947
// a span-handler is like a handler but also
@@ -59,15 +57,8 @@ pub trait span_handler {
5957
fn handler(@mut self) -> @handler;
6058
}
6159

62-
struct emitter_arg {
63-
cmsp: Option<(@codemap::CodeMap, span)>,
64-
msg: ~str,
65-
lvl: level,
66-
}
67-
6860
struct HandlerT {
6961
err_count: uint,
70-
emitters: ~[emitter_arg],
7162
emit: Emitter,
7263
}
7364

@@ -78,19 +69,15 @@ struct CodemapT {
7869

7970
impl span_handler for CodemapT {
8071
fn span_fatal(@mut self, sp: span, msg: &str) -> ! {
81-
self.handler.bump_err_count();
8272
self.handler.emit(Some((self.cm, sp)), msg, fatal);
83-
self.handler.emit_print(error);
84-
self.handler.emit_print(note);
85-
self.handler.abort_error_print();
8673
fail!();
8774
}
8875
fn span_err(@mut self, sp: span, msg: &str) {
8976
self.handler.emit(Some((self.cm, sp)), msg, error);
9077
self.handler.bump_err_count();
9178
}
9279
fn span_warn(@mut self, sp: span, msg: &str) {
93-
emit_one(Some((self.cm, sp)), msg, warning);
80+
self.handler.emit(Some((self.cm, sp)), msg, warning);
9481
}
9582
fn span_note(@mut self, sp: span, msg: &str) {
9683
self.handler.emit(Some((self.cm, sp)), msg, note);
@@ -108,13 +95,11 @@ impl span_handler for CodemapT {
10895
10996
impl handler for HandlerT {
11097
fn fatal(@mut self, msg: &str) -> ! {
111-
self.emit_print(error);
112-
self.emit_print(note);
113-
emit_one(None, msg, fatal);
98+
(self.emit)(None, msg, fatal);
11499
fail!();
115100
}
116101
fn err(@mut self, msg: &str) {
117-
emit_one(None, msg, error);
102+
(self.emit)(None, msg, error);
118103
self.bump_err_count();
119104
}
120105
fn bump_err_count(@mut self) {
@@ -133,26 +118,13 @@ impl handler for HandlerT {
133118
}
134119
self.fatal(s);
135120
}
136-
fn abort_error_print(@mut self) {
137-
let s;
138-
match self.err_count {
139-
0u => return,
140-
1u => s = ~"aborting due to previous error",
141-
_ => {
142-
s = fmt!("aborting due to %u previous errors",
143-
self.err_count);
144-
}
145-
}
146-
emit_one(None, s, fatal);
147-
}
148121
fn warn(@mut self, msg: &str) {
149-
emit_one(None, msg, warning);
122+
(self.emit)(None, msg, warning);
150123
}
151124
fn note(@mut self, msg: &str) {
152-
self.emit(None, msg, note);
125+
(self.emit)(None, msg, note);
153126
}
154127
fn bug(@mut self, msg: &str) -> ! {
155-
self.bump_err_count();
156128
self.fatal(ice_msg(msg));
157129
}
158130
fn unimpl(@mut self, msg: &str) -> ! {
@@ -163,50 +135,6 @@ impl handler for HandlerT {
163135
msg: &str,
164136
lvl: level) {
165137
(self.emit)(cmsp, msg, lvl);
166-
let emitter = emitter_arg { cmsp: cmsp,
167-
msg: str::from_slice(msg),
168-
lvl: lvl };
169-
self.emitters.push(emitter);
170-
}
171-
172-
fn emit_print(@mut self, lvl: level) {
173-
let mut old_cmsp = None;
174-
let mut old_line = 0u;
175-
176-
let emitters = self.emitters;
177-
let length = emitters.len();
178-
for uint::range(0, length) |i| {
179-
let emitter = copy self.emitters[i];
180-
let cmsp = emitter.cmsp;
181-
let msg = emitter.msg;
182-
if diagnosticstr(lvl) == diagnosticstr(emitter.lvl) {
183-
match cmsp {
184-
Some((cm, sp)) => {
185-
let lo = cm.lookup_char_pos_adj(sp.lo);
186-
let sp = cm.adjust_span(sp);
187-
let ss = cm.span_to_str(sp);
188-
if i == 0 || old_line == lo.line {
189-
if old_line == lo.line {
190-
highlight_lines_cmp(cmsp, old_cmsp);
191-
}
192-
print_diagnostic(ss, lvl, msg);
193-
highlight_lines_cmp(old_cmsp, cmsp);
194-
} else {
195-
highlight_lines(old_cmsp);
196-
print_macro_backtrace(old_cmsp);
197-
print_diagnostic(ss, lvl, msg);
198-
}
199-
old_line = lo.line;
200-
old_cmsp = emitter.cmsp;
201-
}
202-
None => {
203-
print_diagnostic(~"", lvl, msg);
204-
}
205-
}
206-
}
207-
}
208-
highlight_lines(old_cmsp);
209-
print_macro_backtrace(old_cmsp);
210138
}
211139
}
212140
@@ -228,9 +156,7 @@ pub fn mk_handler(emitter: Option<Emitter>) -> @handler {
228156
}
229157
};
230158

231-
@mut HandlerT { err_count: 0,
232-
emitters: ~[],
233-
emit: emit } as @handler
159+
@mut HandlerT { err_count: 0, emit: emit } as @handler
234160
}
235161

236162
#[deriving(Eq)]
@@ -282,27 +208,23 @@ pub fn collect(messages: @mut ~[~str])
282208
f
283209
}
284210

285-
pub fn emit(_cmsp: Option<(@codemap::CodeMap, span)>, _msg: &str, _lvl: level) {
286-
// Nothing to do
287-
}
288-
289-
pub fn emit_one(cmsp: Option<(@codemap::CodeMap, span)>,
290-
msg: &str, lvl: level) {
211+
pub fn emit(cmsp: Option<(@codemap::CodeMap, span)>, msg: &str, lvl: level) {
291212
match cmsp {
292213
Some((cm, sp)) => {
293214
let sp = cm.adjust_span(sp);
294215
let ss = cm.span_to_str(sp);
216+
let lines = cm.span_to_lines(sp);
295217
print_diagnostic(ss, lvl, msg);
296-
highlight_lines(cmsp);
297-
print_macro_backtrace(cmsp);
218+
highlight_lines(cm, sp, lines);
219+
print_macro_backtrace(cm, sp);
298220
}
299221
None => {
300222
print_diagnostic(~"", lvl, msg);
301223
}
302224
}
303225
}
304226

305-
fn highlight_lines_internal(cm: @codemap::CodeMap,
227+
fn highlight_lines(cm: @codemap::CodeMap,
306228
sp: span,
307229
lines: @codemap::FileLines) {
308230
let fm = lines.file;
@@ -369,70 +291,14 @@ fn highlight_lines_internal(cm: @codemap::CodeMap,
369291
}
370292
}
371293

372-
fn highlight_lines(cmsp: Option<(@codemap::CodeMap, span)>) {
373-
match cmsp {
374-
Some((cm, sp)) => {
375-
let sp = cm.adjust_span(sp);
376-
let lines = cm.span_to_lines(sp);
377-
highlight_lines_internal(cm, sp, lines);
378-
}
379-
None => ()
380-
}
381-
}
382-
383-
fn highlight_lines_cmp(old_cmsp: Option<(@codemap::CodeMap, span)>,
384-
cmsp: Option<(@codemap::CodeMap, span)> ){
385-
let mut old_line = ~[];
386-
let mut new_line = ~[];
387-
let mut old_lo = 0u;
388-
let mut new_lo = 0u;
389-
let mut flag = true;
390-
match old_cmsp {
391-
Some((cm, sp)) => {
392-
let lo = cm.lookup_char_pos(sp.lo);
393-
let sp = cm.adjust_span(sp);
394-
let lines = cm.span_to_lines(sp);
395-
old_line = lines.lines;
396-
old_lo = lo.col.to_uint();
397-
}
398-
None => { flag = false; }
399-
}
400-
401-
match cmsp {
402-
Some((cm, sp)) => {
403-
let lo = cm.lookup_char_pos(sp.lo);
404-
let sp = cm.adjust_span(sp);
405-
let lines = cm.span_to_lines(sp);
406-
new_line = lines.lines;
407-
new_lo = lo.col.to_uint();
408-
}
409-
None => { flag = false; }
410-
}
411-
412-
if flag {
413-
if old_line == new_line && old_lo > new_lo {
414-
highlight_lines(cmsp);
415-
}
416-
}
417-
}
418-
419-
fn print_macro_backtrace_internal(cm: @codemap::CodeMap, sp: span) {
294+
fn print_macro_backtrace(cm: @codemap::CodeMap, sp: span) {
420295
for sp.expn_info.each |ei| {
421296
let ss = ei.callee.span.map_default(@~"", |span| @cm.span_to_str(*span));
422297
print_diagnostic(*ss, note,
423298
fmt!("in expansion of %s!", ei.callee.name));
424299
let ss = cm.span_to_str(ei.call_site);
425300
print_diagnostic(ss, note, ~"expansion site");
426-
print_macro_backtrace_internal(cm, ei.call_site);
427-
}
428-
}
429-
430-
fn print_macro_backtrace(cmsp: Option<(@codemap::CodeMap, span)>) {
431-
match cmsp {
432-
Some((cm, sp)) => {
433-
print_macro_backtrace_internal(cm, sp);
434-
}
435-
None => ()
301+
print_macro_backtrace(cm, ei.call_site);
436302
}
437303
}
438304

0 commit comments

Comments
 (0)