From 9dfb5efa91fc0f051a1ddc88ace2867bb6b32275 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sat, 5 May 2018 10:13:04 +0200 Subject: 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. --- prog/clone.go | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) (limited to 'prog/clone.go') 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 } -- cgit mrf-deployment