diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-09-14 19:25:01 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-09-15 16:02:37 +0200 |
| commit | 52a33fd516102a98d3753bf69417235b655a68dc (patch) | |
| tree | 351ab73db934d3b4e4babbe27e8801c659f2631b /prog/encoding.go | |
| parent | 25f4fe0662f7f3b390d16b2e786f2ba0aa0293f1 (diff) | |
prog: remove default target and all global state
Now each prog function accepts the desired target explicitly.
No global, implicit state involved.
This is much cleaner and allows cross-OS/arch testing, etc.
Diffstat (limited to 'prog/encoding.go')
| -rw-r--r-- | prog/encoding.go | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/prog/encoding.go b/prog/encoding.go index a6ded73ca..c140b89d6 100644 --- a/prog/encoding.go +++ b/prog/encoding.go @@ -121,8 +121,10 @@ func serialize(arg Arg, buf io.Writer, vars map[Arg]int, varSeq *int) { } } -func Deserialize(data []byte) (prog *Prog, err error) { - prog = new(Prog) +func (target *Target) Deserialize(data []byte) (prog *Prog, err error) { + prog = &Prog{ + Target: target, + } p := &parser{r: bufio.NewScanner(bytes.NewReader(data))} p.r.Buffer(nil, maxLineLen) vars := make(map[string]Arg) @@ -138,7 +140,7 @@ func Deserialize(data []byte) (prog *Prog, err error) { name = p.Ident() } - meta := SyscallMap[name] + meta := target.SyscallMap[name] if meta == nil { return nil, fmt.Errorf("unknown syscall %v", name) } @@ -156,7 +158,7 @@ func Deserialize(data []byte) (prog *Prog, err error) { if IsPad(typ) { return nil, fmt.Errorf("padding in syscall %v arguments", name) } - arg, err := parseArg(typ, p, vars) + arg, err := target.parseArg(typ, p, vars) if err != nil { return nil, err } @@ -193,7 +195,7 @@ func Deserialize(data []byte) (prog *Prog, err error) { return } -func parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, error) { +func (target *Target) parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, error) { r := "" if p.Char() == '<' { p.Parse('<') @@ -261,7 +263,7 @@ func parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, error) { return nil, err } p.Parse('=') - inner, err := parseArg(typ1, p, vars) + inner, err := target.parseArg(typ1, p, vars) if err != nil { return nil, err } @@ -273,7 +275,7 @@ func parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, error) { if err != nil { return nil, err } - arg = MakeConstArg(typ, pages*pageSize) + arg = MakeConstArg(typ, pages*target.PageSize) case '"': p.Parse('"') val := "" @@ -301,7 +303,7 @@ func parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, error) { if IsPad(fld) { inner = append(inner, MakeConstArg(fld, 0)) } else { - arg, err := parseArg(fld, p, vars) + arg, err := target.parseArg(fld, p, vars) if err != nil { return nil, err } @@ -324,7 +326,7 @@ func parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, error) { p.Parse('[') var inner []Arg for i := 0; p.Char() != ']'; i++ { - arg, err := parseArg(t1.Type, p, vars) + arg, err := target.parseArg(t1.Type, p, vars) if err != nil { return nil, err } @@ -353,7 +355,7 @@ func parseArg(typ Type, p *parser, vars map[string]Arg) (Arg, error) { if optType == nil { return nil, fmt.Errorf("union arg %v has unknown option: %v", typ.Name(), name) } - opt, err := parseArg(optType, p, vars) + opt, err := target.parseArg(optType, p, vars) if err != nil { return nil, err } |
