Skip to content

Commit 8848053

Browse files
committed
---
yaml --- r: 151333 b: refs/heads/try2 c: 0605f05 h: refs/heads/master i: 151331: b470f9d v: v3
1 parent 1759cfd commit 8848053

File tree

23 files changed

+369
-176
lines changed

23 files changed

+369
-176
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: ea46a7406acc8d1599c81f9b288b262e175fe9e5
8+
refs/heads/try2: 0605f05e42dfe4476500b4341a5ba78398b02c0f
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/doc/guide-tasks.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,10 @@ closure in the new task.
8989
fn print_message() { println!("I am running in a different task!"); }
9090
spawn(print_message);
9191
92-
// Print something more profound in a different task using a lambda expression
93-
// This uses the proc() keyword to assign to spawn a function with no name
94-
// That function will call println!(...) as requested
92+
// Print something profound in a different task using a `proc` expression
93+
// The `proc` expression evaluates to an (unnamed) owned closure.
94+
// That closure will call `println!(...)` when the spawned task runs.
95+
9596
spawn(proc() println!("I am also running in a different task!") );
9697
~~~~
9798

branches/try2/src/doc/intro.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ fn main() {
370370
```
371371

372372
This example is starting to get more subtle,
373-
but it hints at the powerful compositionality of Rust's concurrent types.
373+
but it hints at the powerful composability of Rust's concurrent types.
374374
This time we've put our array of numbers inside a `Mutex` and then put *that* inside the `Arc`.
375375
Like immutable data,
376376
`Mutex`es are sharable,

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ endif
3030

3131
" Come here when loading the script the first time.
3232

33-
function s:get_line_trimmed(lnum)
33+
function! s:get_line_trimmed(lnum)
3434
" Get the line and remove a trailing comment.
3535
" Use syntax highlighting attributes when possible.
3636
" NOTE: this is not accurate; /* */ or a line continuation could trick it
@@ -61,6 +61,20 @@ function s:get_line_trimmed(lnum)
6161
endif
6262
endfunction
6363

64+
function! s:is_string_comment(lnum, col)
65+
if has('syntax_items')
66+
for id in synstack(a:lnum, a:col)
67+
let synname = synIDattr(id, "name")
68+
if synname == "rustString" || synname =~ "^rustComment"
69+
return 1
70+
endif
71+
endfor
72+
else
73+
" without syntax, let's not even try
74+
return 0
75+
endif
76+
endfunction
77+
6478
function GetRustIndent(lnum)
6579

6680
" Starting assumption: cindent (called at the end) will do it right
@@ -152,8 +166,10 @@ function GetRustIndent(lnum)
152166
" column zero)
153167

154168
call cursor(a:lnum, 1)
155-
if searchpair('{\|(', '', '}\|)', 'nbW') == 0
156-
if searchpair('\[', '', '\]', 'nbW') == 0
169+
if searchpair('{\|(', '', '}\|)', 'nbW'
170+
\ 's:is_string_comment(line("."), col("."))') == 0
171+
if searchpair('\[', '', '\]', 'nbW',
172+
\ 's:is_string_comment(line("."), col("."))') == 0
157173
" Global scope, should be zero
158174
return 0
159175
else

branches/try2/src/libarena/lib.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
extern crate collections;
2828

29-
use std::cast::{transmute, transmute_mut, transmute_mut_lifetime};
29+
use std::cast::{transmute, transmute_mut_lifetime};
3030
use std::cast;
3131
use std::cell::{Cell, RefCell};
3232
use std::mem;
@@ -281,8 +281,8 @@ impl Arena {
281281
#[inline]
282282
pub fn alloc<'a, T>(&'a self, op: || -> T) -> &'a T {
283283
unsafe {
284-
// FIXME: Borrow check
285-
let this = transmute_mut(self);
284+
// FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
285+
let this: &mut Arena = transmute::<&_, &mut _>(self);
286286
if intrinsics::needs_drop::<T>() {
287287
this.alloc_noncopy(op)
288288
} else {
@@ -438,7 +438,8 @@ impl<T> TypedArena<T> {
438438
#[inline]
439439
pub fn alloc<'a>(&'a self, object: T) -> &'a T {
440440
unsafe {
441-
let this = cast::transmute_mut(self);
441+
// FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
442+
let this: &mut TypedArena<T> = cast::transmute::<&_, &mut _>(self);
442443
if this.ptr == this.end {
443444
this.grow()
444445
}

branches/try2/src/liblog/directive.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11+
use std::ascii::StrAsciiExt;
1112
use std::cmp;
1213

1314
#[deriving(Show, Clone)]
@@ -16,13 +17,13 @@ pub struct LogDirective {
1617
pub level: u32,
1718
}
1819

19-
static LOG_LEVEL_NAMES: [&'static str, ..4] = ["error", "warn", "info",
20-
"debug"];
20+
pub static LOG_LEVEL_NAMES: [&'static str, ..4] = ["ERROR", "WARN", "INFO",
21+
"DEBUG"];
2122

2223
/// Parse an individual log level that is either a number or a symbolic log level
2324
fn parse_log_level(level: &str) -> Option<u32> {
2425
from_str::<u32>(level).or_else(|| {
25-
let pos = LOG_LEVEL_NAMES.iter().position(|&name| name == level);
26+
let pos = LOG_LEVEL_NAMES.iter().position(|&name| name.eq_ignore_ascii_case(level));
2627
pos.map(|p| p as u32 + 1)
2728
}).map(|p| cmp::min(p, ::MAX_LOG_LEVEL))
2829
}

branches/try2/src/liblog/lib.rs

Lines changed: 68 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ use std::slice;
129129

130130
use sync::one::{Once, ONCE_INIT};
131131

132+
use directive::LOG_LEVEL_NAMES;
133+
132134
pub mod macros;
133135
mod directive;
134136

@@ -162,19 +164,42 @@ local_data_key!(local_logger: ~Logger:Send)
162164
/// can have its own custom logger which can respond to logging messages
163165
/// however it likes.
164166
pub trait Logger {
165-
/// Logs a single message described by the `args` structure. The level is
166-
/// provided in case you want to do things like color the message, etc.
167-
fn log(&mut self, level: u32, args: &fmt::Arguments);
167+
/// Logs a single message described by the `record`.
168+
fn log(&mut self, record: &LogRecord);
168169
}
169170

170171
struct DefaultLogger {
171172
handle: LineBufferedWriter<io::stdio::StdWriter>,
172173
}
173174

175+
/// Wraps the log level with fmt implementations.
176+
#[deriving(Eq, Ord)]
177+
pub struct LogLevel(pub u32);
178+
179+
impl fmt::Show for LogLevel {
180+
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
181+
let LogLevel(level) = *self;
182+
match LOG_LEVEL_NAMES.get(level as uint - 1) {
183+
Some(name) => name.fmt(fmt),
184+
None => level.fmt(fmt)
185+
}
186+
}
187+
}
188+
189+
impl fmt::Signed for LogLevel {
190+
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
191+
let LogLevel(level) = *self;
192+
write!(fmt.buf, "{}", level)
193+
}
194+
}
195+
174196
impl Logger for DefaultLogger {
175-
// by default, just ignore the level
176-
fn log(&mut self, _level: u32, args: &fmt::Arguments) {
177-
match fmt::writeln(&mut self.handle, args) {
197+
fn log(&mut self, record: &LogRecord) {
198+
match write!(&mut self.handle,
199+
"{}:{}: {}",
200+
record.level,
201+
record.module_path,
202+
record.args) {
178203
Err(e) => fail!("failed to log: {}", e),
179204
Ok(()) => {}
180205
}
@@ -198,14 +223,21 @@ impl Drop for DefaultLogger {
198223
///
199224
/// It is not recommended to call this function directly, rather it should be
200225
/// invoked through the logging family of macros.
201-
pub fn log(level: u32, args: &fmt::Arguments) {
226+
#[doc(hidden)]
227+
pub fn log(level: u32, loc: &'static LogLocation, args: &fmt::Arguments) {
202228
// Completely remove the local logger from TLS in case anyone attempts to
203229
// frob the slot while we're doing the logging. This will destroy any logger
204230
// set during logging.
205231
let mut logger = local_data::pop(local_logger).unwrap_or_else(|| {
206232
box DefaultLogger { handle: io::stderr() } as ~Logger:Send
207233
});
208-
logger.log(level, args);
234+
logger.log(&LogRecord {
235+
level: LogLevel(level),
236+
args: args,
237+
file: loc.file,
238+
module_path: loc.module_path,
239+
line: loc.line,
240+
});
209241
local_data::set(local_logger, logger);
210242
}
211243

@@ -223,6 +255,34 @@ pub fn set_logger(logger: ~Logger:Send) -> Option<~Logger:Send> {
223255
return prev;
224256
}
225257

258+
/// A LogRecord is created by the logging macros, and passed as the only
259+
/// argument to Loggers.
260+
#[deriving(Show)]
261+
pub struct LogRecord<'a> {
262+
263+
/// The module path of where the LogRecord originated.
264+
pub module_path: &'a str,
265+
266+
/// The LogLevel of this record.
267+
pub level: LogLevel,
268+
269+
/// The arguments from the log line.
270+
pub args: &'a fmt::Arguments<'a>,
271+
272+
/// The file of where the LogRecord originated.
273+
pub file: &'a str,
274+
275+
/// The line number of where the LogRecord originated.
276+
pub line: uint,
277+
}
278+
279+
#[doc(hidden)]
280+
pub struct LogLocation {
281+
pub module_path: &'static str,
282+
pub file: &'static str,
283+
pub line: uint,
284+
}
285+
226286
/// Tests whether a given module's name is enabled for a particular level of
227287
/// logging. This is the second layer of defense about determining whether a
228288
/// module's log statement should be emitted or not.

branches/try2/src/liblog/macros.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,14 @@
3333
#[macro_export]
3434
macro_rules! log(
3535
($lvl:expr, $($arg:tt)+) => ({
36+
static LOC: ::log::LogLocation = ::log::LogLocation {
37+
line: line!(),
38+
file: file!(),
39+
module_path: module_path!(),
40+
};
3641
let lvl = $lvl;
3742
if log_enabled!(lvl) {
38-
format_args!(|args| { ::log::log(lvl, args) }, $($arg)+)
43+
format_args!(|args| { ::log::log(lvl, &LOC, args) }, $($arg)+)
3944
}
4045
})
4146
)

branches/try2/src/libnative/io/file_win32.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ impl rtio::RtioFileStream for FileDesc {
174174
fn tell(&self) -> Result<u64, IoError> {
175175
// This transmute is fine because our seek implementation doesn't
176176
// actually use the mutable self at all.
177-
unsafe { cast::transmute_mut(self).seek(0, io::SeekCur) }
177+
// FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
178+
unsafe { cast::transmute::<&_, &mut FileDesc>(self).seek(0, io::SeekCur) }
178179
}
179180

180181
fn fsync(&mut self) -> Result<(), IoError> {

branches/try2/src/librustc/middle/lint.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1270,7 +1270,7 @@ fn check_pat_uppercase_variable(cx: &Context, p: &ast::Pat) {
12701270
// last identifier alone is right choice for this lint.
12711271
let ident = path.segments.last().unwrap().identifier;
12721272
let s = token::get_ident(ident);
1273-
if s.get().char_at(0).is_uppercase() {
1273+
if s.get().len() > 0 && s.get().char_at(0).is_uppercase() {
12741274
cx.span_lint(
12751275
UppercaseVariables,
12761276
path.span,

0 commit comments

Comments
 (0)