From 07ad79d1e39ee87e57776d2493a1c7458d89a7b1 Mon Sep 17 00:00:00 2001 From: mathetake Date: Mon, 11 May 2020 21:53:52 +0900 Subject: [PATCH] tiny fix --- examples/fibonacci_test.go | 2 +- examples/wasm/fibonacci.go | 6 ++--- examples/wasm/fibonacci.wasm | Bin 7258 -> 7289 bytes wasm/vm_memory.go | 1 + wasm/vm_memory_test.go | 43 +++++++++++++++++++++++++---------- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/examples/fibonacci_test.go b/examples/fibonacci_test.go index 4a1f05db..50ff25e1 100644 --- a/examples/fibonacci_test.go +++ b/examples/fibonacci_test.go @@ -27,7 +27,7 @@ func Test_fibonacci(t *testing.T) { {in: 10, exp: 55}, {in: 5, exp: 5}, } { - ret, retTypes, err := vm.ExecExportedFunction("fib", uint64(c.in)) + ret, retTypes, err := vm.ExecExportedFunction("fibonacci", uint64(c.in)) require.NoError(t, err) require.Len(t, ret, len(retTypes)) require.Equal(t, wasm.ValueTypeI32, retTypes[0]) diff --git a/examples/wasm/fibonacci.go b/examples/wasm/fibonacci.go index f2842fb4..45dfe041 100644 --- a/examples/wasm/fibonacci.go +++ b/examples/wasm/fibonacci.go @@ -3,10 +3,10 @@ package main func main() {} -//export fib -func fib(in uint32) uint32 { +//export fibonacci +func fibonacci(in uint32) uint32 { if in <= 1 { return in } - return fib(in-1) + fib(in-2) + return fibonacci(in-1) + fibonacci(in-2) } diff --git a/examples/wasm/fibonacci.wasm b/examples/wasm/fibonacci.wasm index 99b4fef1bdd65177d5c8a137a9cfac863eac8d25..80ebd073d09162bc810c829d15c525ffb48b4322 100755 GIT binary patch delta 433 zcmca*@zY|$6vl%Sr-pNJre!AO=Ord5XKwr;z#+)O!oa}E!_LOQAX&h`z`({bS&-A4 zk!Nx&rxByXfl4_7_WT6QF{IhB~ delta 366 zcmexqam!-D6vo{Xr-rjIr)4H>{3gI5_=A~&fs==wje$Y3fPsPG7xQFsPH#qr$;q5X zj69R4an2SHU}0cjDhXo*s@MxuAu`#KOO#Q5ayXX)qtWCFt{9bbKqGkB^?*hQTLaZX zm<)n8Kw&1JhG#(f+2kKwx}5icEOr*=Kg^r;xC>Yr4JOYQuw*pYd{bZ>lOR7EGq(aO z4_gGQbQ-Hf1gr4m1;UbyCpYgBzR4`e0Ca7BUSe``re1o!9*{G6gLtCJH&%YVl+>is z^!S3(q`bu3)Z#}#`#@GQFxUcJbCHz+Q=@@I^5%6CNlcvA8CgJj7|&0Zl-?-`3J+dE z6l-!5GxHeQCV!OHXA8H~Gte`ftS+OenQWM7kZ5FRY;10kXku!SmXw-km}r`8Zk}Xp Q2&7VyQw=QAQVdKr0Upy|oB#j- diff --git a/wasm/vm_memory.go b/wasm/vm_memory.go index 9df2a191..3de556d2 100644 --- a/wasm/vm_memory.go +++ b/wasm/vm_memory.go @@ -141,6 +141,7 @@ func memoryGrow(vm *VirtualMachine) { uint64(n+uint32(len(vm.Memory)/vmPageSize)) > uint64(*(vm.InnerModule.SecMemory[0].Max)) { v := int32(-1) vm.OperandStack.Push(uint64(v)) + return } vm.OperandStack.Push(uint64(len(vm.Memory)) / vmPageSize) diff --git a/wasm/vm_memory_test.go b/wasm/vm_memory_test.go index 3920bf30..e14c602e 100644 --- a/wasm/vm_memory_test.go +++ b/wasm/vm_memory_test.go @@ -404,17 +404,36 @@ func Test_memorySize(t *testing.T) { } func Test_memoryGrow(t *testing.T) { - vm := &VirtualMachine{ - ActiveContext: &NativeFunctionContext{}, - Memory: make([]byte, vmPageSize*2), - OperandStack: NewVirtualMachineOperandStack(), - InnerModule: &Module{ - SecMemory: []*MemoryType{{}}, - }, - } + t.Run("ok", func(t *testing.T) { + vm := &VirtualMachine{ + ActiveContext: &NativeFunctionContext{}, + Memory: make([]byte, vmPageSize*2), + OperandStack: NewVirtualMachineOperandStack(), + InnerModule: &Module{ + SecMemory: []*MemoryType{{}}, + }, + } + + vm.OperandStack.Push(5) + memoryGrow(vm) + assert.Equal(t, uint64(0x2), vm.OperandStack.Pop()) + assert.Equal(t, 7, len(vm.Memory)/vmPageSize) + }) + + t.Run("oom", func(t *testing.T) { + vm := &VirtualMachine{ + ActiveContext: &NativeFunctionContext{}, + Memory: make([]byte, vmPageSize*2), + OperandStack: NewVirtualMachineOperandStack(), + InnerModule: &Module{ + SecMemory: []*MemoryType{{Max: uint32Ptr(0)}}, + }, + } + + exp := int32(-1) + vm.OperandStack.Push(5) + memoryGrow(vm) + assert.Equal(t, uint64(exp), vm.OperandStack.Pop()) + }) - vm.OperandStack.Push(5) - memoryGrow(vm) - assert.Equal(t, uint64(0x2), vm.OperandStack.Pop()) - assert.Equal(t, 7, len(vm.Memory)/vmPageSize) }