Skip to content

Commit 5a04069

Browse files
committed
Merge pull request #2559 from mozilla/incoming
Incoming
2 parents 56c6c65 + 436b77c commit 5a04069

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

src/libcore/str.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,22 @@ Section: Comparing strings
592592
*/
593593

594594
#[doc = "Bytewise string equality"]
595-
pure fn eq(&&a: str, &&b: str) -> bool { a == b }
595+
pure fn eq(&&a: str, &&b: str) -> bool {
596+
// FIXME: This should just be "a == b" but that calls into the shape code
597+
// :(
598+
let a_len = a.len();
599+
let b_len = b.len();
600+
if a_len != b_len { ret false; }
601+
let mut end = uint::min(a_len, b_len);
602+
603+
let mut i = 0u;
604+
while i < end {
605+
if a[i] != b[i] { ret false; }
606+
i += 1u;
607+
}
608+
609+
ret true;
610+
}
596611

597612
#[doc = "Bytewise less than or equal"]
598613
pure fn le(&&a: str, &&b: str) -> bool { a <= b }
@@ -1861,11 +1876,11 @@ impl extensions for str {
18611876
18621877
Alphanumeric characters are determined by `char::is_alphanumeric`
18631878
"]
1864-
#[inlune]
1879+
#[inline]
18651880
fn is_alphanumeric() -> bool { is_alphanumeric(self) }
18661881
#[inline]
18671882
#[doc ="Returns the size in bytes not counting the null terminator"]
1868-
fn len() -> uint { len(self) }
1883+
pure fn len() -> uint { len(self) }
18691884
#[doc = "
18701885
Returns a slice of the given string from the byte range [`begin`..`end`)
18711886

src/libsyntax/parse/parser.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,9 @@ class parser {
7070
let mut token: token::token;
7171
let mut span: span;
7272
let mut last_span: span;
73-
let buffer: dvec<{tok: token::token, span: span}>;
73+
let mut buffer: [mut {tok: token::token, span: span}]/4;
74+
let mut buffer_start: int;
75+
let mut buffer_end: int;
7476
let mut restriction: restriction;
7577
let reader: reader;
7678
let keywords: hashmap<str, ()>;
@@ -86,7 +88,14 @@ class parser {
8688
self.token = tok0.tok;
8789
self.span = span0;
8890
self.last_span = span0;
89-
self.buffer = dvec::dvec();
91+
self.buffer = [mut
92+
{tok: tok0.tok, span: span0},
93+
{tok: tok0.tok, span: span0},
94+
{tok: tok0.tok, span: span0},
95+
{tok: tok0.tok, span: span0}
96+
]/4;
97+
self.buffer_start = 0;
98+
self.buffer_end = 0;
9099
self.restriction = UNRESTRICTED;
91100
self.reader = rdr;
92101
self.keywords = token::keyword_table();
@@ -98,12 +107,13 @@ class parser {
98107

99108
fn bump() {
100109
self.last_span = self.span;
101-
if self.buffer.len() == 0u {
110+
if self.buffer_start == self.buffer_end {
102111
let next = lexer::next_token(self.reader);
103112
self.token = next.tok;
104113
self.span = mk_sp(next.chpos, self.reader.chpos);
105114
} else {
106-
let next = self.buffer.shift();
115+
let next = self.buffer[self.buffer_start];
116+
self.buffer_start = (self.buffer_start + 1) & 3;
107117
self.token = next.tok;
108118
self.span = next.span;
109119
}
@@ -112,13 +122,21 @@ class parser {
112122
self.token = next;
113123
self.span = mk_sp(lo, hi);
114124
}
125+
fn buffer_length() -> int {
126+
if self.buffer_start <= self.buffer_end {
127+
ret self.buffer_end - self.buffer_start;
128+
}
129+
ret (4 - self.buffer_start) + self.buffer_end;
130+
}
115131
fn look_ahead(distance: uint) -> token::token {
116-
while self.buffer.len() < distance {
132+
let dist = distance as int;
133+
while self.buffer_length() < dist {
117134
let next = lexer::next_token(self.reader);
118135
let sp = mk_sp(next.chpos, self.reader.chpos);
119-
self.buffer.push({tok: next.tok, span: sp});
136+
self.buffer[self.buffer_end] = {tok: next.tok, span: sp};
137+
self.buffer_end = (self.buffer_end + 1) & 3;
120138
}
121-
ret self.buffer[distance - 1u].tok;
139+
ret copy self.buffer[(self.buffer_start + dist - 1) & 3].tok;
122140
}
123141
fn fatal(m: str) -> ! {
124142
self.sess.span_diagnostic.span_fatal(copy self.span, m)

0 commit comments

Comments
 (0)