@@ -67,7 +67,7 @@ func (vm *VM) Run(program *Program, env interface{}) interface{} {
67
67
switch op {
68
68
69
69
case OpPush :
70
- vm .push (vm .constants [ vm . arg ()] )
70
+ vm .push (vm .constant () )
71
71
72
72
case OpPop :
73
73
vm .pop ()
@@ -79,10 +79,10 @@ func (vm *VM) Run(program *Program, env interface{}) interface{} {
79
79
vm .push (a )
80
80
81
81
case OpFetch :
82
- vm .push (fetch (env , vm .constants [ vm . arg ()] ))
82
+ vm .push (fetch (env , vm .constant () ))
83
83
84
84
case OpFetchMap :
85
- vm .push (env .(map [string ]interface {})[vm .constants [ vm . arg ()] .(string )])
85
+ vm .push (env .(map [string ]interface {})[vm .constant () .(string )])
86
86
87
87
case OpTrue :
88
88
vm .push (true )
@@ -208,7 +208,7 @@ func (vm *VM) Run(program *Program, env interface{}) interface{} {
208
208
209
209
case OpMatchesConst :
210
210
a := vm .pop ()
211
- r := vm .constants [ vm . arg ()] .(* regexp.Regexp )
211
+ r := vm .constant () .(* regexp.Regexp )
212
212
vm .push (r .MatchString (a .(string )))
213
213
214
214
case OpContains :
@@ -239,31 +239,34 @@ func (vm *VM) Run(program *Program, env interface{}) interface{} {
239
239
240
240
case OpProperty :
241
241
a := vm .pop ()
242
- b := vm .constants [ vm . arg ()]
242
+ b := vm .constant ()
243
243
vm .push (fetch (a , b ))
244
244
245
245
case OpCall :
246
- call := vm .constants [vm .arg ()].(Call )
247
-
246
+ call := vm .constant ().(Call )
248
247
in := make ([]reflect.Value , call .Size )
249
248
for i := call .Size - 1 ; i >= 0 ; i -- {
250
249
in [i ] = reflect .ValueOf (vm .pop ())
251
250
}
252
-
253
251
out := fetchFn (env , call .Name ).Call (in )
254
252
vm .push (out [0 ].Interface ())
255
253
254
+ case OpCallFast :
255
+ call := vm .constant ().(Call )
256
+ in := make ([]interface {}, call .Size )
257
+ for i := call .Size - 1 ; i >= 0 ; i -- {
258
+ in [i ] = vm .pop ()
259
+ }
260
+ fn := fetchFn (env , call .Name ).Interface ()
261
+ vm .push (fn .(func (... interface {}) interface {})(in ... ))
262
+
256
263
case OpMethod :
257
264
call := vm .constants [vm .arg ()].(Call )
258
-
259
265
in := make ([]reflect.Value , call .Size )
260
266
for i := call .Size - 1 ; i >= 0 ; i -- {
261
267
in [i ] = reflect .ValueOf (vm .pop ())
262
268
}
263
-
264
- obj := vm .pop ()
265
-
266
- out := fetchFn (obj , call .Name ).Call (in )
269
+ out := fetchFn (vm .pop (), call .Name ).Call (in )
267
270
vm .push (out [0 ].Interface ())
268
271
269
272
case OpArray :
@@ -298,18 +301,18 @@ func (vm *VM) Run(program *Program, env interface{}) interface{} {
298
301
299
302
case OpStore :
300
303
scope := vm .Scope ()
301
- key := vm .constants [ vm . arg ()] .(string )
304
+ key := vm .constant () .(string )
302
305
value := vm .pop ()
303
306
scope [key ] = value
304
307
305
308
case OpLoad :
306
309
scope := vm .Scope ()
307
- key := vm .constants [ vm . arg ()] .(string )
310
+ key := vm .constant () .(string )
308
311
vm .push (scope [key ])
309
312
310
313
case OpInc :
311
314
scope := vm .Scope ()
312
- key := vm .constants [ vm . arg ()] .(string )
315
+ key := vm .constant () .(string )
313
316
i := scope [key ].(int )
314
317
i ++
315
318
scope [key ] = i
@@ -362,6 +365,10 @@ func (vm *VM) arg() uint16 {
362
365
return uint16 (b0 ) | uint16 (b1 )<< 8
363
366
}
364
367
368
+ func (vm * VM ) constant () interface {} {
369
+ return vm .constants [vm .arg ()]
370
+ }
371
+
365
372
func (vm * VM ) Stack () []interface {} {
366
373
return vm .stack
367
374
}
0 commit comments