[fidl] Make xunion ordinals 64 bits
Instead of 32 bits of xunion ordinal followed by 32 bits
of padding, we designate the entire 64 bits as the xunion
ordinal.
Bug: 39578
Test: fx run-test go_fidl_tests
Change-Id: I7ff024ef6da311e4067a5cad49431b9a7aff8c04
diff --git a/src/syscall/zx/fidl/bindingstest/impl.go b/src/syscall/zx/fidl/bindingstest/impl.go
index a879f3b..6b89cc0 100644
--- a/src/syscall/zx/fidl/bindingstest/impl.go
+++ b/src/syscall/zx/fidl/bindingstest/impl.go
@@ -826,7 +826,7 @@
return _u
}
-type I_xUnion1Tag uint32
+type I_xUnion1Tag uint64
const (
XUnion1_unknownData = 0 // 0x00000000
@@ -856,8 +856,8 @@
}
}
-func (_m *XUnion1) Ordinal() uint32 {
- return uint32(_m.I_xUnion1Tag)
+func (_m *XUnion1) Ordinal() uint64 {
+ return uint64(_m.I_xUnion1Tag)
}
func (_m *XUnion1) SetA(a [3]int8) {
@@ -893,7 +893,7 @@
return _u
}
-type I_xUnionInsideXUnionTag uint32
+type I_xUnionInsideXUnionTag uint64
const (
XUnionInsideXUnion_unknownData = 0 // 0x00000000
@@ -919,8 +919,8 @@
}
}
-func (_m *XUnionInsideXUnion) Ordinal() uint32 {
- return uint32(_m.I_xUnionInsideXUnionTag)
+func (_m *XUnionInsideXUnion) Ordinal() uint64 {
+ return uint64(_m.I_xUnionInsideXUnionTag)
}
func (_m *XUnionInsideXUnion) SetA(a float32) {
@@ -945,7 +945,7 @@
return _u
}
-type I_strictXUnion1Tag uint32
+type I_strictXUnion1Tag uint64
const (
StrictXUnion1A = 1988029217 // 0x767eeb21
@@ -964,8 +964,8 @@
return _m.I_strictXUnion1Tag
}
-func (_m *StrictXUnion1) Ordinal() uint32 {
- return uint32(_m.I_strictXUnion1Tag)
+func (_m *StrictXUnion1) Ordinal() uint64 {
+ return uint64(_m.I_strictXUnion1Tag)
}
func (_m *StrictXUnion1) SetA(a [3]int8) {
diff --git a/src/syscall/zx/fidl/conformance/impl.go b/src/syscall/zx/fidl/conformance/impl.go
index 8b5291b..c68df97 100644
--- a/src/syscall/zx/fidl/conformance/impl.go
+++ b/src/syscall/zx/fidl/conformance/impl.go
@@ -1935,7 +1935,7 @@
return _u
}
-type I_xUnionWithEmptyStructTag uint32
+type I_xUnionWithEmptyStructTag uint64
const (
XUnionWithEmptyStruct_unknownData = 0 // 0x00000000
@@ -1957,8 +1957,8 @@
}
}
-func (_m *XUnionWithEmptyStruct) Ordinal() uint32 {
- return uint32(_m.I_xUnionWithEmptyStructTag)
+func (_m *XUnionWithEmptyStruct) Ordinal() uint64 {
+ return uint64(_m.I_xUnionWithEmptyStructTag)
}
func (_m *XUnionWithEmptyStruct) SetS(s EmptyStruct) {
@@ -1972,7 +1972,7 @@
return _u
}
-type I_xUnionWithStructTag uint32
+type I_xUnionWithStructTag uint64
const (
XUnionWithStruct_unknownData = 0 // 0x00000000
@@ -1994,8 +1994,8 @@
}
}
-func (_m *XUnionWithStruct) Ordinal() uint32 {
- return uint32(_m.I_xUnionWithStructTag)
+func (_m *XUnionWithStruct) Ordinal() uint64 {
+ return uint64(_m.I_xUnionWithStructTag)
}
func (_m *XUnionWithStruct) SetS(s StructSize3Align1) {
@@ -2009,7 +2009,7 @@
return _u
}
-type I_xUnionWithXUnionTag uint32
+type I_xUnionWithXUnionTag uint64
const (
XUnionWithXUnion_unknownData = 0 // 0x00000000
@@ -2031,8 +2031,8 @@
}
}
-func (_m *XUnionWithXUnion) Ordinal() uint32 {
- return uint32(_m.I_xUnionWithXUnionTag)
+func (_m *XUnionWithXUnion) Ordinal() uint64 {
+ return uint64(_m.I_xUnionWithXUnionTag)
}
func (_m *XUnionWithXUnion) SetXu(xu XUnionWithStruct) {
@@ -2046,7 +2046,7 @@
return _u
}
-type I_xUnionWithUnionsTag uint32
+type I_xUnionWithUnionsTag uint64
const (
XUnionWithUnions_unknownData = 0 // 0x00000000
@@ -2072,8 +2072,8 @@
}
}
-func (_m *XUnionWithUnions) Ordinal() uint32 {
- return uint32(_m.I_xUnionWithUnionsTag)
+func (_m *XUnionWithUnions) Ordinal() uint64 {
+ return uint64(_m.I_xUnionWithUnionsTag)
}
func (_m *XUnionWithUnions) SetU1(u1 UnionSize8Align4) {
@@ -2098,7 +2098,7 @@
return _u
}
-type I_sampleXUnionTag uint32
+type I_sampleXUnionTag uint64
const (
SampleXUnion_unknownData = 0 // 0x00000000
@@ -2128,8 +2128,8 @@
}
}
-func (_m *SampleXUnion) Ordinal() uint32 {
- return uint32(_m.I_sampleXUnionTag)
+func (_m *SampleXUnion) Ordinal() uint64 {
+ return uint64(_m.I_sampleXUnionTag)
}
func (_m *SampleXUnion) SetU(u uint32) {
@@ -2165,7 +2165,7 @@
return _u
}
-type I_sampleStrictXUnionTag uint32
+type I_sampleStrictXUnionTag uint64
const (
SampleStrictXUnionU = 149088882 // 0x08e2ea72
@@ -2184,8 +2184,8 @@
return _m.I_sampleStrictXUnionTag
}
-func (_m *SampleStrictXUnion) Ordinal() uint32 {
- return uint32(_m.I_sampleStrictXUnionTag)
+func (_m *SampleStrictXUnion) Ordinal() uint64 {
+ return uint64(_m.I_sampleStrictXUnionTag)
}
func (_m *SampleStrictXUnion) SetU(u uint32) {
diff --git a/src/syscall/zx/fidl/encoding_new.go b/src/syscall/zx/fidl/encoding_new.go
index 058c5a7..73df212 100644
--- a/src/syscall/zx/fidl/encoding_new.go
+++ b/src/syscall/zx/fidl/encoding_new.go
@@ -191,7 +191,7 @@
sizeOld = marshalerBounds[0]
alignmentOld = marshalerBounds[1]
fields []mField
- ordinals []int
+ ordinals []uint64
offsetsOld []int
offsetsV1 []int
)
@@ -213,7 +213,7 @@
fieldBounds = actualBounds
case unionTag, xunionTag, strictXunionTag, tableTag:
ordinal, actualBounds := fieldBounds.pop()
- ordinals = append(ordinals, ordinal)
+ ordinals = append(ordinals, uint64(ordinal))
fieldBounds = actualBounds
default:
}
@@ -274,7 +274,7 @@
case xunionTag, strictXunionTag:
strictness := strictness(kind == strictXunionTag)
- ordinalToFields := make(map[int]mField)
+ ordinalToFields := make(map[uint64]mField)
for i := 0; i < len(fields); i++ {
ordinalToFields[ordinals[i]] = fields[i]
}
@@ -302,7 +302,7 @@
}
func mUnionToMXUnion(m mUnion) mXUnion {
- ordinalToFields := make(map[int]mField)
+ ordinalToFields := make(map[uint64]mField)
for i := 0; i < len(m.fields); i++ {
ordinalToFields[m.ordinals[i]] = m.fields[i]
}
@@ -650,7 +650,7 @@
type mUnion struct {
fields []mField
- ordinals []int
+ ordinals []uint64
sizeOld, alignmentOld int
sizeV1, alignmentV1 int
@@ -748,8 +748,8 @@
}
type mXUnion struct {
- fields map[int]mField
- ordinals []int
+ fields map[uint64]mField
+ ordinals []uint64
unionToXunion bool
sizeOld, alignmentOld int
sizeV1, alignmentV1 int
@@ -771,7 +771,7 @@
}
func (m mXUnion) marshal(ctx MarshalerContext, v reflect.Value, out *encoder) error {
- var ordinal int
+ var ordinal uint64
if m.unionToXunion {
// Unions store the active field index in Field(0), which could be
// different from the xunion ordinal if there are reserved variants.
@@ -781,13 +781,13 @@
}
ordinal = m.ordinals[fieldIndex-1]
} else {
- ordinal = int(v.Field(0).Uint())
+ ordinal = v.Field(0).Uint()
}
field, ok := m.fields[ordinal]
if !ok {
return newValueError(ErrInvalidXUnionTag, ordinal)
}
- out.writeUint(uint64(ordinal), 8)
+ out.writeUint(ordinal, 8)
// Field.
if err := marshalEnvelopePresent(ctx, field, v.Field(field.index), out); err != nil {
@@ -806,19 +806,11 @@
// in order to reflectively create a pointer container.
optAllowed := typ != nil
- ordinal, err := in.readUint(4)
+ ordinal, err := in.readUint(8)
if err != nil {
return err
}
- padding, err := in.readUint(4)
- if err != nil {
- return err
- }
- if padding != 0 {
- return newValueError(ErrNonZeroPadding, padding)
- }
-
// ordinal=0 indicates that there MUST be no envelope.
if ordinal == 0 && !optAllowed {
return newValueError(ErrInvalidXUnionTag, ordinal)
@@ -837,7 +829,7 @@
// If we reach here, ordinal != 0.
- field, ok := m.fields[int(ordinal)]
+ field, ok := m.fields[ordinal]
if !ok {
if m.strictness == isStrict {
return newValueError(ErrInvalidXUnionTag, ordinal)
@@ -926,7 +918,7 @@
type mTable struct {
fields []mField
- ordinals []int
+ ordinals []uint64
sizeOld, alignmentOld int
sizeV1, alignmentV1 int
}
@@ -1095,7 +1087,7 @@
func (m mTable) marshal(ctx MarshalerContext, v reflect.Value, out *encoder) error {
// Determining max ordinal.
var (
- maxOrdinal int
+ maxOrdinal uint64
numKnown = len(m.ordinals)
fieldPresent = make([]bool, numKnown)
)
@@ -1110,7 +1102,7 @@
}
// Vector of envelopes header.
- out.writeUint(uint64(maxOrdinal), 8)
+ out.writeUint(maxOrdinal, 8)
out.writeUint(allocPresent, 8)
// Early exit on empty table.
@@ -1120,12 +1112,12 @@
// Encode in the out-of-line object.
oldHead := out.head
- out.head = out.newObject(maxOrdinal * envelopeSize)
+ out.head = out.newObject(int(maxOrdinal) * envelopeSize)
// Envelopes.
var (
- ordinal = 1
- index, fieldIndex, presenceIndex = 0, 1, 2
+ ordinal uint64 = 1
+ index, fieldIndex, presenceIndex = 0, 1, 2
)
for ordinal <= maxOrdinal {
fieldKnown := index < numKnown && ordinal == m.ordinals[index]
@@ -1162,7 +1154,7 @@
if mou > uint64(^uint(0)) {
return newValueError(ErrUnexpectedOrdinal, v)
}
- maxOrdinal := int(mou)
+ maxOrdinal := mou
allocPtr, err := in.readUint(8)
if err != nil {
@@ -1184,12 +1176,12 @@
// Envelopes.
var (
- numKnown = len(m.ordinals)
- ordinal = 1
- index, fieldIndex, presenceIndex = 0, 1, 2
+ numKnown = len(m.ordinals)
+ ordinal uint64 = 1
+ index, fieldIndex, presenceIndex = 0, 1, 2
)
tableBodyHead := in.nextObject
- in.nextObject += maxOrdinal * envelopeSize
+ in.nextObject += int(maxOrdinal) * envelopeSize
oldHead := in.head
in.head = tableBodyHead
for ordinal <= maxOrdinal {
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 310982c..fad3f77 100644
--- a/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
+++ b/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
@@ -87,9 +87,9 @@
}
}
-func TestEnvelopeBadPadding(t *testing.T) {
+func Test64bitOrdinal(t *testing.T) {
input := []byte{
- 0x21, 0xEB, 0x7E, 0x76, 0x55, 0x55, 0x55, 0x55, // ordinal + invalid padding
+ 0x21, 0xEB, 0x7E, 0x76, 0x55, 0x55, 0x55, 0x55, // 64bit ordinal
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // byte + handle count
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // envelope present
0xef, 0xbe, 0xad, 0xde, 0x11, 0xba, 0x5e, 0xba, // data
@@ -97,13 +97,8 @@
var message XUnion1Struct
_, _, err := Unmarshal(input, nil, &message)
- if err == nil {
- t.Fatalf("Unmarshal() returned nil error")
- }
-
- errCode := err.(ValidationError).Code()
- if errCode != ErrNonZeroPadding {
- t.Fatalf("Unmarshal() returned %d", errCode)
+ if err != nil {
+ t.Fatalf("Unmarshal() failed: %s", err)
}
}
diff --git a/src/syscall/zx/mem/impl.go b/src/syscall/zx/mem/impl.go
index fdbdb20..1d0cdbe 100644
--- a/src/syscall/zx/mem/impl.go
+++ b/src/syscall/zx/mem/impl.go
@@ -69,7 +69,7 @@
return _mRange
}
-type I_dataTag uint32
+type I_dataTag uint64
const (
Data_unknownData = 0 // 0x00000000
@@ -103,8 +103,8 @@
}
}
-func (_m *Data) Ordinal() uint32 {
- return uint32(_m.I_dataTag)
+func (_m *Data) Ordinal() uint64 {
+ return uint64(_m.I_dataTag)
}
func (_m *Data) SetBytes(bytes []uint8) {