diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-01-10 16:13:34 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-01-13 12:52:09 +0100 |
| commit | 6b52293f4defa6b45b564d037fd641be5d6d0e0e (patch) | |
| tree | 53c7f28df3fd2666ca165ce7231d470c9d1e2dc5 /pkg/ast/testdata | |
| parent | 9dc808a65eb3f44d64e078b79bcac0f0510629f6 (diff) | |
pkg/compiler: support type templates
Netlink descriptions contain tons of code duplication,
and need much more for proper descriptions. Introduce
type templates to simplify writing such descriptions
and remove code duplication.
Note: type templates are experimental, have poor error handling
and are subject to change.
Type templates can be declared as follows:
```
type buffer[DIR] ptr[DIR, array[int8]]
type fileoff[BASE] BASE
type nlattr[TYPE, PAYLOAD] {
nla_len len[parent, int16]
nla_type const[TYPE, int16]
payload PAYLOAD
} [align_4]
```
and later used as follows:
```
syscall(a buffer[in], b fileoff[int64], c ptr[in, nlattr[FOO, int32]])
```
Diffstat (limited to 'pkg/ast/testdata')
| -rw-r--r-- | pkg/ast/testdata/all.txt | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/pkg/ast/testdata/all.txt b/pkg/ast/testdata/all.txt index 268b49a47..d4452b34f 100644 --- a/pkg/ast/testdata/all.txt +++ b/pkg/ast/testdata/all.txt @@ -48,5 +48,20 @@ s2 { type mybool8 int8 type net_port proc[1, 2, int16be] -type mybool16 ### unexpected '\n', expecting int, identifier, string -type type4:4 int32 ### unexpected ':', expecting int, identifier, string +type mybool16 ### unexpected '\n', expecting '[', identifier +type type4:4 int32 ### unexpected ':', expecting '[', identifier + +type templ0[] int8 ### unexpected ']', expecting identifier +type templ1[A,] int8 ### unexpected ']', expecting identifier +type templ2[,] int8 ### unexpected ',', expecting identifier +type templ3[ ### unexpected '\n', expecting identifier +type templ4[A] ### unexpected '\n', expecting int, identifier, string +type templ5[A] const[A] +type templ6[A, B] const[A, B] +type templ7[0] ptr[in, int8] ### unexpected int, expecting identifier + +type templ_struct0[A, B] { + len len[parent, int16] + typ const[A, int16] + data B +} [align_4] |
