Merge pull request #21 from Gaboose/fix-table-index-bug
Fix table index bug
This commit is contained in:
@@ -121,6 +121,14 @@ func (m *Module) buildIndexSpaces(externModules map[string]*Module) error {
|
||||
|
||||
func (m *Module) resolveImports(externModules map[string]*Module) error {
|
||||
for _, is := range m.SecImports {
|
||||
if err := m.resolveImport(is, externModules); err != nil {
|
||||
return fmt.Errorf("%s: %w", is.Name, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Module) resolveImport(is *ImportSegment, externModules map[string]*Module) error {
|
||||
em, ok := externModules[is.Module]
|
||||
if !ok {
|
||||
return fmt.Errorf("failed to resolve import of module name %s", is.Module)
|
||||
@@ -128,7 +136,7 @@ func (m *Module) resolveImports(externModules map[string]*Module) error {
|
||||
|
||||
es, ok := em.SecExports[is.Name]
|
||||
if !ok {
|
||||
return fmt.Errorf("%s not exported in module %s", is.Name, is.Module)
|
||||
return fmt.Errorf("not exported in module %s", is.Module)
|
||||
}
|
||||
|
||||
if is.Desc.Kind != es.Desc.Kind {
|
||||
@@ -154,7 +162,7 @@ func (m *Module) resolveImports(externModules map[string]*Module) error {
|
||||
default:
|
||||
return fmt.Errorf("invalid kind of import: %#x", is.Desc.Kind)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -318,13 +326,13 @@ func (m *Module) buildTableIndexSpace() error {
|
||||
if size > len(table) {
|
||||
next := make([]*uint32, size)
|
||||
copy(next, table)
|
||||
for i, b := range elem.Init {
|
||||
next[i+offset] = &b
|
||||
for i := range elem.Init {
|
||||
next[i+offset] = &elem.Init[i]
|
||||
}
|
||||
m.IndexSpace.Table[elem.TableIndex] = next
|
||||
} else {
|
||||
for i, b := range elem.Init {
|
||||
table[i+offset] = &b
|
||||
for i := range elem.Init {
|
||||
table[i+offset] = &elem.Init[i]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -506,6 +506,23 @@ func TestModule_buildTableIndexSpace(t *testing.T) {
|
||||
},
|
||||
exp: [][]*uint32{{nil, uint32Ptr(0x01), nil}},
|
||||
},
|
||||
{
|
||||
m: &Module{
|
||||
SecElements: []*ElementSegment{{
|
||||
TableIndex: 0,
|
||||
OffsetExpr: &ConstantExpression{
|
||||
optCode: OptCodeI32Const,
|
||||
data: []byte{0x0},
|
||||
},
|
||||
Init: []uint32{0x1, 0x2},
|
||||
}},
|
||||
SecTables: []*TableType{{Limit: &LimitsType{}}},
|
||||
IndexSpace: &ModuleIndexSpace{
|
||||
Table: [][]*uint32{{}},
|
||||
},
|
||||
},
|
||||
exp: [][]*uint32{{uint32Ptr(0x01), uint32Ptr(0x02)}},
|
||||
},
|
||||
} {
|
||||
require.NoError(t, c.m.buildTableIndexSpace())
|
||||
require.Len(t, c.m.IndexSpace.Table, len(c.exp))
|
||||
|
||||
Reference in New Issue
Block a user