Skip to content

Commit 1bc75be

Browse files
committed
---
yaml --- r: 149691 b: refs/heads/try2 c: b5ad302 h: refs/heads/master i: 149689: a562f02 149687: 497adff v: v3
1 parent 9371276 commit 1bc75be

File tree

16 files changed

+111
-96
lines changed

16 files changed

+111
-96
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 997ff7abd4f3b803575a7bfa4af3fb05569b1f75
8+
refs/heads/try2: b5ad3022da9d4cea11ce3ddbce953edcc6e0eae9
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/etc/vim/syntax/rust.vim

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,12 @@ syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[
163163
syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*"
164164
syn match rustCharacter /'\([^'\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'/ contains=rustSpecial,rustSpecialError
165165

166-
syn cluster rustComment contains=rustCommentLine,rustCommentLineDoc,rustCommentBlock,rustCommentBlockDoc
167-
syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell
168-
syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell
169-
syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,@rustComment,@Spell keepend extend
170-
syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,@rustComment,@Spell keepend extend
166+
syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell
167+
syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell
168+
syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell
169+
syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell
170+
syn region rustCommentBlockNest matchgroup=rustCommentBlock start="/\*" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent
171+
syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent
171172
" FIXME: this is a really ugly and not fully correct implementation. Most
172173
" importantly, a case like ``/* */*`` should have the final ``*`` not being in
173174
" a comment, but in practice at present it leaves comments open two levels

branches/try2/src/librustc/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,7 @@ pub fn run_compiler(args: &[~str]) {
297297
match input {
298298
d::FileInput(ref ifile) => {
299299
let mut stdout = io::stdout();
300-
d::list_metadata(sess, &(*ifile),
301-
&mut stdout as &mut io::Writer).unwrap();
300+
d::list_metadata(sess, &(*ifile), &mut stdout).unwrap();
302301
}
303302
d::StrInput(_) => {
304303
d::early_error("can not list metadata for stdin");

branches/try2/src/librustc/middle/trans/_match.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,7 +1188,7 @@ impl<'a> DynamicFailureHandler<'a> {
11881188

11891189
let fcx = self.bcx.fcx;
11901190
let fail_cx = fcx.new_block(false, "case_fallthrough", None);
1191-
controlflow::trans_fail(fail_cx, Some(self.sp), self.msg.clone());
1191+
controlflow::trans_fail(fail_cx, self.sp, self.msg.clone());
11921192
self.finished.set(Some(fail_cx.llbb));
11931193
fail_cx.llbb
11941194
}

branches/try2/src/librustc/middle/trans/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ pub fn fail_if_zero<'a>(
864864
}
865865
};
866866
with_cond(cx, is_zero, |bcx| {
867-
controlflow::trans_fail(bcx, Some(span), InternedString::new(text))
867+
controlflow::trans_fail(bcx, span, InternedString::new(text))
868868
})
869869
}
870870

branches/try2/src/librustc/middle/trans/controlflow.rs

Lines changed: 7 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ use middle::trans::debuginfo;
1818
use middle::trans::cleanup;
1919
use middle::trans::cleanup::CleanupMethods;
2020
use middle::trans::expr;
21-
use middle::ty;
22-
use util::ppaux;
2321
use util::ppaux::Repr;
2422

2523
use middle::trans::type_::Type;
@@ -327,67 +325,23 @@ pub fn trans_ret<'a>(bcx: &'a Block<'a>,
327325
return bcx;
328326
}
329327

330-
pub fn trans_fail_expr<'a>(
331-
bcx: &'a Block<'a>,
332-
sp_opt: Option<Span>,
333-
fail_expr: Option<@ast::Expr>)
334-
-> &'a Block<'a> {
335-
let _icx = push_ctxt("trans_fail_expr");
336-
let mut bcx = bcx;
337-
match fail_expr {
338-
Some(arg_expr) => {
339-
let ccx = bcx.ccx();
340-
let tcx = ccx.tcx;
341-
let arg_datum =
342-
unpack_datum!(bcx, expr::trans_to_lvalue(bcx, arg_expr, "fail"));
343-
344-
if ty::type_is_str(arg_datum.ty) {
345-
let (lldata, _) = arg_datum.get_vec_base_and_len(bcx);
346-
return trans_fail_value(bcx, sp_opt, lldata);
347-
} else if bcx.unreachable.get() || ty::type_is_bot(arg_datum.ty) {
348-
return bcx;
349-
} else {
350-
bcx.sess().span_bug(
351-
arg_expr.span, ~"fail called with unsupported type " +
352-
ppaux::ty_to_str(tcx, arg_datum.ty));
353-
}
354-
}
355-
_ => trans_fail(bcx, sp_opt, InternedString::new("explicit failure"))
356-
}
357-
}
358-
359328
pub fn trans_fail<'a>(
360329
bcx: &'a Block<'a>,
361-
sp_opt: Option<Span>,
330+
sp: Span,
362331
fail_str: InternedString)
363332
-> &'a Block<'a> {
364-
let _icx = push_ctxt("trans_fail");
365333
let V_fail_str = C_cstr(bcx.ccx(), fail_str);
366-
return trans_fail_value(bcx, sp_opt, V_fail_str);
367-
}
368-
369-
fn trans_fail_value<'a>(
370-
bcx: &'a Block<'a>,
371-
sp_opt: Option<Span>,
372-
V_fail_str: ValueRef)
373-
-> &'a Block<'a> {
374334
let _icx = push_ctxt("trans_fail_value");
375335
let ccx = bcx.ccx();
376-
let (V_filename, V_line) = match sp_opt {
377-
Some(sp) => {
378-
let sess = bcx.sess();
379-
let loc = sess.parse_sess.cm.lookup_char_pos(sp.lo);
380-
(C_cstr(bcx.ccx(), token::intern_and_get_ident(loc.file.name)),
381-
loc.line as int)
382-
}
383-
None => {
384-
(C_cstr(bcx.ccx(), InternedString::new("<runtime>")), 0)
385-
}
386-
};
336+
let sess = bcx.sess();
337+
let loc = sess.parse_sess.cm.lookup_char_pos(sp.lo);
338+
let V_filename = C_cstr(bcx.ccx(),
339+
token::intern_and_get_ident(loc.file.name));
340+
let V_line = loc.line as int;
387341
let V_str = PointerCast(bcx, V_fail_str, Type::i8p());
388342
let V_filename = PointerCast(bcx, V_filename, Type::i8p());
389343
let args = ~[V_str, V_filename, C_int(ccx, V_line)];
390-
let did = langcall(bcx, sp_opt, "", FailFnLangItem);
344+
let did = langcall(bcx, Some(sp), "", FailFnLangItem);
391345
let bcx = callee::trans_lang_call(bcx, did, args, Some(expr::Ignore)).bcx;
392346
Unreachable(bcx);
393347
return bcx;

branches/try2/src/libstd/fmt/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -654,8 +654,8 @@ uniform_fn_call_workaround! {
654654
/// use std::fmt;
655655
/// use std::io;
656656
///
657-
/// let w = &mut io::stdout() as &mut io::Writer;
658-
/// format_args!(|args| { fmt::write(w, args); }, "Hello, {}!", "world");
657+
/// let mut w = io::stdout();
658+
/// format_args!(|args| { fmt::write(&mut w, args); }, "Hello, {}!", "world");
659659
/// ```
660660
pub fn write(output: &mut io::Writer, args: &Arguments) -> Result {
661661
unsafe { write_unsafe(output, args.fmt, args.args) }

branches/try2/src/libstd/io/buffered.rs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ use cmp;
1414
use container::Container;
1515
use io::{Reader, Writer, Stream, Buffer, DEFAULT_BUF_SIZE, IoResult};
1616
use iter::ExactSize;
17-
use option::{Some, None};
17+
use ops::Drop;
18+
use option::{Some, None, Option};
1819
use result::{Ok, Err};
1920
use vec::{OwnedVector, ImmutableVector, MutableVector};
2021
use vec;
@@ -115,7 +116,7 @@ impl<R: Reader> Reader for BufferedReader<R> {
115116

116117
/// Wraps a Writer and buffers output to it
117118
///
118-
/// Note that `BufferedWriter` will NOT flush its buffer when dropped.
119+
/// This writer will be flushed when it is dropped.
119120
///
120121
/// # Example
121122
///
@@ -130,7 +131,7 @@ impl<R: Reader> Reader for BufferedReader<R> {
130131
/// writer.flush();
131132
/// ```
132133
pub struct BufferedWriter<W> {
133-
priv inner: W,
134+
priv inner: Option<W>,
134135
priv buf: ~[u8],
135136
priv pos: uint
136137
}
@@ -142,7 +143,7 @@ impl<W: Writer> BufferedWriter<W> {
142143
let mut buf = vec::with_capacity(cap);
143144
unsafe { buf.set_len(cap); }
144145
BufferedWriter {
145-
inner: inner,
146+
inner: Some(inner),
146147
buf: buf,
147148
pos: 0
148149
}
@@ -155,7 +156,7 @@ impl<W: Writer> BufferedWriter<W> {
155156

156157
fn flush_buf(&mut self) -> IoResult<()> {
157158
if self.pos != 0 {
158-
let ret = self.inner.write(self.buf.slice_to(self.pos));
159+
let ret = self.inner.get_mut_ref().write(self.buf.slice_to(self.pos));
159160
self.pos = 0;
160161
ret
161162
} else {
@@ -167,15 +168,15 @@ impl<W: Writer> BufferedWriter<W> {
167168
///
168169
/// This type does not expose the ability to get a mutable reference to the
169170
/// underlying reader because that could possibly corrupt the buffer.
170-
pub fn get_ref<'a>(&'a self) -> &'a W { &self.inner }
171+
pub fn get_ref<'a>(&'a self) -> &'a W { self.inner.get_ref() }
171172

172173
/// Unwraps this buffer, returning the underlying writer.
173174
///
174175
/// The buffer is flushed before returning the writer.
175176
pub fn unwrap(mut self) -> W {
176-
// FIXME: is failing the right thing to do if flushing fails?
177+
// FIXME(#12628): is failing the right thing to do if flushing fails?
177178
self.flush_buf().unwrap();
178-
self.inner
179+
self.inner.take_unwrap()
179180
}
180181
}
181182

@@ -186,7 +187,7 @@ impl<W: Writer> Writer for BufferedWriter<W> {
186187
}
187188

188189
if buf.len() > self.buf.len() {
189-
self.inner.write(buf)
190+
self.inner.get_mut_ref().write(buf)
190191
} else {
191192
let dst = self.buf.mut_slice_from(self.pos);
192193
vec::bytes::copy_memory(dst, buf);
@@ -196,14 +197,24 @@ impl<W: Writer> Writer for BufferedWriter<W> {
196197
}
197198

198199
fn flush(&mut self) -> IoResult<()> {
199-
self.flush_buf().and_then(|()| self.inner.flush())
200+
self.flush_buf().and_then(|()| self.inner.get_mut_ref().flush())
201+
}
202+
}
203+
204+
#[unsafe_destructor]
205+
impl<W: Writer> Drop for BufferedWriter<W> {
206+
fn drop(&mut self) {
207+
if self.inner.is_some() {
208+
// FIXME(#12628): should this error be ignored?
209+
let _ = self.flush_buf();
210+
}
200211
}
201212
}
202213

203214
/// Wraps a Writer and buffers output to it, flushing whenever a newline (`0x0a`,
204215
/// `'\n'`) is detected.
205216
///
206-
/// Note that this structure does NOT flush the output when dropped.
217+
/// This writer will be flushed when it is dropped.
207218
pub struct LineBufferedWriter<W> {
208219
priv inner: BufferedWriter<W>,
209220
}
@@ -256,13 +267,13 @@ impl<W> InternalBufferedWriter<W> {
256267

257268
impl<W: Reader> Reader for InternalBufferedWriter<W> {
258269
fn read(&mut self, buf: &mut [u8]) -> IoResult<uint> {
259-
self.get_mut_ref().inner.read(buf)
270+
self.get_mut_ref().inner.get_mut_ref().read(buf)
260271
}
261272
}
262273

263-
/// Wraps a Stream and buffers input and output to and from it
274+
/// Wraps a Stream and buffers input and output to and from it.
264275
///
265-
/// Note that `BufferedStream` will NOT flush its output buffer when dropped.
276+
/// The output half will be flushed when this stream is dropped.
266277
///
267278
/// # Example
268279
///

branches/try2/src/libstd/io/stdio.rs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ fn src<T>(fd: libc::c_int, readable: bool, f: |StdSource| -> T) -> T {
9090
/// buffered access is not desired, the `stdin_raw` function is provided to
9191
/// provided unbuffered access to stdin.
9292
///
93+
/// Care should be taken when creating multiple handles to the stdin of a
94+
/// process. Beause this is a buffered reader by default, it's possible for
95+
/// pending input to be unconsumed in one reader and unavailable to other
96+
/// readers. It is recommended that only one handle at a time is created for the
97+
/// stdin of a process.
98+
///
9399
/// See `stdout()` for more notes about this function.
94100
pub fn stdin() -> BufferedReader<StdReader> {
95101
BufferedReader::new(stdin_raw())
@@ -104,20 +110,38 @@ pub fn stdin_raw() -> StdReader {
104110
src(libc::STDIN_FILENO, true, |src| StdReader { inner: src })
105111
}
106112

107-
/// Creates a new non-blocking handle to the stdout of the current process.
113+
/// Creates a line-buffered handle to the stdout of the current process.
108114
///
109115
/// Note that this is a fairly expensive operation in that at least one memory
110116
/// allocation is performed. Additionally, this must be called from a runtime
111117
/// task context because the stream returned will be a non-blocking object using
112118
/// the local scheduler to perform the I/O.
113-
pub fn stdout() -> StdWriter {
119+
///
120+
/// Care should be taken when creating multiple handles to an output stream for
121+
/// a single process. While usage is still safe, the output may be surprising if
122+
/// no synchronization is performed to ensure a sane output.
123+
pub fn stdout() -> LineBufferedWriter<StdWriter> {
124+
LineBufferedWriter::new(stdout_raw())
125+
}
126+
127+
/// Creates an unbuffered handle to the stdout of the current process
128+
///
129+
/// See notes in `stdout()` for more information.
130+
pub fn stdout_raw() -> StdWriter {
114131
src(libc::STDOUT_FILENO, false, |src| StdWriter { inner: src })
115132
}
116133

117-
/// Creates a new non-blocking handle to the stderr of the current process.
134+
/// Creates a line-buffered handle to the stderr of the current process.
118135
///
119136
/// See `stdout()` for notes about this function.
120-
pub fn stderr() -> StdWriter {
137+
pub fn stderr() -> LineBufferedWriter<StdWriter> {
138+
LineBufferedWriter::new(stderr_raw())
139+
}
140+
141+
/// Creates an unbuffered handle to the stderr of the current process
142+
///
143+
/// See notes in `stdout()` for more information.
144+
pub fn stderr_raw() -> StdWriter {
121145
src(libc::STDERR_FILENO, false, |src| StdWriter { inner: src })
122146
}
123147

@@ -182,7 +206,7 @@ fn with_task_stdout(f: |&mut Writer| -> IoResult<()> ) {
182206
Local::put(task);
183207

184208
if my_stdout.is_none() {
185-
my_stdout = Some(~LineBufferedWriter::new(stdout()) as ~Writer);
209+
my_stdout = Some(~stdout() as ~Writer);
186210
}
187211
let ret = f(*my_stdout.get_mut_ref());
188212

branches/try2/src/libstd/logging.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,7 @@ pub fn log(level: u32, args: &fmt::Arguments) {
166166
};
167167

168168
if logger.is_none() {
169-
logger = Some(~DefaultLogger {
170-
handle: LineBufferedWriter::new(io::stderr()),
171-
} as ~Logger);
169+
logger = Some(~DefaultLogger { handle: io::stderr(), } as ~Logger);
172170
}
173171
logger.get_mut_ref().log(level, args);
174172

branches/try2/src/libsyntax/diagnostic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,8 @@ enum Destination {
227227
impl EmitterWriter {
228228
pub fn stderr() -> EmitterWriter {
229229
let stderr = io::stderr();
230-
if stderr.isatty() {
231-
let dst = match term::Terminal::new(stderr) {
230+
if stderr.get_ref().isatty() {
231+
let dst = match term::Terminal::new(stderr.unwrap()) {
232232
Ok(t) => Terminal(t),
233233
Err(..) => Raw(~io::stderr()),
234234
};

branches/try2/src/libtest/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,8 @@ impl<T: Writer> ConsoleTestState<T> {
415415
Some(ref path) => Some(try!(File::create(path))),
416416
None => None
417417
};
418-
let out = match term::Terminal::new(io::stdout()) {
419-
Err(_) => Raw(io::stdout()),
418+
let out = match term::Terminal::new(io::stdio::stdout_raw()) {
419+
Err(_) => Raw(io::stdio::stdout_raw()),
420420
Ok(t) => Pretty(t)
421421
};
422422
Ok(ConsoleTestState {

branches/try2/src/test/bench/shootout-fasta-redux.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
use std::cmp::min;
12-
use std::io::{stdout, BufferedWriter, IoResult};
12+
use std::io::{stdout, IoResult};
1313
use std::os;
1414
use std::vec::bytes::copy_memory;
1515
use std::vec;
@@ -183,7 +183,7 @@ fn main() {
183183
5
184184
};
185185

186-
let mut out = BufferedWriter::new(stdout());
186+
let mut out = stdout();
187187

188188
out.write_line(">ONE Homo sapiens alu").unwrap();
189189
{

branches/try2/src/test/bench/shootout-fasta.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,6 @@ fn main() {
117117
let mut file = BufferedWriter::new(File::create(&Path::new("./shootout-fasta.data")));
118118
run(&mut file);
119119
} else {
120-
run(&mut BufferedWriter::new(io::stdout()));
120+
run(&mut io::stdout());
121121
}
122122
}

0 commit comments

Comments
 (0)