@@ -70,7 +70,9 @@ class parser {
70
70
let mut token: token:: token ;
71
71
let mut span: span ;
72
72
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 ;
74
76
let mut restriction: restriction ;
75
77
let reader: reader ;
76
78
let keywords: hashmap < str , ( ) > ;
@@ -86,7 +88,14 @@ class parser {
86
88
self . token = tok0. tok ;
87
89
self . span = span0;
88
90
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 ;
90
99
self . restriction = UNRESTRICTED ;
91
100
self . reader = rdr;
92
101
self . keywords = token:: keyword_table ( ) ;
@@ -98,12 +107,13 @@ class parser {
98
107
99
108
fn bump ( ) {
100
109
self . last_span = self . span ;
101
- if self . buffer . len ( ) == 0 u {
110
+ if self . buffer_start == self . buffer_end {
102
111
let next = lexer:: next_token ( self . reader ) ;
103
112
self . token = next. tok ;
104
113
self . span = mk_sp ( next. chpos , self . reader . chpos ) ;
105
114
} else {
106
- let next = self . buffer . shift ( ) ;
115
+ let next = self . buffer [ self . buffer_start ] ;
116
+ self . buffer_start = ( self . buffer_start + 1 ) & 3 ;
107
117
self . token = next. tok ;
108
118
self . span = next. span ;
109
119
}
@@ -112,13 +122,21 @@ class parser {
112
122
self . token = next;
113
123
self . span = mk_sp ( lo, hi) ;
114
124
}
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
+ }
115
131
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 {
117
134
let next = lexer:: next_token ( self . reader ) ;
118
135
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 ;
120
138
}
121
- ret self. buffer [ distance - 1 u ] . tok ;
139
+ ret copy self . buffer [ ( self . buffer_start + dist - 1 ) & 3 ] . tok ;
122
140
}
123
141
fn fatal ( m : str ) -> ! {
124
142
self . sess . span_diagnostic . span_fatal ( copy self . span , m)
0 commit comments