diff options
| author | aarzilli <[email protected]> | 2014-05-02 15:09:23 +0200 |
|---|---|---|
| committer | aarzilli <[email protected]> | 2014-05-02 15:09:23 +0200 |
| commit | cdbc8241c4be92fd4fbb6b7b819e84dce4a06850 (patch) | |
| tree | 46fa3d240fa2e2e4704c972f814ad94e4bc6ce72 /xgbgen/go.go | |
| parent | efcb6d44d2722be3a77fe5292f5bfd5e73ed7e48 (diff) | |
Fix Issue #21: automatic calculation of alignment padding after lists
Diffstat (limited to 'xgbgen/go.go')
| -rw-r--r-- | xgbgen/go.go | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/xgbgen/go.go b/xgbgen/go.go index 6c680e8..ace4e00 100644 --- a/xgbgen/go.go +++ b/xgbgen/go.go @@ -103,15 +103,27 @@ func (td *TypeDef) Define(c *Context) { // Pad fields func (f *PadField) Define(c *Context) { - c.Putln("// padding: %d bytes", f.Bytes) + if f.Align > 0 { + c.Putln("// alignment gap to multiple of %d", f.Align) + } else { + c.Putln("// padding: %d bytes", f.Bytes) + } } func (f *PadField) Read(c *Context, prefix string) { - c.Putln("b += %s // padding", f.Size()) + if f.Align > 0 { + c.Putln("b = (b + %d) & ^%d // alignment gap", f.Align-1, f.Align-1) + } else { + c.Putln("b += %s // padding", f.Size()) + } } func (f *PadField) Write(c *Context, prefix string) { - c.Putln("b += %s // padding", f.Size()) + if f.Align > 0 { + c.Putln("b = (b + %d) & ^%d // alignment gap", f.Align-1, f.Align-1) + } else { + c.Putln("b += %s // padding", f.Size()) + } } // Local fields |
