diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2023-02-13 20:36:16 +0100 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2023-02-14 14:56:49 +0100 |
| commit | 68f80dec7aa2d7c4ae909b4b3eb0953bc3990701 (patch) | |
| tree | e67c30b44eccdf99ffdac459dc3d287a6a8ed37f /prog/clone.go | |
| parent | 9db88265dbce82f690f9b166b24bba1570d15854 (diff) | |
prog: add a new DupCallCollide collide type
It duplicates random calls in a program and makes the duplicated copies
async.
E.g. it could transform
r0 = test()
test2(r0)
to
r0 = test()
test2(r0) (async)
test2(r0)
or
test() (async)
r0 = test()
test2(r0)
Diffstat (limited to 'prog/clone.go')
| -rw-r--r-- | prog/clone.go | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/prog/clone.go b/prog/clone.go index 9fa660e67..029cf94c4 100644 --- a/prog/clone.go +++ b/prog/clone.go @@ -20,21 +20,25 @@ func (p *Prog) Clone() *Prog { func cloneCalls(origCalls []*Call, newargs map[*ResultArg]*ResultArg) []*Call { calls := make([]*Call, len(origCalls)) for ci, c := range origCalls { - c1 := new(Call) - c1.Meta = c.Meta - if c.Ret != nil { - 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) - } - c1.Props = c.Props - calls[ci] = c1 + calls[ci] = cloneCall(c, newargs) } return calls } +func cloneCall(c *Call, newargs map[*ResultArg]*ResultArg) *Call { + c1 := new(Call) + c1.Meta = c.Meta + if c.Ret != nil { + 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) + } + c1.Props = c.Props + return c1 +} + func clone(arg Arg, newargs map[*ResultArg]*ResultArg) Arg { var arg1 Arg switch a := arg.(type) { |
