Skip to content

Commit eecdfeb

Browse files
committed
v3: speed up parser 20%
1 parent af90e27 commit eecdfeb

2 files changed

Lines changed: 28 additions & 12 deletions

File tree

vlib/v3/parser/parser.v

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,16 @@ fn read_source_file_raw(path string) string {
150150
if fd < 0 {
151151
return ''
152152
}
153-
buf := C.malloc(max_source_file_size + 1)
153+
size := os.file_size(path)
154+
if size == 0 {
155+
C.close(fd)
156+
return ''
157+
}
158+
expected := if size > max_source_file_size { max_source_file_size } else { int(size) }
159+
buf := C.malloc(expected + 1)
154160
mut total := 0
155-
for total < max_source_file_size {
156-
nread := C.read(fd, unsafe { buf + total }, max_source_file_size - total)
161+
for total < expected {
162+
nread := C.read(fd, unsafe { buf + total }, expected - total)
157163
if nread <= 0 {
158164
break
159165
}

vlib/v3/scanner/scanner.v

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
6979
fn (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

Comments
 (0)