@@ -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 ( ) == 0 u {
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 - 1 u ] . 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