diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-02-24 14:33:36 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-02-25 18:22:02 +0100 |
| commit | 9fe8aa42c5bd11e2eb6952a16da6287205d7bf97 (patch) | |
| tree | 7cf636dd611cb2a338cfeba13607b8e152545f19 /prog/encoding.go | |
| parent | 2145057cb8a50aba1a27a67be19953bee9b164fd (diff) | |
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.
Diffstat (limited to 'prog/encoding.go')
| -rw-r--r-- | prog/encoding.go | 16 |
1 files changed, 15 insertions, 1 deletions
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 |
