`Runtime.WithMemoryCapacityPages` is a function that determines memory
capacity in pages (65536 bytes per page). The inputs are the min and
possibly nil max defined by the module, and the default is to return
the min.
Ex. To set capacity to max when exists:
```golang
c.WithMemoryCapacityPages(func(minPages uint32, maxPages *uint32) uint32 {
if maxPages != nil {
return *maxPages
}
return minPages
})
```
Note: This applies at compile time, ModuleBuilder.Build or Runtime.CompileModule.
Fixes #500
Signed-off-by: Adrian Cole <adrian@tetrate.io>
162 lines
3.5 KiB
Go
162 lines
3.5 KiB
Go
package binary
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/tetratelabs/wazero/internal/testing/require"
|
|
"github.com/tetratelabs/wazero/internal/wasm"
|
|
)
|
|
|
|
func TestEncodeImport(t *testing.T) {
|
|
ptrOfUint32 := func(v uint32) *uint32 {
|
|
return &v
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
input *wasm.Import
|
|
expected []byte
|
|
}{
|
|
{
|
|
name: "func no module, no name, type index 0",
|
|
input: &wasm.Import{ // Ex. (import "" "" (func (type 0)))
|
|
Type: wasm.ExternTypeFunc,
|
|
Module: "",
|
|
Name: "",
|
|
DescFunc: 0,
|
|
},
|
|
expected: []byte{wasm.ExternTypeFunc, 0x00, 0x00, 0x00},
|
|
},
|
|
{
|
|
name: "func module, no name, type index 0",
|
|
input: &wasm.Import{ // Ex. (import "$test" "" (func (type 0)))
|
|
Type: wasm.ExternTypeFunc,
|
|
Module: "test",
|
|
Name: "",
|
|
DescFunc: 0,
|
|
},
|
|
expected: []byte{
|
|
0x04, 't', 'e', 's', 't',
|
|
0x00,
|
|
wasm.ExternTypeFunc,
|
|
0x00,
|
|
},
|
|
},
|
|
{
|
|
name: "func module, name, type index 0",
|
|
input: &wasm.Import{ // Ex. (import "$math" "$pi" (func (type 0)))
|
|
Type: wasm.ExternTypeFunc,
|
|
Module: "math",
|
|
Name: "pi",
|
|
DescFunc: 0,
|
|
},
|
|
expected: []byte{
|
|
0x04, 'm', 'a', 't', 'h',
|
|
0x02, 'p', 'i',
|
|
wasm.ExternTypeFunc,
|
|
0x00,
|
|
},
|
|
},
|
|
{
|
|
name: "func module, name, type index 10",
|
|
input: &wasm.Import{ // Ex. (import "$math" "$pi" (func (type 10)))
|
|
Type: wasm.ExternTypeFunc,
|
|
Module: "math",
|
|
Name: "pi",
|
|
DescFunc: 10,
|
|
},
|
|
expected: []byte{
|
|
0x04, 'm', 'a', 't', 'h',
|
|
0x02, 'p', 'i',
|
|
wasm.ExternTypeFunc,
|
|
0x0a,
|
|
},
|
|
},
|
|
{
|
|
name: "global const",
|
|
input: &wasm.Import{
|
|
Type: wasm.ExternTypeGlobal,
|
|
Module: "math",
|
|
Name: "pi",
|
|
DescGlobal: &wasm.GlobalType{ValType: wasm.ValueTypeF64},
|
|
},
|
|
expected: []byte{
|
|
0x04, 'm', 'a', 't', 'h',
|
|
0x02, 'p', 'i',
|
|
wasm.ExternTypeGlobal,
|
|
wasm.ValueTypeF64, 0x00, // 0 == const
|
|
},
|
|
},
|
|
{
|
|
name: "global var",
|
|
input: &wasm.Import{
|
|
Type: wasm.ExternTypeGlobal,
|
|
Module: "math",
|
|
Name: "pi",
|
|
DescGlobal: &wasm.GlobalType{ValType: wasm.ValueTypeF64, Mutable: true},
|
|
},
|
|
expected: []byte{
|
|
0x04, 'm', 'a', 't', 'h',
|
|
0x02, 'p', 'i',
|
|
wasm.ExternTypeGlobal,
|
|
wasm.ValueTypeF64, 0x01, // 1 == var
|
|
},
|
|
},
|
|
{
|
|
name: "table",
|
|
input: &wasm.Import{
|
|
Type: wasm.ExternTypeTable,
|
|
Module: "my",
|
|
Name: "table",
|
|
DescTable: &wasm.Table{Min: 1, Max: ptrOfUint32(2)},
|
|
},
|
|
expected: []byte{
|
|
0x02, 'm', 'y',
|
|
0x05, 't', 'a', 'b', 'l', 'e',
|
|
wasm.ExternTypeTable,
|
|
wasm.RefTypeFuncref,
|
|
0x1, 0x1, 0x2, // Limit with max.
|
|
},
|
|
},
|
|
{
|
|
name: "memory",
|
|
input: &wasm.Import{
|
|
Type: wasm.ExternTypeMemory,
|
|
Module: "my",
|
|
Name: "memory",
|
|
DescMem: &wasm.Memory{Min: 1, Max: 2, IsMaxEncoded: true},
|
|
},
|
|
expected: []byte{
|
|
0x02, 'm', 'y',
|
|
0x06, 'm', 'e', 'm', 'o', 'r', 'y',
|
|
wasm.ExternTypeMemory,
|
|
0x1, 0x1, 0x2, // Limit with max.
|
|
},
|
|
},
|
|
{
|
|
name: "memory - defaultt max",
|
|
input: &wasm.Import{
|
|
Type: wasm.ExternTypeMemory,
|
|
Module: "my",
|
|
Name: "memory",
|
|
DescMem: &wasm.Memory{Min: 1, Max: wasm.MemoryLimitPages, IsMaxEncoded: false},
|
|
},
|
|
expected: []byte{
|
|
0x02, 'm', 'y',
|
|
0x06, 'm', 'e', 'm', 'o', 'r', 'y',
|
|
wasm.ExternTypeMemory,
|
|
0x0, 0x1, // Limit without max.
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
tc := tt
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
bytes := encodeImport(tc.input)
|
|
require.Equal(t, tc.expected, bytes)
|
|
})
|
|
}
|
|
}
|