| Index: third_party/mojo/src/mojo/public/go/bindings/encoder.go
|
| diff --git a/third_party/mojo/src/mojo/public/go/bindings/encoder.go b/third_party/mojo/src/mojo/public/go/bindings/encoder.go
|
| index 5ea1a50cdfcca72257289161eb1ebc2a22c43cc0..542cc21c999561bd13793986e24eeac967a8cc7e 100644
|
| --- a/third_party/mojo/src/mojo/public/go/bindings/encoder.go
|
| +++ b/third_party/mojo/src/mojo/public/go/bindings/encoder.go
|
| @@ -74,10 +74,10 @@ func ensureElementBitSizeAndCapacity(state *encodingState, bitSize uint32) error
|
| if state == nil {
|
| return fmt.Errorf("empty state stack")
|
| }
|
| - if state.elementBitSize > 0 && state.elementBitSize != bitSize {
|
| + if state.elementBitSize != 0 && state.elementBitSize != bitSize {
|
| return fmt.Errorf("unexpected element bit size: expected %d, but got %d", state.elementBitSize, bitSize)
|
| }
|
| - if state.elementsProcessed >= state.elements {
|
| + if state.elementBitSize != 0 && state.elementsProcessed >= state.elements {
|
| return fmt.Errorf("can't process more than elements defined in header(%d)", state.elements)
|
| }
|
| byteSize := bytesForBits(uint64(state.bitOffset + bitSize))
|
| @@ -112,11 +112,15 @@ func (e *Encoder) popState() {
|
| func (e *Encoder) pushState(header DataHeader, elementBitSize uint32) {
|
| oldEnd := e.end
|
| e.claimData(align(int(header.Size), defaultAlignment))
|
| + elements := uint32(0)
|
| + if elementBitSize != 0 {
|
| + elements = header.ElementsOrVersion
|
| + }
|
| e.stateStack = append(e.stateStack, encodingState{
|
| offset: oldEnd,
|
| limit: e.end,
|
| elementBitSize: elementBitSize,
|
| - elements: header.Elements,
|
| + elements: elements,
|
| })
|
| e.writeDataHeader(header)
|
| }
|
| @@ -153,15 +157,15 @@ func (e *Encoder) StartMap() {
|
| // StartStruct starts encoding a struct and writes its data header.
|
| // Note: it doesn't write a pointer to the encoded struct.
|
| // Call |Finish()| after writing all fields.
|
| -func (e *Encoder) StartStruct(size, numFields uint32) {
|
| +func (e *Encoder) StartStruct(size, version uint32) {
|
| dataSize := dataHeaderSize + int(size)
|
| - header := DataHeader{uint32(dataSize), numFields}
|
| + header := DataHeader{uint32(dataSize), version}
|
| e.pushState(header, 0)
|
| }
|
|
|
| func (e *Encoder) writeDataHeader(header DataHeader) {
|
| binary.LittleEndian.PutUint32(e.buf[e.state().offset:], header.Size)
|
| - binary.LittleEndian.PutUint32(e.buf[e.state().offset+4:], header.Elements)
|
| + binary.LittleEndian.PutUint32(e.buf[e.state().offset+4:], header.ElementsOrVersion)
|
| e.state().offset += 8
|
| }
|
|
|
| @@ -171,7 +175,7 @@ func (e *Encoder) Finish() error {
|
| if e.state() == nil {
|
| return fmt.Errorf("state stack is empty")
|
| }
|
| - if e.state().elementsProcessed != e.state().elements {
|
| + if e.state().elementBitSize != 0 && e.state().elementsProcessed != e.state().elements {
|
| return fmt.Errorf("unexpected number of elements written: defined in header %d, but written %d", e.state().elements, e.state().elementsProcessed)
|
| }
|
| e.popState()
|
|
|