Index: third_party/mojo/src/mojo/public/go/bindings/decoder.go |
diff --git a/third_party/mojo/src/mojo/public/go/bindings/decoder.go b/third_party/mojo/src/mojo/public/go/bindings/decoder.go |
index 3f3cce9bca824f4f4378e12053dbb7809c0699dc..6f6b4330add2107b980af93755955a376002707c 100644 |
--- a/third_party/mojo/src/mojo/public/go/bindings/decoder.go |
+++ b/third_party/mojo/src/mojo/public/go/bindings/decoder.go |
@@ -68,11 +68,15 @@ func (d *Decoder) pushState(header DataHeader, elementBitSize uint32) error { |
if err := d.claimData(int(header.Size - dataHeaderSize)); err != nil { |
return err |
} |
+ elements := uint32(0) |
+ if elementBitSize != 0 { |
+ elements = header.ElementsOrVersion |
+ } |
d.stateStack = append(d.stateStack, encodingState{ |
offset: oldEnd, |
limit: d.end, |
elementBitSize: elementBitSize, |
- elements: header.Elements, |
+ elements: elements, |
}) |
return nil |
} |
@@ -94,13 +98,14 @@ func (d *Decoder) StartArray(elementBitSize uint32) (uint32, error) { |
if err != nil { |
return 0, err |
} |
- if got, want := int(header.Size), dataHeaderSize+bytesForBits(uint64(header.Elements)*uint64(elementBitSize)); got < want { |
+ minSize := bytesForBits(uint64(header.ElementsOrVersion) * uint64(elementBitSize)) |
+ if got, want := int(header.Size), dataHeaderSize+minSize; got < want { |
return 0, fmt.Errorf("data header size is too small: is %d, but should be at least %d", got, want) |
} |
if err := d.pushState(header, elementBitSize); err != nil { |
return 0, err |
} |
- return header.Elements, nil |
+ return header.ElementsOrVersion, nil |
} |
// StartMap starts decoding a map and reads its data header. |
@@ -120,8 +125,8 @@ func (d *Decoder) StartMap() error { |
return nil |
} |
-// StartArray starts decoding a struct and reads its data header, |
-// returning number of fields declared in data header. |
+// StartStruct starts decoding a struct and reads its data header, |
+// returning struct version declared in data header. |
// Note: it doesn't read a pointer to the encoded struct. |
// Call |Finish()| after reading all fields. |
func (d *Decoder) StartStruct() (uint32, error) { |
@@ -135,7 +140,7 @@ func (d *Decoder) StartStruct() (uint32, error) { |
if err := d.pushState(header, 0); err != nil { |
return 0, err |
} |
- return header.Elements, nil |
+ return header.ElementsOrVersion, nil |
} |
func (d *Decoder) readDataHeader() (DataHeader, error) { |
@@ -144,8 +149,8 @@ func (d *Decoder) readDataHeader() (DataHeader, error) { |
} |
oldEnd := d.end - dataHeaderSize |
header := DataHeader{ |
- Size: binary.LittleEndian.Uint32(d.buf[oldEnd:]), |
- Elements: binary.LittleEndian.Uint32(d.buf[oldEnd+4:]), |
+ Size: binary.LittleEndian.Uint32(d.buf[oldEnd:]), |
+ ElementsOrVersion: binary.LittleEndian.Uint32(d.buf[oldEnd+4:]), |
} |
return header, nil |
} |