Skip to content

Commit ea5d1df

Browse files
committed
auto merge of #10567 : sanxiyn/rust/bytepos, r=alexcrichton
2 parents f804bd9 + f4c1f49 commit ea5d1df

File tree

6 files changed

+17
-15
lines changed

6 files changed

+17
-15
lines changed

src/librustc/middle/resolve.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use syntax::parse::token;
2929
use syntax::parse::token::{ident_interner, interner_get};
3030
use syntax::parse::token::special_idents;
3131
use syntax::print::pprust::path_to_str;
32-
use syntax::codemap::{Span, dummy_sp, BytePos};
32+
use syntax::codemap::{Span, dummy_sp, Pos};
3333
use syntax::opt_vec::OptVec;
3434
use syntax::visit;
3535
use syntax::visit::Visitor;
@@ -2624,7 +2624,7 @@ impl Resolver {
26242624
if "???" == module_name {
26252625
let span = Span {
26262626
lo: span.lo,
2627-
hi: span.lo + BytePos(segment_name.len()),
2627+
hi: span.lo + Pos::from_uint(segment_name.len()),
26282628
expn_info: span.expn_info,
26292629
};
26302630
self.resolve_error(span,

src/libsyntax/codemap.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ pub trait Pos {
2929
fn to_uint(&self) -> uint;
3030
}
3131

32-
/// A byte offset
32+
/// A byte offset. Keep this small (currently 32-bits), as AST contains
33+
/// a lot of them.
3334
#[deriving(Clone, Eq, IterBytes, Ord)]
34-
pub struct BytePos(uint);
35+
pub struct BytePos(u32);
36+
3537
/// A character offset. Because of multibyte utf8 characters, a byte offset
3638
/// is not equivalent to a character offset. The CodeMap will convert BytePos
3739
/// values to CharPos values as necessary.
@@ -42,8 +44,8 @@ pub struct CharPos(uint);
4244
// have been unsuccessful
4345

4446
impl Pos for BytePos {
45-
fn from_uint(n: uint) -> BytePos { BytePos(n) }
46-
fn to_uint(&self) -> uint { **self }
47+
fn from_uint(n: uint) -> BytePos { BytePos(n as u32) }
48+
fn to_uint(&self) -> uint { **self as uint }
4749
}
4850

4951
impl Add<BytePos, BytePos> for BytePos {
@@ -278,7 +280,7 @@ impl CodeMap {
278280

279281
let filemap = @FileMap {
280282
name: filename, substr: substr, src: src,
281-
start_pos: BytePos(start_pos),
283+
start_pos: Pos::from_uint(start_pos),
282284
lines: @mut ~[],
283285
multibyte_chars: @mut ~[],
284286
};

src/libsyntax/parse/lexer.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ pub fn bump(rdr: &mut StringReader) {
247247
let last_char = rdr.curr;
248248
let next = rdr.src.char_range_at(current_byte_offset);
249249
let byte_offset_diff = next.next - current_byte_offset;
250-
rdr.pos = rdr.pos + BytePos(byte_offset_diff);
250+
rdr.pos = rdr.pos + Pos::from_uint(byte_offset_diff);
251251
rdr.curr = next.ch;
252252
rdr.col = rdr.col + CharPos(1u);
253253
if last_char == '\n' {
@@ -257,7 +257,7 @@ pub fn bump(rdr: &mut StringReader) {
257257

258258
if byte_offset_diff > 1 {
259259
rdr.filemap.record_multibyte_char(
260-
BytePos(current_byte_offset), byte_offset_diff);
260+
Pos::from_uint(current_byte_offset), byte_offset_diff);
261261
}
262262
} else {
263263
rdr.curr = unsafe { transmute(-1u32) }; // FIXME: #8971: unsound
@@ -333,7 +333,7 @@ fn consume_any_line_comment(rdr: @mut StringReader)
333333
bump(rdr);
334334
// line comments starting with "///" or "//!" are doc-comments
335335
if rdr.curr == '/' || rdr.curr == '!' {
336-
let start_bpos = rdr.pos - BytePos(3u);
336+
let start_bpos = rdr.pos - BytePos(3);
337337
while rdr.curr != '\n' && !is_eof(rdr) {
338338
bump(rdr);
339339
}
@@ -387,7 +387,7 @@ fn consume_block_comment(rdr: @mut StringReader)
387387
-> Option<TokenAndSpan> {
388388
// block comments starting with "/**" or "/*!" are doc-comments
389389
let is_doc_comment = rdr.curr == '*' || rdr.curr == '!';
390-
let start_bpos = rdr.pos - BytePos(if is_doc_comment {3u} else {2u});
390+
let start_bpos = rdr.pos - BytePos(if is_doc_comment {3} else {2});
391391

392392
let mut level: int = 1;
393393
while level > 0 {
@@ -815,7 +815,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
815815
// Byte offsetting here is okay because the
816816
// character before position `start` is an
817817
// ascii single quote.
818-
start - BytePos(1u),
818+
start - BytePos(1),
819819
rdr.last_pos,
820820
~"unterminated character constant");
821821
}

src/libsyntax/parse/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ mod test {
349349
}
350350

351351
// produce a codemap::span
352-
fn sp (a: uint, b: uint) -> Span {
352+
fn sp(a: u32, b: u32) -> Span {
353353
Span{lo:BytePos(a),hi:BytePos(b),expn_info:None}
354354
}
355355

src/libsyntax/parse/parser.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ impl Parser {
606606
token::GT => self.bump(),
607607
token::BINOP(token::SHR) => self.replace_token(
608608
token::GT,
609-
self.span.lo + BytePos(1u),
609+
self.span.lo + BytePos(1),
610610
self.span.hi
611611
),
612612
_ => self.fatal(format!("expected `{}`, found `{}`",

src/libsyntax/print/pprust.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2119,7 +2119,7 @@ pub fn maybe_print_trailing_comment(s: @ps, span: codemap::Span,
21192119
if (*cmnt).style != comments::trailing { return; }
21202120
let span_line = cm.lookup_char_pos(span.hi);
21212121
let comment_line = cm.lookup_char_pos((*cmnt).pos);
2122-
let mut next = (*cmnt).pos + BytePos(1u);
2122+
let mut next = (*cmnt).pos + BytePos(1);
21232123
match next_pos { None => (), Some(p) => next = p }
21242124
if span.hi < (*cmnt).pos && (*cmnt).pos < next &&
21252125
span_line.line == comment_line.line {

0 commit comments

Comments
 (0)