From f41935d53ff6271e8c2a9022f41b99ccee9b634b Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Thu, 15 Sep 2016 13:45:06 +0200 Subject: Allow range sized arrays --- sys/README.md | 2 +- sys/align.go | 2 +- sys/decl.go | 20 +++++++++++++------- 3 files changed, 15 insertions(+), 9 deletions(-) (limited to 'sys') diff --git a/sys/README.md b/sys/README.md index 46c0a1a59..1355ad4f8 100644 --- a/sys/README.md +++ b/sys/README.md @@ -45,7 +45,7 @@ rest of the type-options are type-specific: "ptr": a pointer to an object, type-options: type of the object; direction (in/out/inout) "array": a variable/fixed-length array, type-options: - type of elements, optional size for fixed-length arrays + type of elements, optional size (fixed "5", or ranged "5:10", boundaries inclusive) "intN"/"intptr": an integer without a particular meaning, type-options: range of values (e.g. "5:10", or "-100:200", optional) ``` diff --git a/sys/align.go b/sys/align.go index 5e67f6175..4c91c28be 100644 --- a/sys/align.go +++ b/sys/align.go @@ -64,7 +64,7 @@ func addAlignment(t *StructType) Type { } off += f.Size() fields = append(fields, f) - if at, ok := f.(ArrayType); ok && at.Len == 0 { + if at, ok := f.(ArrayType); ok && (at.Kind == ArrayRandLen || (at.Kind == ArrayRangeLen && at.RangeBegin != at.RangeEnd)) { varLen = true } if varLen && i != len(t.Fields)-1 { diff --git a/sys/decl.go b/sys/decl.go index a447948bc..a87b51d91 100644 --- a/sys/decl.go +++ b/sys/decl.go @@ -236,21 +236,27 @@ func (t FilenameType) Align() uintptr { return 1 } +type ArrayKind int + +const ( + ArrayRandLen ArrayKind = iota + ArrayRangeLen +) + type ArrayType struct { TypeCommon - Type Type - Len uintptr // 0 if variable-length, unused for now + Type Type + Kind ArrayKind + RangeBegin uintptr + RangeEnd uintptr } func (t ArrayType) Size() uintptr { - if t.Len == 0 { - return 0 // for trailing embed arrays - } - return t.Len * t.Type.Size() + panic("should not be called") } func (t ArrayType) Align() uintptr { - return t.Type.Align() + panic("should not be called") } type PtrType struct { -- cgit mrf-deployment