@@ -65,6 +65,16 @@ pub fn (mut s Scanner) init(file &token.File, src string) {
6565 s.src = src
6666}
6767
68+ @[inline]
69+ fn (s &Scanner) source_lit (start int , end int ) string {
70+ if end < = start {
71+ return ''
72+ }
73+ unsafe {
74+ return tos (s.src.str + start, end - start)
75+ }
76+ }
77+
6878// scan_char_literal reads scan char literal input for scanner.
6979fn (mut s Scanner) scan_char_literal (quote u8 ) token.Token {
7080 s.offset++
@@ -84,7 +94,7 @@ fn (mut s Scanner) scan_char_literal(quote u8) token.Token {
8494 end = s.offset
8595 s.offset++
8696 }
87- s.lit = s.src[ s.pos + 1 .. end]
97+ s.lit = s.source_lit ( s.pos + 1 , end)
8898 s.insert_semi = true
8999 return .char
90100}
@@ -101,7 +111,7 @@ pub fn (mut s Scanner) scan() token.Token {
101111 s.in_str_incomplete = false
102112 s.pos = s.offset
103113 s.string_literal (false , s.str_quote)
104- s.lit = s.src[ s.pos.. s.offset]
114+ s.lit = s.source_lit ( s.pos, s.offset)
105115 return .string
106116 }
107117 start:
@@ -135,7 +145,7 @@ pub fn (mut s Scanner) scan() token.Token {
135145 goto start
136146 }
137147 }
138- s.lit = s.src[ s.pos.. s.offset]
148+ s.lit = s.source_lit ( s.pos, s.offset)
139149 return .comment
140150 } else if c2 == `=` {
141151 s.offset + = 2
@@ -145,7 +155,7 @@ pub fn (mut s Scanner) scan() token.Token {
145155 return .div
146156 } else if c > = `0` && c < = `9` {
147157 s.number ()
148- s.lit = s.src[ s.pos.. s.offset]
158+ s.lit = s.source_lit ( s.pos, s.offset)
149159 s.insert_semi = true
150160 return .number
151161 } else if (c > = `a` && c < = `z` ) || (c > = `A` && c < = `Z` ) || c == `_` || c == `@` {
@@ -162,7 +172,7 @@ pub fn (mut s Scanner) scan() token.Token {
162172 }
163173 break
164174 }
165- s.lit = s.src[ s.pos.. s.offset]
175+ s.lit = s.source_lit ( s.pos, s.offset)
166176 if s.lit == 'c' && s.offset < s.src.len && s.src[s.offset] == `'` {
167177 s.pos = s.offset
168178 tok := s.scan_char_literal (`'` )
@@ -177,7 +187,7 @@ pub fn (mut s Scanner) scan() token.Token {
177187 s.str_quote = quote
178188 }
179189 s.string_literal (true , quote)
180- s.lit = s.src[ s.pos.. s.offset]
190+ s.lit = s.source_lit ( s.pos, s.offset)
181191 s.insert_semi = true
182192 return .string
183193 }
@@ -193,7 +203,7 @@ pub fn (mut s Scanner) scan() token.Token {
193203 s.str_quote = c
194204 }
195205 s.string_literal (s.in_str_inter || (s.offset > = 2 && s.src[s.offset - 2 ] == `r` ), c)
196- s.lit = s.src[ s.pos.. s.offset]
206+ s.lit = s.source_lit ( s.pos, s.offset)
197207 s.insert_semi = true
198208 return .string
199209 } else if c == `\` ` {
@@ -206,7 +216,7 @@ pub fn (mut s Scanner) scan() token.Token {
206216 c2 := s.peek_byte (0 )
207217 if c2 > = `0` && c2 < = `9` {
208218 s.number ()
209- s.lit = s.src[ s.pos.. s.offset]
219+ s.lit = s.source_lit ( s.pos, s.offset)
210220 return .number
211221 } else if c2 == `.` {
212222 s.offset++
@@ -375,7 +385,7 @@ pub fn (mut s Scanner) scan() token.Token {
375385 for s.offset < s.src.len && s.src[s.offset] != `\n ` {
376386 s.offset++
377387 }
378- s.lit = s.src[ start.. s.offset] .trim_space ()
388+ s.lit = s.source_lit ( start, s.offset) .trim_space ()
379389 s.insert_semi = true
380390 return .hash
381391 }
0 commit comments