wazevo: supports for LookupFunction API (#1704)

Signed-off-by: Takeshi Yoneda <t.y.mathetake@gmail.com>
This commit is contained in:
Takeshi Yoneda
2023-09-13 12:36:56 +09:00
committed by GitHub
parent 9c4291a581
commit c9019e6406
9 changed files with 177 additions and 131 deletions

View File

@@ -16,6 +16,9 @@
//
// Note: These tests intentionally avoid using wasm.Store as it is important to know both the dependencies and
// the capabilities at the wasm.Engine abstraction.
//
// TODO: the purpose of enginetest overlaps with the purpose of internal/integration_test/engine. We should
// migrate there since the tests here are costly maintenance-wise.
package enginetest
import (
@@ -33,7 +36,6 @@ import (
"github.com/tetratelabs/wazero/internal/u64"
"github.com/tetratelabs/wazero/internal/wasm"
"github.com/tetratelabs/wazero/internal/wasmdebug"
"github.com/tetratelabs/wazero/internal/wasmruntime"
)
const (
@@ -235,89 +237,6 @@ func RunTestModuleEngineCallWithStack(t *testing.T, et EngineTester) {
})
}
func RunTestModuleEngineLookupFunction(t *testing.T, et EngineTester) {
e := et.NewEngine(api.CoreFeaturesV1)
mod := &wasm.Module{
TypeSection: []wasm.FunctionType{{}, {Params: []wasm.ValueType{wasm.ValueTypeV128}}},
FunctionSection: []wasm.Index{0, 0, 0},
CodeSection: []wasm.Code{
{
Body: []byte{wasm.OpcodeEnd},
}, {Body: []byte{wasm.OpcodeEnd}}, {Body: []byte{wasm.OpcodeEnd}},
},
}
err := e.CompileModule(testCtx, mod, nil, false)
require.NoError(t, err)
m := &wasm.ModuleInstance{
TypeIDs: []wasm.FunctionTypeID{0, 1},
Source: mod,
}
m.Tables = []*wasm.TableInstance{
{Min: 2, References: make([]wasm.Reference, 2), Type: wasm.RefTypeFuncref},
{Min: 2, References: make([]wasm.Reference, 2), Type: wasm.RefTypeExternref},
{Min: 10, References: make([]wasm.Reference, 10), Type: wasm.RefTypeFuncref},
}
me, err := e.NewModuleEngine(mod, m)
require.NoError(t, err)
linkModuleToEngine(m, me)
t.Run("null reference", func(t *testing.T) {
err = require.CapturePanic(func() {
m.LookupFunction(m.Tables[0], m.TypeIDs[0], 0) // offset 0 is not initialized yet.
})
require.Equal(t, wasmruntime.ErrRuntimeInvalidTableAccess, err)
err = require.CapturePanic(func() {
m.LookupFunction(m.Tables[0], m.TypeIDs[0], 1) // offset 1 is not initialized yet.
})
require.Equal(t, wasmruntime.ErrRuntimeInvalidTableAccess, err)
})
m.Tables[0].References[0] = me.FunctionInstanceReference(2)
m.Tables[0].References[1] = me.FunctionInstanceReference(0)
t.Run("initialized", func(t *testing.T) {
f1 := m.LookupFunction(m.Tables[0], m.TypeIDs[0], 0) // offset 0 is now initialized.
require.Equal(t, wasm.Index(2), f1.Definition().Index())
f2 := m.LookupFunction(m.Tables[0], m.TypeIDs[0], 1) // offset 1 is now initialized.
require.Equal(t, wasm.Index(0), f2.Definition().Index())
})
t.Run("out of range", func(t *testing.T) {
err = require.CapturePanic(func() {
me.LookupFunction(m.Tables[0], m.TypeIDs[0], 100 /* out of range */)
})
require.Equal(t, wasmruntime.ErrRuntimeInvalidTableAccess, err)
})
t.Run("access to externref table", func(t *testing.T) {
err := require.CapturePanic(func() {
m.LookupFunction(m.Tables[1], /* table[1] has externref type. */
m.TypeIDs[0], 0)
})
require.Equal(t, wasmruntime.ErrRuntimeInvalidTableAccess, err)
})
t.Run("access to externref table", func(t *testing.T) {
err = require.CapturePanic(func() {
me.LookupFunction(m.Tables[0], /* type mismatch */
m.TypeIDs[1], 0)
})
require.Equal(t, wasmruntime.ErrRuntimeIndirectCallTypeMismatch, err)
})
m.Tables[2].References[0] = me.FunctionInstanceReference(1)
m.Tables[2].References[5] = me.FunctionInstanceReference(2)
t.Run("initialized - tables[2]", func(t *testing.T) {
f1 := m.LookupFunction(m.Tables[2], m.TypeIDs[0], 0)
require.Equal(t, wasm.Index(1), f1.Definition().Index())
f2 := m.LookupFunction(m.Tables[2], m.TypeIDs[0], 5)
require.Equal(t, wasm.Index(2), f2.Definition().Index())
})
}
func runTestModuleEngineCallHostFnMem(t *testing.T, et EngineTester, readMem *wasm.Code) {
e := et.NewEngine(api.CoreFeaturesV1)
defer e.Close()
@@ -1188,7 +1107,10 @@ func setupCallTests(t *testing.T, e wasm.Engine, divBy *wasm.Code, fnlf experime
lns := buildFunctionListeners(fnlf, hostModule)
err := e.CompileModule(testCtx, hostModule, lns, false)
require.NoError(t, err)
host := &wasm.ModuleInstance{ModuleName: hostModule.NameSection.ModuleName, TypeIDs: []wasm.FunctionTypeID{0}}
host := &wasm.ModuleInstance{
ModuleName: hostModule.NameSection.ModuleName, TypeIDs: []wasm.FunctionTypeID{0},
Source: hostModule,
}
host.Exports = exportMap(hostModule)
hostME, err := e.NewModuleEngine(hostModule, host)
@@ -1223,6 +1145,7 @@ func setupCallTests(t *testing.T, e wasm.Engine, divBy *wasm.Code, fnlf experime
require.NoError(t, err)
imported := &wasm.ModuleInstance{
Source: importedModule,
ModuleName: importedModule.NameSection.ModuleName, TypeIDs: []wasm.FunctionTypeID{0},
}
imported.Exports = exportMap(importedModule)
@@ -1256,7 +1179,10 @@ func setupCallTests(t *testing.T, e wasm.Engine, divBy *wasm.Code, fnlf experime
require.NoError(t, err)
// Add the exported function.
importing := &wasm.ModuleInstance{ModuleName: importingModule.NameSection.ModuleName, TypeIDs: []wasm.FunctionTypeID{0}}
importing := &wasm.ModuleInstance{
ModuleName: importingModule.NameSection.ModuleName, TypeIDs: []wasm.FunctionTypeID{0},
Source: importingModule,
}
importing.Exports = exportMap(importingModule)
// Compile the importing module