accounts/abi/bind/v2: remove instances copying of MetaData in contract linking test

This commit is contained in:
Jared Wasinger 2025-01-29 14:43:09 -08:00
parent 47784b98b1
commit a4480b2db3

View file

@ -19,6 +19,7 @@ package bind
import ( import (
"fmt" "fmt"
"regexp" "regexp"
"sync"
"testing" "testing"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
@ -35,6 +36,26 @@ type linkTestCase struct {
overrides map[string]common.Address overrides map[string]common.Address
} }
func copyMetaData(m *MetaData) *MetaData {
m.mu.Lock()
defer m.mu.Unlock()
var deps []*MetaData
if len(m.Deps) > 0 {
for _, dep := range m.Deps {
deps = append(deps, copyMetaData(dep))
}
}
return &MetaData{
Bin: m.Bin,
ABI: m.ABI,
Deps: deps,
Pattern: m.Pattern,
mu: sync.Mutex{},
parsedABI: m.parsedABI,
}
}
func makeLinkTestCase(input map[rune][]rune, overrides map[rune]common.Address) *linkTestCase { func makeLinkTestCase(input map[rune][]rune, overrides map[rune]common.Address) *linkTestCase {
codes := make(map[string]string) codes := make(map[string]string)
libCodes := make(map[string]string) libCodes := make(map[string]string)
@ -103,14 +124,15 @@ func linkDeps(deps map[string]*MetaData) []*MetaData {
roots[pattern] = struct{}{} roots[pattern] = struct{}{}
} }
connectedDeps := make(map[string]MetaData) connectedDeps := make(map[string]*MetaData)
for pattern, dep := range deps { for pattern, dep := range deps {
connectedDeps[pattern] = internalLinkDeps(*dep, deps, &roots) //nolint:all connectedDeps[pattern] = internalLinkDeps(dep, deps, &roots)
} }
rootMetadatas := []*MetaData{}
var rootMetadatas []*MetaData
for pattern := range roots { for pattern := range roots {
dep := connectedDeps[pattern] //nolint:all dep := connectedDeps[pattern]
rootMetadatas = append(rootMetadatas, &dep) rootMetadatas = append(rootMetadatas, dep)
} }
return rootMetadatas return rootMetadatas
} }
@ -119,15 +141,15 @@ func linkDeps(deps map[string]*MetaData) []*MetaData {
// given the depMap (map of solidity link pattern to contract metadata object), deleting contract entries from the roots // given the depMap (map of solidity link pattern to contract metadata object), deleting contract entries from the roots
// map if they were referenced as dependencies. It returns a new MetaData object which is the linked version of metadata // map if they were referenced as dependencies. It returns a new MetaData object which is the linked version of metadata
// parameter. // parameter.
func internalLinkDeps(metadata MetaData, depMap map[string]*MetaData, roots *map[string]struct{}) MetaData { //nolint:all func internalLinkDeps(metadata *MetaData, depMap map[string]*MetaData, roots *map[string]struct{}) *MetaData {
linked := metadata //nolint:all linked := copyMetaData(metadata)
depPatterns := parseLibraryDeps(metadata.Bin) depPatterns := parseLibraryDeps(metadata.Bin)
for _, pattern := range depPatterns { for _, pattern := range depPatterns {
delete(*roots, pattern) delete(*roots, pattern)
connectedDep := internalLinkDeps(*depMap[pattern], depMap, roots) //nolint:all connectedDep := internalLinkDeps(depMap[pattern], depMap, roots)
linked.Deps = append(linked.Deps, &connectedDep) linked.Deps = append(linked.Deps, connectedDep)
} }
return linked //nolint:all return linked
} }
func testLinkCase(tcInput linkTestCaseInput) error { func testLinkCase(tcInput linkTestCaseInput) error {