[fidl][go] Set union-as-xunion flag in v1 mode
Simplifying header handling code a bit too.
Change-Id: I0745cad12a6525bd4a101a6e62d2d1faaba26326
diff --git a/src/syscall/zx/fidl/fidl_test/encoding_new_test.go b/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
index 3e428be..e00f7df 100644
--- a/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
+++ b/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
@@ -877,13 +877,8 @@
func TestMarshalUnionToXUnionUsingHeaderFlag(t *testing.T) {
const expectedUnionTag = XUnion1AsUnionD
const expectedFieldValue = 1.2
- inHeader := MessageHeader{
- Flags: [3]byte{
- 1, // decode unions from xunion bytes flag
- 0,
- 0,
- },
- }
+ var inHeader MessageHeader
+ inHeader.SetUnionFromXunionBytes()
var respb [zx.ChannelMaxMessageBytes]byte
var resph [zx.ChannelMaxMessageHandles]zx.Handle
input := XUnion1Struct{Xu: XUnion1WithD(expectedFieldValue)}
diff --git a/src/syscall/zx/fidl/interface.go b/src/syscall/zx/fidl/interface.go
index 6329202..364767a 100644
--- a/src/syscall/zx/fidl/interface.go
+++ b/src/syscall/zx/fidl/interface.go
@@ -139,6 +139,9 @@
Ordinal: ordinal,
Magic: FidlWireFormatMagicNumberInitial,
}
+ if newCtx().EncodeUnionsAsXUnionBytes {
+ header.SetUnionFromXunionBytes()
+ }
nb, nh, err := MarshalHeaderThenMessage(&header, req, respb[:], resph[:])
if err != nil {
return err
@@ -207,6 +210,9 @@
Ordinal: ordinal,
Magic: FidlWireFormatMagicNumberInitial,
}
+ if newCtx().EncodeUnionsAsXUnionBytes {
+ header.SetUnionFromXunionBytes()
+ }
nb, nh, err := MarshalHeaderThenMessage(&header, req, respb[:], resph[:])
if err != nil {
return err
diff --git a/src/syscall/zx/fidl/message.go b/src/syscall/zx/fidl/message.go
index 79501eb..f8bffda 100644
--- a/src/syscall/zx/fidl/message.go
+++ b/src/syscall/zx/fidl/message.go
@@ -12,8 +12,6 @@
"syscall/zx"
)
-const TransactionHeaderFlag_UnionFromXunionBytes = 1 << 0
-
const FidlWireFormatMagicNumberInitial = 1
// messageBytesPool is a pool of buffers that can fit the data part of any
@@ -41,10 +39,18 @@
Ordinal uint64 `fidl:"8" fidl_offset_v1:"8"`
}
-func (msg MessageHeader) IsSupportedVersion() bool {
+func (msg *MessageHeader) IsSupportedVersion() bool {
return msg.Magic == FidlWireFormatMagicNumberInitial
}
+func (msg *MessageHeader) HasUnionFromXunionBytes() bool {
+ return msg.Flags[0] & 0x01 != 0
+}
+
+func (msg *MessageHeader) SetUnionFromXunionBytes() {
+ msg.Flags[0] |= 0x01
+}
+
var mMessageHeader = MustCreateMarshaler(MessageHeader{})
var MessageHeaderSize = 16
@@ -83,18 +89,9 @@
return nil
}
ctx := newCtx()
- ctx.DecodeUnionsFromXUnionBytes = shouldDecodeUnionsFromXUnionBytes(header)
+ ctx.DecodeUnionsFromXUnionBytes = header.HasUnionFromXunionBytes()
if _, _, err := UnmarshalWithContext(ctx, data[hnb:], handles, body); err != nil {
return err
}
return nil
}
-
-func shouldDecodeUnionsFromXUnionBytes(header *MessageHeader) bool {
- return headerHasFlag(header, TransactionHeaderFlag_UnionFromXunionBytes)
-}
-
-func headerHasFlag(header *MessageHeader, flag int) bool {
- headerFlags := int(header.Flags[2])<<16 + int(header.Flags[1])<<8 + int(header.Flags[0])
- return (headerFlags & flag) != 0
-}