From 68f80dec7aa2d7c4ae909b4b3eb0953bc3990701 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Mon, 13 Feb 2023 20:36:16 +0100 Subject: 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) --- prog/clone.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) (limited to 'prog/clone.go') 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) { -- cgit mrf-deployment