aboutsummaryrefslogtreecommitdiffstats
path: root/sysgen
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2016-09-15 13:45:06 +0200
committerAndrey Konovalov <andreyknvl@google.com>2016-09-19 16:16:24 +0200
commitf41935d53ff6271e8c2a9022f41b99ccee9b634b (patch)
tree881e9441318a2be9ef7f20bff33ffcc1aa05e97a /sysgen
parent9decc82111be1754889e46944a6c6bfdfefdbeb7 (diff)
Allow range sized arrays
Diffstat (limited to 'sysgen')
-rw-r--r--sysgen/sysgen.go28
1 files changed, 15 insertions, 13 deletions
diff --git a/sysgen/sysgen.go b/sysgen/sysgen.go
index 6d6a75bdc..e7a0fae00 100644
--- a/sysgen/sysgen.go
+++ b/sysgen/sysgen.go
@@ -490,21 +490,23 @@ func generateArg(
opt = false
fmt.Fprintf(out, "PtrType{%v, Dir: DirIn, Type: FilenameType{%v}}", commonHdr, common())
case "array":
- want := 1
- if len(a) == 2 {
- want = 2
- }
- if len(a) != want {
- failf("wrong number of arguments for %v arg %v, want %v, got %v", typ, name, want, len(a))
- }
- sz := "0"
- if len(a) == 2 {
- sz = a[1]
- if v, ok := consts[sz]; ok {
- sz = fmt.Sprint(v)
+ switch len(a) {
+ case 1:
+ fmt.Fprintf(out, "ArrayType{%v, Type: %v, Kind: ArrayRandLen}", common(), generateType(a[0], desc, consts))
+ case 2:
+ var begin, end uintptr
+ sz := a[1]
+ if _, err := fmt.Sscanf(sz, "%d:%d", &begin, &end); err != nil {
+ if v, ok := consts[sz]; ok {
+ sz = fmt.Sprint(v)
+ }
+ fmt.Fprintf(out, "ArrayType{%v, Type: %v, Kind: ArrayRangeLen, RangeBegin: %v, RangeEnd: %v}", common(), generateType(a[0], desc, consts), sz, sz)
+ } else {
+ fmt.Fprintf(out, "ArrayType{%v, Type: %v, Kind: ArrayRangeLen, RangeBegin: %v, RangeEnd: %v}", common(), generateType(a[0], desc, consts), begin, end)
}
+ default:
+ failf("wrong number of arguments for %v arg %v, want 1 or 2, got %v", typ, name, len(a))
}
- fmt.Fprintf(out, "ArrayType{%v, Type: %v, Len: %v}", common(), generateType(a[0], desc, consts), sz)
case "ptr":
canBeArg = true
if want := 2; len(a) != want {