Make BytePos 32-bit

This commit is contained in:
Seo Sanghyeon 2013-11-20 02:15:49 +09:00
parent c4e28ae068
commit 5e1e487624
5 changed files with 16 additions and 14 deletions

View File

@ -29,7 +29,7 @@ use syntax::parse::token;
use syntax::parse::token::{ident_interner, interner_get}; use syntax::parse::token::{ident_interner, interner_get};
use syntax::parse::token::special_idents; use syntax::parse::token::special_idents;
use syntax::print::pprust::path_to_str; use syntax::print::pprust::path_to_str;
use syntax::codemap::{Span, dummy_sp, BytePos}; use syntax::codemap::{Span, dummy_sp, Pos};
use syntax::opt_vec::OptVec; use syntax::opt_vec::OptVec;
use syntax::visit; use syntax::visit;
use syntax::visit::Visitor; use syntax::visit::Visitor;
@ -2624,7 +2624,7 @@ impl Resolver {
if "???" == module_name { if "???" == module_name {
let span = Span { let span = Span {
lo: span.lo, lo: span.lo,
hi: span.lo + BytePos(segment_name.len()), hi: span.lo + Pos::from_uint(segment_name.len()),
expn_info: span.expn_info, expn_info: span.expn_info,
}; };
self.resolve_error(span, self.resolve_error(span,

View File

@ -29,9 +29,11 @@ pub trait Pos {
fn to_uint(&self) -> uint; fn to_uint(&self) -> uint;
} }
/// A byte offset /// A byte offset. Keep this small (currently 32-bits), as AST contains
/// a lot of them.
#[deriving(Clone, Eq, IterBytes, Ord)] #[deriving(Clone, Eq, IterBytes, Ord)]
pub struct BytePos(uint); pub struct BytePos(u32);
/// A character offset. Because of multibyte utf8 characters, a byte offset /// A character offset. Because of multibyte utf8 characters, a byte offset
/// is not equivalent to a character offset. The CodeMap will convert BytePos /// is not equivalent to a character offset. The CodeMap will convert BytePos
/// values to CharPos values as necessary. /// values to CharPos values as necessary.
@ -42,8 +44,8 @@ pub struct CharPos(uint);
// have been unsuccessful // have been unsuccessful
impl Pos for BytePos { impl Pos for BytePos {
fn from_uint(n: uint) -> BytePos { BytePos(n) } fn from_uint(n: uint) -> BytePos { BytePos(n as u32) }
fn to_uint(&self) -> uint { **self } fn to_uint(&self) -> uint { **self as uint }
} }
impl Add<BytePos, BytePos> for BytePos { impl Add<BytePos, BytePos> for BytePos {
@ -278,7 +280,7 @@ impl CodeMap {
let filemap = @FileMap { let filemap = @FileMap {
name: filename, substr: substr, src: src, name: filename, substr: substr, src: src,
start_pos: BytePos(start_pos), start_pos: Pos::from_uint(start_pos),
lines: @mut ~[], lines: @mut ~[],
multibyte_chars: @mut ~[], multibyte_chars: @mut ~[],
}; };

View File

@ -241,7 +241,7 @@ pub fn bump(rdr: &mut StringReader) {
let last_char = rdr.curr; let last_char = rdr.curr;
let next = rdr.src.char_range_at(current_byte_offset); let next = rdr.src.char_range_at(current_byte_offset);
let byte_offset_diff = next.next - current_byte_offset; let byte_offset_diff = next.next - current_byte_offset;
rdr.pos = rdr.pos + BytePos(byte_offset_diff); rdr.pos = rdr.pos + Pos::from_uint(byte_offset_diff);
rdr.curr = next.ch; rdr.curr = next.ch;
rdr.col = rdr.col + CharPos(1u); rdr.col = rdr.col + CharPos(1u);
if last_char == '\n' { if last_char == '\n' {
@ -251,7 +251,7 @@ pub fn bump(rdr: &mut StringReader) {
if byte_offset_diff > 1 { if byte_offset_diff > 1 {
rdr.filemap.record_multibyte_char( rdr.filemap.record_multibyte_char(
BytePos(current_byte_offset), byte_offset_diff); Pos::from_uint(current_byte_offset), byte_offset_diff);
} }
} else { } else {
rdr.curr = unsafe { transmute(-1u32) }; // FIXME: #8971: unsound rdr.curr = unsafe { transmute(-1u32) }; // FIXME: #8971: unsound
@ -327,7 +327,7 @@ fn consume_any_line_comment(rdr: @mut StringReader)
bump(rdr); bump(rdr);
// line comments starting with "///" or "//!" are doc-comments // line comments starting with "///" or "//!" are doc-comments
if rdr.curr == '/' || rdr.curr == '!' { if rdr.curr == '/' || rdr.curr == '!' {
let start_bpos = rdr.pos - BytePos(3u); let start_bpos = rdr.pos - BytePos(3);
while rdr.curr != '\n' && !is_eof(rdr) { while rdr.curr != '\n' && !is_eof(rdr) {
bump(rdr); bump(rdr);
} }
@ -381,7 +381,7 @@ fn consume_block_comment(rdr: @mut StringReader)
-> Option<TokenAndSpan> { -> Option<TokenAndSpan> {
// block comments starting with "/**" or "/*!" are doc-comments // block comments starting with "/**" or "/*!" are doc-comments
let is_doc_comment = rdr.curr == '*' || rdr.curr == '!'; let is_doc_comment = rdr.curr == '*' || rdr.curr == '!';
let start_bpos = rdr.pos - BytePos(if is_doc_comment {3u} else {2u}); let start_bpos = rdr.pos - BytePos(if is_doc_comment {3} else {2});
let mut level: int = 1; let mut level: int = 1;
while level > 0 { while level > 0 {
@ -809,7 +809,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
// Byte offsetting here is okay because the // Byte offsetting here is okay because the
// character before position `start` is an // character before position `start` is an
// ascii single quote. // ascii single quote.
start - BytePos(1u), start - BytePos(1),
rdr.last_pos, rdr.last_pos,
~"unterminated character constant"); ~"unterminated character constant");
} }

View File

@ -608,7 +608,7 @@ impl Parser {
token::GT => self.bump(), token::GT => self.bump(),
token::BINOP(token::SHR) => self.replace_token( token::BINOP(token::SHR) => self.replace_token(
token::GT, token::GT,
self.span.lo + BytePos(1u), self.span.lo + BytePos(1),
self.span.hi self.span.hi
), ),
_ => self.fatal(format!("expected `{}`, found `{}`", _ => self.fatal(format!("expected `{}`, found `{}`",

View File

@ -2115,7 +2115,7 @@ pub fn maybe_print_trailing_comment(s: @ps, span: codemap::Span,
if (*cmnt).style != comments::trailing { return; } if (*cmnt).style != comments::trailing { return; }
let span_line = cm.lookup_char_pos(span.hi); let span_line = cm.lookup_char_pos(span.hi);
let comment_line = cm.lookup_char_pos((*cmnt).pos); let comment_line = cm.lookup_char_pos((*cmnt).pos);
let mut next = (*cmnt).pos + BytePos(1u); let mut next = (*cmnt).pos + BytePos(1);
match next_pos { None => (), Some(p) => next = p } match next_pos { None => (), Some(p) => next = p }
if span.hi < (*cmnt).pos && (*cmnt).pos < next && if span.hi < (*cmnt).pos && (*cmnt).pos < next &&
span_line.line == comment_line.line { span_line.line == comment_line.line {