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 99b4fef1..80ebd073 100755 Binary files a/examples/wasm/fibonacci.wasm and b/examples/wasm/fibonacci.wasm differ 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) }