aboutsummaryrefslogtreecommitdiffstats
path: root/prog/clone.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2023-02-13 20:36:16 +0100
committerAleksandr Nogikh <wp32pw@gmail.com>2023-02-14 14:56:49 +0100
commit68f80dec7aa2d7c4ae909b4b3eb0953bc3990701 (patch)
treee67c30b44eccdf99ffdac459dc3d287a6a8ed37f /prog/clone.go
parent9db88265dbce82f690f9b166b24bba1570d15854 (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.go26
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) {