aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--prog/clone.go5
-rw-r--r--prog/rand.go13
2 files changed, 12 insertions, 6 deletions
diff --git a/prog/clone.go b/prog/clone.go
index 4523be0eb..6ec28e39e 100644
--- a/prog/clone.go
+++ b/prog/clone.go
@@ -8,7 +8,10 @@ import (
)
func (p *Prog) Clone() *Prog {
- newargs := make(map[*ResultArg]*ResultArg)
+ return p.cloneWithMap(make(map[*ResultArg]*ResultArg))
+}
+
+func (p *Prog) cloneWithMap(newargs map[*ResultArg]*ResultArg) *Prog {
p1 := &Prog{
Target: p.Target,
Calls: cloneCalls(p.Calls, newargs),
diff --git a/prog/rand.go b/prog/rand.go
index 742dbaa7c..0e3727c7f 100644
--- a/prog/rand.go
+++ b/prog/rand.go
@@ -943,12 +943,15 @@ func (r *randGen) resourceCentric(s *state, t *ResourceType, dir Dir) (arg Arg,
var p *Prog
var resource *ResultArg
for _, idx := range r.Perm(len(s.corpus)) {
- p = s.corpus[idx].Clone()
- resources := getCompatibleResources(p, t.TypeName, r)
- if len(resources) > 0 {
- resource = resources[r.Intn(len(resources))]
- break
+ corpusProg := s.corpus[idx]
+ resources := getCompatibleResources(corpusProg, t.TypeName, r)
+ if len(resources) == 0 {
+ continue
}
+ argMap := make(map[*ResultArg]*ResultArg)
+ p = corpusProg.cloneWithMap(argMap)
+ resource = argMap[resources[r.Intn(len(resources))]]
+ break
}
// No compatible resource was found.