diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2016-10-29 10:24:21 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2016-11-11 14:29:52 -0800 |
| commit | 1a85811d68e1f3870a4c71c170f014a8a5cc60b1 (patch) | |
| tree | 5920f2684a99204ce255cfcb1fd4e9a3acdd6514 /prog/encoding.go | |
| parent | c35c72f06c58f0b40980b0410c8a0fd513c3a892 (diff) | |
prog: assign types to args during construction
Eliminate assignTypeAndDir function and instead assign
types to all args during construction.
This will allow considerable simplifation of assignSizes.
Diffstat (limited to 'prog/encoding.go')
| -rw-r--r-- | prog/encoding.go | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/prog/encoding.go b/prog/encoding.go index d99f42f6f..7afe218be 100644 --- a/prog/encoding.go +++ b/prog/encoding.go @@ -137,7 +137,10 @@ func Deserialize(data []byte) (prog *Prog, err error) { if meta == nil { return nil, fmt.Errorf("unknown syscall %v", name) } - c := &Call{Meta: meta} + c := &Call{ + Meta: meta, + Ret: returnArg(meta.Ret), + } prog.Calls = append(prog.Calls, c) p.Parse('(') for i := 0; p.Char() != ')'; i++ { @@ -164,9 +167,6 @@ func Deserialize(data []byte) (prog *Prog, err error) { if len(c.Args) != len(meta.Args) { return nil, fmt.Errorf("wrong call arg count: %v, want %v", len(c.Args), len(meta.Args)) } - if err := assignTypeAndDir(c); err != nil { - return nil, err - } if r != "" { vars[r] = c.Ret } @@ -196,14 +196,14 @@ func parseArg(typ sys.Type, p *parser, vars map[string]*Arg) (*Arg, error) { if err != nil { return nil, fmt.Errorf("wrong arg value '%v': %v", val, err) } - arg = constArg(uintptr(v)) + arg = constArg(typ, uintptr(v)) case 'r': id := p.Ident() v, ok := vars[id] if !ok || v == nil { return nil, fmt.Errorf("result %v references unknown variable (vars=%+v)", id, vars) } - arg = resultArg(v) + arg = resultArg(typ, v) if p.Char() == '/' { p.Parse('/') op := p.Ident() @@ -241,13 +241,13 @@ func parseArg(typ sys.Type, p *parser, vars map[string]*Arg) (*Arg, error) { if err != nil { return nil, err } - arg = pointerArg(page, off, size, inner) + arg = pointerArg(typ, page, off, size, inner) case '(': page, off, _, err := parseAddr(p, false) if err != nil { return nil, err } - arg = pageSizeArg(page, off) + arg = pageSizeArg(typ, page, off) case '"': p.Parse('"') val := "" @@ -259,7 +259,7 @@ func parseArg(typ sys.Type, p *parser, vars map[string]*Arg) (*Arg, error) { if err != nil { return nil, fmt.Errorf("data arg has bad value '%v'", val) } - arg = dataArg(data) + arg = dataArg(typ, data) case '{': t1, ok := typ.(*sys.StructType) if !ok { @@ -273,7 +273,7 @@ func parseArg(typ sys.Type, p *parser, vars map[string]*Arg) (*Arg, error) { } fld := t1.Fields[i] if sys.IsPad(fld) { - inner = append(inner, constArg(0)) + inner = append(inner, constArg(fld, 0)) } else { arg, err := parseArg(fld, p, vars) if err != nil { @@ -286,10 +286,10 @@ func parseArg(typ sys.Type, p *parser, vars map[string]*Arg) (*Arg, error) { } } p.Parse('}') - if sys.IsPad(t1.Fields[len(t1.Fields)-1]) { - inner = append(inner, constArg(0)) + if last := t1.Fields[len(t1.Fields)-1]; sys.IsPad(last) { + inner = append(inner, constArg(last, 0)) } - arg = groupArg(inner) + arg = groupArg(typ, inner) case '[': t1, ok := typ.(*sys.ArrayType) if !ok { @@ -308,7 +308,7 @@ func parseArg(typ sys.Type, p *parser, vars map[string]*Arg) (*Arg, error) { } } p.Parse(']') - arg = groupArg(inner) + arg = groupArg(typ, inner) case '@': t1, ok := typ.(*sys.UnionType) if !ok { @@ -331,7 +331,7 @@ func parseArg(typ sys.Type, p *parser, vars map[string]*Arg) (*Arg, error) { if err != nil { return nil, err } - arg = unionArg(opt, optType) + arg = unionArg(typ, opt, optType) case 'n': p.Parse('n') p.Parse('i') |
