Skip to content

Commit 33fd88f

Browse files
authored
Merge pull request #4 from haya14busa/performance
Improve performance
2 parents 91d84c9 + 1dc4167 commit 33fd88f

File tree

8 files changed

+103
-103
lines changed

8 files changed

+103
-103
lines changed

go/_test/let.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,20 @@ if x {
3232
func F() {
3333
var cmd *Cmd = nil
3434
for _, x := range builtin_commands {
35-
if viml_stridx(x.name, name) == 0 && viml_len(name) >= x.minlen {
35+
if viml_stridx(x.name, name) == 0 && len(name) >= x.minlen {
3636
cmd = x
3737
break
3838
}
3939
}
4040
if self.neovim {
4141
for _, x := range neovim_additional_commands {
42-
if viml_stridx(x.name, name) == 0 && viml_len(name) >= x.minlen {
42+
if viml_stridx(x.name, name) == 0 && len(name) >= x.minlen {
4343
cmd = x
4444
break
4545
}
4646
}
4747
for _, x := range neovim_removed_commands {
48-
if viml_stridx(x.name, name) == 0 && viml_len(name) >= x.minlen {
48+
if viml_stridx(x.name, name) == 0 && len(name) >= x.minlen {
4949
cmd = nil
5050
break
5151
}

go/_test/special.vim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ function! s:ExprTokenizer.token()
1111
" skip ExprTokenizer.token
1212
endfunction
1313

14+
function! s:StringReader.__init__()
15+
" skip StringReader.__init__
16+
endfunction
17+
1418
function! s:StringReader.getpos()
1519
" skip StringReader.getpos
1620
endfunction

go/gocompiler.vim

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ function s:GoCompiler.compile_function(node)
347347
let [_0, struct, name; _] = matchlist(left, '^\(.*\)\.\(.*\)$')
348348
if name == 'new'
349349
\ || (struct == 'ExprTokenizer' && name == 'token')
350-
\ || (struct == 'StringReader' && name == 'getpos')
350+
\ || (struct == 'StringReader' && (name == 'getpos' || name == '__init__'))
351351
\ || (struct == 'VimLParser' && (name =~ '\(push\|pop\)_context\|__init__'))
352352
\ || (struct == 'Compiler' && (
353353
\ name == '__init__'
@@ -871,6 +871,8 @@ function s:GoCompiler.compile_call(node)
871871
if index(s:viml_builtin_functions, left) != -1
872872
if left == 'add'
873873
let left = 'append'
874+
elseif left == 'len'
875+
let left = 'len'
874876
else
875877
let left = printf('viml_%s', left)
876878
endif

go/type.go

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func NewLvalueParser(reader *StringReader) *LvalueParser {
167167

168168
type StringReader struct {
169169
i int
170-
pos [][]interface{} // (lnum, col int)
170+
pos []pos
171171
buf []string
172172
}
173173

@@ -177,10 +177,52 @@ func NewStringReader(lines []string) *StringReader {
177177
return obj
178178
}
179179

180+
func (self *StringReader) __init__(lines []string) {
181+
size := 0
182+
for _, l := range lines {
183+
size += len(l) + 1 // +1 for EOL
184+
}
185+
self.buf = make([]string, 0, size)
186+
self.pos = make([]pos, 0, size+1) // +1 for EOF
187+
var lnum = 0
188+
for lnum < len(lines) {
189+
var col = 0
190+
for _, r := range lines[lnum] {
191+
c := string(r)
192+
self.buf = append(self.buf, c)
193+
self.pos = append(self.pos, pos{lnum: lnum + 1, col: col + 1})
194+
col += len(c)
195+
}
196+
for lnum+1 < len(lines) && viml_eqregh(lines[lnum+1], "^\\s*\\\\") {
197+
var skip = true
198+
col = 0
199+
for _, r := range lines[lnum+1] {
200+
c := string(r)
201+
if skip {
202+
if c == "\\" {
203+
skip = false
204+
}
205+
} else {
206+
self.buf = append(self.buf, c)
207+
self.pos = append(self.pos, pos{lnum: lnum + 2, col: col + 1})
208+
}
209+
col += len(c)
210+
}
211+
lnum += 1
212+
}
213+
self.buf = append(self.buf, "<EOL>")
214+
self.pos = append(self.pos, pos{lnum: lnum + 1, col: col + 1})
215+
lnum += 1
216+
}
217+
// for <EOF>
218+
self.pos = append(self.pos, pos{lnum: lnum + 1, col: 0})
219+
self.i = 0
220+
}
221+
180222
func (self *StringReader) getpos() *pos {
181-
var p = self.pos[self.i]
182-
var lnum, col = p[0].(int), p[1].(int)
183-
return &pos{i: self.i, lnum: lnum, col: col}
223+
p := self.pos[self.i]
224+
p.i = self.i
225+
return &p
184226
}
185227

186228
type Compiler struct {
@@ -200,7 +242,7 @@ func (self *Compiler) __init__() {
200242
}
201243

202244
func (self *Compiler) out(f string, args ...interface{}) {
203-
if viml_len(args) == 0 {
245+
if len(args) == 0 {
204246
if string(f[0]) == ")" {
205247
self.lines[len(self.lines)-1] += f
206248
} else {

go/vimlfunc.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func init() {
7777
type vimlList interface{}
7878

7979
func viml_empty(obj interface{}) bool {
80-
return viml_len(obj) == 0
80+
return reflect.ValueOf(obj).Len() == 0
8181
}
8282

8383
func viml_equalci(a, b string) bool {
@@ -125,10 +125,6 @@ func viml_join(lst vimlList, sep string) string {
125125
return strings.Join(ss, sep)
126126
}
127127

128-
func viml_len(obj interface{}) int {
129-
return reflect.ValueOf(obj).Len()
130-
}
131-
132128
func viml_printf(f string, args ...interface{}) string {
133129
return fmt.Sprintf(f, args...)
134130
}
@@ -143,7 +139,7 @@ func viml_range(start, end int) []int {
143139

144140
func viml_split(s string, sep string) []string {
145141
if sep == `\zs` {
146-
var ss []string
142+
ss := make([]string, 0, len(s))
147143
for _, r := range s {
148144
ss = append(ss, string(r))
149145
}

go/vimlfunc_test.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,6 @@ import (
55
"testing"
66
)
77

8-
func TestViml_len(t *testing.T) {
9-
tests := []struct {
10-
in interface{}
11-
want int
12-
}{
13-
{in: "hoge", want: 4},
14-
{in: "あいうえお", want: 15},
15-
{in: "", want: 0},
16-
{in: []string{"hoge", "foo"}, want: 2},
17-
{in: []int{1, 2, 3}, want: 3},
18-
{in: []interface{}{1, "2", float64(3)}, want: 3},
19-
}
20-
for _, tt := range tests {
21-
got := viml_len(tt.in)
22-
if got != tt.want {
23-
t.Errorf("viml_len(%v) = %v, want %v", tt.in, got, tt.want)
24-
}
25-
}
26-
}
27-
288
func TestViml_eqreg(t *testing.T) {
299
tests := []struct {
3010
in string

0 commit comments

Comments
 (0)