From 9fe8aa42c5bd11e2eb6952a16da6287205d7bf97 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sat, 24 Feb 2018 14:33:36 +0100 Subject: prog: add arbitrary mutation of complex structs Squash complex structs into flat byte array and mutate this array with generic blob mutations. This allows to mutate what we currently consider as paddings and add/remove paddings from structs, etc. --- prog/encoding.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'prog/encoding.go') diff --git a/prog/encoding.go b/prog/encoding.go index 38f24f8fa..6c8fda993 100644 --- a/prog/encoding.go +++ b/prog/encoding.go @@ -72,8 +72,11 @@ func (target *Target) serialize(arg Arg, buf *bytes.Buffer, vars map[Arg]int, va break } fmt.Fprintf(buf, "&%v", target.serializeAddr(a)) - if a.Res == nil || !target.isDefaultArg(a.Res) { + if a.Res == nil || !target.isDefaultArg(a.Res) || target.isAnyPtr(a.Type()) { fmt.Fprintf(buf, "=") + if target.isAnyPtr(a.Type()) { + fmt.Fprintf(buf, "ANY=") + } target.serialize(a.Res, buf, vars, varSeq) } case *DataArg: @@ -296,6 +299,17 @@ func (target *Target) parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, e var inner Arg if p.Char() == '=' { p.Parse('=') + if p.Char() == 'A' { + p.Parse('A') + p.Parse('N') + p.Parse('Y') + p.Parse('=') + if typ.Size() == 0 { + panic(fmt.Sprintf("TYPESIZE=0: %#v", typ)) + } + typ = target.makeAnyPtrType(typ.Size(), typ.FieldName()) + typ1 = target.anyArray + } inner, err = target.parseArg(typ1, p, vars) if err != nil { return nil, err -- cgit mrf-deployment