aboutsummaryrefslogtreecommitdiffstats
path: root/prog/clone.go
diff options
context:
space:
mode:
Diffstat (limited to 'prog/clone.go')
-rw-r--r--prog/clone.go29
1 files changed, 13 insertions, 16 deletions
diff --git a/prog/clone.go b/prog/clone.go
index e7d937318..51d801e28 100644
--- a/prog/clone.go
+++ b/prog/clone.go
@@ -8,11 +8,11 @@ func (p *Prog) Clone() *Prog {
Target: p.Target,
Calls: make([]*Call, len(p.Calls)),
}
- newargs := make(map[Arg]Arg)
+ newargs := make(map[*ResultArg]*ResultArg)
for ci, c := range p.Calls {
c1 := new(Call)
c1.Meta = c.Meta
- c1.Ret = clone(c.Ret, newargs)
+ c1.Ret = clone(c.Ret, newargs).(*ResultArg)
c1.Args = make([]Arg, len(c.Args))
for ai, arg := range c.Args {
c1.Args[ai] = clone(arg, newargs)
@@ -27,7 +27,7 @@ func (p *Prog) Clone() *Prog {
return p1
}
-func clone(arg Arg, newargs map[Arg]Arg) Arg {
+func clone(arg Arg, newargs map[*ResultArg]*ResultArg) Arg {
var arg1 Arg
switch a := arg.(type) {
case *ConstArg:
@@ -63,21 +63,18 @@ func clone(arg Arg, newargs map[Arg]Arg) Arg {
a1 := new(ResultArg)
*a1 = *a
arg1 = a1
+ if a1.Res != nil {
+ r := newargs[a1.Res]
+ a1.Res = r
+ if r.uses == nil {
+ r.uses = make(map[*ResultArg]bool)
+ }
+ r.uses[a1] = true
+ }
+ a1.uses = nil // filled when we clone the referent
+ newargs[a] = a1
default:
panic("bad arg kind")
}
- if user, ok := arg1.(ArgUser); ok && *user.Uses() != nil {
- r := newargs[*user.Uses()]
- *user.Uses() = r
- used := r.(ArgUsed)
- if *used.Used() == nil {
- *used.Used() = make(map[Arg]bool)
- }
- (*used.Used())[arg1] = true
- }
- if used, ok := arg1.(ArgUsed); ok {
- *used.Used() = nil // filled when we clone the referent
- newargs[arg] = arg1
- }
return arg1
}