From 68faa5258297b6ba1a167e8233e59ca2c6b2b995 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Wed, 25 Jul 2018 14:46:59 +0200 Subject: prog: parse comments in serialized programs Remember per-call comments, will be useful for annotating tests. Also support this form: call() # comment --- prog/encoding.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'prog/encoding.go') diff --git a/prog/encoding.go b/prog/encoding.go index f0d96da95..8c853fa4a 100644 --- a/prog/encoding.go +++ b/prog/encoding.go @@ -9,6 +9,7 @@ import ( "encoding/hex" "fmt" "strconv" + "strings" ) // String generates a very compact program description (mostly for debug output). @@ -156,8 +157,14 @@ func (target *Target) Deserialize(data []byte) (prog *Prog, err error) { } p := newParser(data) vars := make(map[string]*ResultArg) + comment := "" for p.Scan() { - if p.EOF() || p.Char() == '#' { + if p.EOF() { + comment = "" + continue + } + if p.Char() == '#' { + comment = strings.TrimSpace(p.s[p.i+1:]) continue } name := p.Ident() @@ -173,8 +180,9 @@ func (target *Target) Deserialize(data []byte) (prog *Prog, err error) { return nil, fmt.Errorf("unknown syscall %v", name) } c := &Call{ - Meta: meta, - Ret: MakeReturnArg(meta.Ret), + Meta: meta, + Ret: MakeReturnArg(meta.Ret), + Comment: comment, } prog.Calls = append(prog.Calls, c) p.Parse('(') @@ -197,8 +205,12 @@ func (target *Target) Deserialize(data []byte) (prog *Prog, err error) { } } p.Parse(')') + p.SkipWs() if !p.EOF() { - return nil, fmt.Errorf("tailing data (line #%v)", p.l) + if p.Char() != '#' { + return nil, fmt.Errorf("tailing data (line #%v)", p.l) + } + c.Comment = strings.TrimSpace(p.s[p.i+1:]) } for i := len(c.Args); i < len(meta.Args); i++ { c.Args = append(c.Args, target.defaultArg(meta.Args[i])) @@ -209,6 +221,7 @@ func (target *Target) Deserialize(data []byte) (prog *Prog, err error) { if r != "" && c.Ret != nil { vars[r] = c.Ret } + comment = "" } if err := p.Err(); err != nil { return nil, err -- cgit mrf-deployment