@@ -19,6 +19,7 @@ package bind
1919import (
2020 "fmt"
2121 "regexp"
22+ "sync"
2223 "testing"
2324
2425 "github.com/ethereum/go-ethereum/common"
@@ -35,6 +36,26 @@ type linkTestCase struct {
3536 overrides map [string ]common.Address
3637}
3738
39+ func copyMetaData (m * MetaData ) * MetaData {
40+ m .mu .Lock ()
41+ defer m .mu .Unlock ()
42+ var deps []* MetaData
43+ if len (m .Deps ) > 0 {
44+ for _ , dep := range m .Deps {
45+ deps = append (deps , copyMetaData (dep ))
46+ }
47+ }
48+
49+ return & MetaData {
50+ Bin : m .Bin ,
51+ ABI : m .ABI ,
52+ Deps : deps ,
53+ Pattern : m .Pattern ,
54+ mu : sync.Mutex {},
55+ parsedABI : m .parsedABI ,
56+ }
57+ }
58+
3859func makeLinkTestCase (input map [rune ][]rune , overrides map [rune ]common.Address ) * linkTestCase {
3960 codes := make (map [string ]string )
4061 libCodes := make (map [string ]string )
@@ -103,14 +124,15 @@ func linkDeps(deps map[string]*MetaData) []*MetaData {
103124 roots [pattern ] = struct {}{}
104125 }
105126
106- connectedDeps := make (map [string ]MetaData )
127+ connectedDeps := make (map [string ]* MetaData )
107128 for pattern , dep := range deps {
108- connectedDeps [pattern ] = internalLinkDeps (* dep , deps , & roots ) //nolint:all
129+ connectedDeps [pattern ] = internalLinkDeps (dep , deps , & roots )
109130 }
110- rootMetadatas := []* MetaData {}
131+
132+ var rootMetadatas []* MetaData
111133 for pattern := range roots {
112- dep := connectedDeps [pattern ] //nolint:all
113- rootMetadatas = append (rootMetadatas , & dep )
134+ dep := connectedDeps [pattern ]
135+ rootMetadatas = append (rootMetadatas , dep )
114136 }
115137 return rootMetadatas
116138}
@@ -119,15 +141,15 @@ func linkDeps(deps map[string]*MetaData) []*MetaData {
119141// given the depMap (map of solidity link pattern to contract metadata object), deleting contract entries from the roots
120142// map if they were referenced as dependencies. It returns a new MetaData object which is the linked version of metadata
121143// parameter.
122- func internalLinkDeps (metadata MetaData , depMap map [string ]* MetaData , roots * map [string ]struct {}) MetaData { //nolint:all
123- linked := metadata //nolint:all
144+ func internalLinkDeps (metadata * MetaData , depMap map [string ]* MetaData , roots * map [string ]struct {}) * MetaData {
145+ linked := copyMetaData ( metadata )
124146 depPatterns := parseLibraryDeps (metadata .Bin )
125147 for _ , pattern := range depPatterns {
126148 delete (* roots , pattern )
127- connectedDep := internalLinkDeps (* depMap [pattern ], depMap , roots ) //nolint:all
128- linked .Deps = append (linked .Deps , & connectedDep )
149+ connectedDep := internalLinkDeps (depMap [pattern ], depMap , roots )
150+ linked .Deps = append (linked .Deps , connectedDep )
129151 }
130- return linked //nolint:all
152+ return linked
131153}
132154
133155func testLinkCase (tcInput linkTestCaseInput ) error {
0 commit comments