aboutsummaryrefslogtreecommitdiffstats
path: root/prog/encoding.go
diff options
context:
space:
mode:
authorNecip Fazil Yildiran <necip@google.com>2020-08-10 14:43:38 +0000
committerDmitry Vyukov <dvyukov@google.com>2020-08-13 13:50:25 +0200
commitf5442bde55872d703f184f8617329f706bad8149 (patch)
tree14e121020d6aacd857b80351f01546818f19a74b /prog/encoding.go
parentee7cb8b69583db417b187b53f4765c3a403cd4cf (diff)
pkg, prog: add per-field direction attribute
Diffstat (limited to 'prog/encoding.go')
-rw-r--r--prog/encoding.go17
1 files changed, 10 insertions, 7 deletions
diff --git a/prog/encoding.go b/prog/encoding.go
index 6dd2a2582..ba3d607b5 100644
--- a/prog/encoding.go
+++ b/prog/encoding.go
@@ -584,9 +584,9 @@ func (p *parser) parseArgStruct(typ Type, dir Dir) (Arg, error) {
}
field := t1.Fields[i]
if IsPad(field.Type) {
- inner = append(inner, MakeConstArg(field.Type, dir, 0))
+ inner = append(inner, MakeConstArg(field.Type, field.Dir(dir), 0))
} else {
- arg, err := p.parseArg(field.Type, dir)
+ arg, err := p.parseArg(field.Type, field.Dir(dir))
if err != nil {
return nil, err
}
@@ -602,7 +602,7 @@ func (p *parser) parseArgStruct(typ Type, dir Dir) (Arg, error) {
if !IsPad(field.Type) {
p.strictFailf("missing struct %v fields %v/%v", typ.Name(), len(inner), len(t1.Fields))
}
- inner = append(inner, field.Type.DefaultArg(dir))
+ inner = append(inner, field.Type.DefaultArg(field.Dir(dir)))
}
return MakeGroupArg(typ, dir, inner), nil
}
@@ -645,11 +645,14 @@ func (p *parser) parseArgUnion(typ Type, dir Dir) (Arg, error) {
}
p.Parse('@')
name := p.Ident()
- var optType Type
+ var (
+ optType Type
+ optDir Dir
+ )
index := -1
for i, field := range t1.Fields {
if name == field.Name {
- optType, index = field.Type, i
+ optType, index, optDir = field.Type, i, field.Dir(dir)
break
}
}
@@ -661,12 +664,12 @@ func (p *parser) parseArgUnion(typ Type, dir Dir) (Arg, error) {
if p.Char() == '=' {
p.Parse('=')
var err error
- opt, err = p.parseArg(optType, dir)
+ opt, err = p.parseArg(optType, optDir)
if err != nil {
return nil, err
}
} else {
- opt = optType.DefaultArg(dir)
+ opt = optType.DefaultArg(optDir)
}
return MakeUnionArg(typ, dir, opt, index), nil
}