aboutsummaryrefslogtreecommitdiffstats
path: root/prog/clone.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-05-05 10:13:04 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-05-05 10:13:04 +0200
commit9dfb5efa91fc0f051a1ddc88ace2867bb6b32275 (patch)
tree6957d2852c869a559d1127d297d80ffc191ae292 /prog/clone.go
parent5ca897bd501e4b9a3a1b130bc9ec95243a4804a0 (diff)
prog: simplify code
Now that we don't have ReturnArg and only ResultArg's refer to other ResultArg's we can remove ArgUser/ArgUsed and devirtualize lots of code.
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
}