diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-05-05 10:13:04 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-05-05 10:13:04 +0200 |
| commit | 9dfb5efa91fc0f051a1ddc88ace2867bb6b32275 (patch) | |
| tree | 6957d2852c869a559d1127d297d80ffc191ae292 /prog/clone.go | |
| parent | 5ca897bd501e4b9a3a1b130bc9ec95243a4804a0 (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.go | 29 |
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 } |
