aboutsummaryrefslogtreecommitdiffstats
path: root/prog/encoding.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-10-29 10:24:21 +0200
committerDmitry Vyukov <dvyukov@google.com>2016-11-11 14:29:52 -0800
commit1a85811d68e1f3870a4c71c170f014a8a5cc60b1 (patch)
tree5920f2684a99204ce255cfcb1fd4e9a3acdd6514 /prog/encoding.go
parentc35c72f06c58f0b40980b0410c8a0fd513c3a892 (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.go30
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')