|
@@ -55,35 +55,6 @@ func TestEvalVar(t *testing.T) {
|
|
testScript(SCRIPT, valueTrue, t)
|
|
testScript(SCRIPT, valueTrue, t)
|
|
}
|
|
}
|
|
|
|
|
|
-var jumptable = []func(*vm, *instr){
|
|
|
|
- f_jump,
|
|
|
|
- f_halt,
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func f_jump(vm *vm, i *instr) {
|
|
|
|
- vm.pc += i.prim
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func f_halt(vm *vm, i *instr) {
|
|
|
|
- vm.halt = true
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-func f_loadVal(vm *vm, i *instr) {
|
|
|
|
- vm.push(vm.prg.values[i.prim])
|
|
|
|
- vm.pc++
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-type instr struct {
|
|
|
|
- code int
|
|
|
|
- prim int
|
|
|
|
- arg interface{}
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-type jumparg struct {
|
|
|
|
- offset int
|
|
|
|
- other string
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func BenchmarkVmNOP2(b *testing.B) {
|
|
func BenchmarkVmNOP2(b *testing.B) {
|
|
prg := []func(*vm){
|
|
prg := []func(*vm){
|
|
//loadVal(0).exec,
|
|
//loadVal(0).exec,
|
|
@@ -118,85 +89,6 @@ func BenchmarkVmNOP2(b *testing.B) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func BenchmarkVmNOP1(b *testing.B) {
|
|
|
|
- prg := []instr{
|
|
|
|
- {code: 2, prim: 0},
|
|
|
|
- {code: 2, prim: 1},
|
|
|
|
- {code: 3},
|
|
|
|
- {code: 1},
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- r := &Runtime{}
|
|
|
|
- r.init()
|
|
|
|
-
|
|
|
|
- vm := r.vm
|
|
|
|
- vm.prg = &Program{
|
|
|
|
- values: []Value{intToValue(2), intToValue(3)},
|
|
|
|
- }
|
|
|
|
- for i := 0; i < b.N; i++ {
|
|
|
|
- vm.halt = false
|
|
|
|
- vm.pc = 0
|
|
|
|
- L:
|
|
|
|
- for {
|
|
|
|
- instr := &prg[vm.pc]
|
|
|
|
- //jumptable[instr.code](vm, instr)
|
|
|
|
- switch instr.code {
|
|
|
|
- case 10:
|
|
|
|
- vm.pc += 1
|
|
|
|
- case 11:
|
|
|
|
- vm.pc += 2
|
|
|
|
- case 12:
|
|
|
|
- vm.pc += 3
|
|
|
|
- case 13:
|
|
|
|
- vm.pc += 4
|
|
|
|
- case 14:
|
|
|
|
- vm.pc += 5
|
|
|
|
- case 15:
|
|
|
|
- vm.pc += 6
|
|
|
|
- case 16:
|
|
|
|
- vm.pc += 7
|
|
|
|
- case 17:
|
|
|
|
- vm.pc += 8
|
|
|
|
- case 18:
|
|
|
|
- vm.pc += 9
|
|
|
|
- case 19:
|
|
|
|
- vm.pc += 10
|
|
|
|
- case 20:
|
|
|
|
- vm.pc += 11
|
|
|
|
- case 21:
|
|
|
|
- vm.pc += 12
|
|
|
|
- case 22:
|
|
|
|
- vm.pc += 13
|
|
|
|
- case 23:
|
|
|
|
- vm.pc += 14
|
|
|
|
- case 24:
|
|
|
|
- vm.pc += 15
|
|
|
|
- case 25:
|
|
|
|
- vm.pc += 16
|
|
|
|
- case 0:
|
|
|
|
- //vm.pc += instr.prim
|
|
|
|
- f_jump(vm, instr)
|
|
|
|
- case 1:
|
|
|
|
- break L
|
|
|
|
- case 2:
|
|
|
|
- f_loadVal(vm, instr)
|
|
|
|
- default:
|
|
|
|
- jumptable[instr.code](vm, instr)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- r := vm.pop()
|
|
|
|
- if r.ToInteger() != 5 {
|
|
|
|
- b.Fatalf("Unexpected result: %+v", r)
|
|
|
|
- }
|
|
|
|
- if vm.sp != 0 {
|
|
|
|
- b.Fatalf("Unexpected sp: %d", vm.sp)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- //vm.sp -= 1
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func BenchmarkVmNOP(b *testing.B) {
|
|
func BenchmarkVmNOP(b *testing.B) {
|
|
r := &Runtime{}
|
|
r := &Runtime{}
|
|
r.init()
|
|
r.init()
|
|
@@ -279,7 +171,7 @@ fib(35);
|
|
|
|
|
|
vm.prg = c.p
|
|
vm.prg = c.p
|
|
vm.run()
|
|
vm.run()
|
|
- v := vm.pop()
|
|
|
|
|
|
+ v := vm.result
|
|
|
|
|
|
b.Logf("stack size: %d", len(vm.stack))
|
|
b.Logf("stack size: %d", len(vm.stack))
|
|
b.Logf("stashAllocs: %d", vm.stashAllocs)
|
|
b.Logf("stashAllocs: %d", vm.stashAllocs)
|
|
@@ -347,8 +239,7 @@ func BenchmarkFuncCall(b *testing.B) {
|
|
}
|
|
}
|
|
|
|
|
|
func BenchmarkAssertInt(b *testing.B) {
|
|
func BenchmarkAssertInt(b *testing.B) {
|
|
- var v Value
|
|
|
|
- v = intToValue(42)
|
|
|
|
|
|
+ v := intToValue(42)
|
|
for i := 0; i < b.N; i++ {
|
|
for i := 0; i < b.N; i++ {
|
|
if i, ok := v.(valueInt); !ok || int64(i) != 42 {
|
|
if i, ok := v.(valueInt); !ok || int64(i) != 42 {
|
|
b.Fatal()
|
|
b.Fatal()
|