compiler: walk over functions in reproducible order, fix #3219

It affects both Debug data and bindings, otherwise two unnamed structures can
get any of unnamed/unnamedx names depending on particular invocation.

Signed-off-by: Roman Khimov <roman@nspcc.ru>
This commit is contained in:
Roman Khimov 2023-11-23 13:11:12 +03:00
parent 25ef2c7f16
commit 341d978e5b

View file

@ -203,18 +203,19 @@ func (c *codegen) emitDebugInfo(contract []byte) *DebugInfo {
}) })
} }
start := len(d.Methods) var fnames = make([]string, 0, len(c.funcs))
d.NamedTypes = make(map[string]binding.ExtendedType)
for name, scope := range c.funcs { for name, scope := range c.funcs {
if scope.rng.Start == scope.rng.End { if scope.rng.Start == scope.rng.End {
continue continue
} }
m := c.methodInfoFromScope(name, scope, d.NamedTypes) fnames = append(fnames, name)
}
sort.Strings(fnames)
d.NamedTypes = make(map[string]binding.ExtendedType)
for _, name := range fnames {
m := c.methodInfoFromScope(name, c.funcs[name], d.NamedTypes)
d.Methods = append(d.Methods, *m) d.Methods = append(d.Methods, *m)
} }
sort.Slice(d.Methods[start:], func(i, j int) bool {
return d.Methods[start+i].Name.Name < d.Methods[start+j].Name.Name
})
d.EmittedEvents = c.emittedEvents d.EmittedEvents = c.emittedEvents
d.InvokedContracts = c.invokedContracts d.InvokedContracts = c.invokedContracts
return d return d