| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package bindings | 5 package bindings |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "encoding/binary" | 8 "encoding/binary" |
| 9 "fmt" | 9 "fmt" |
| 10 "math" | 10 "math" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 return DataHeader{}, &ValidationError{UnexpectedStructHeader, | 142 return DataHeader{}, &ValidationError{UnexpectedStructHeader, |
| 143 fmt.Sprintf("data header size(%d) should be at least %d"
, header.Size, dataHeaderSize), | 143 fmt.Sprintf("data header size(%d) should be at least %d"
, header.Size, dataHeaderSize), |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 if err := d.pushState(header, 0); err != nil { | 146 if err := d.pushState(header, 0); err != nil { |
| 147 return DataHeader{}, err | 147 return DataHeader{}, err |
| 148 } | 148 } |
| 149 return header, nil | 149 return header, nil |
| 150 } | 150 } |
| 151 | 151 |
| 152 // StartUnion starts decoding a union and reads its header. |
| 153 // Returns the read data header. The caller should check if it is valid. |
| 154 // Note: it doesn't read the data field. |
| 155 func (d *Decoder) StartUnion() (DataHeader, error) { |
| 156 header, err := d.readDataHeader() |
| 157 if err != nil { |
| 158 return DataHeader{}, err |
| 159 } |
| 160 |
| 161 if err := d.pushState(header, 0); err != nil { |
| 162 return DataHeader{}, err |
| 163 } |
| 164 return header, nil |
| 165 } |
| 166 |
| 152 func (d *Decoder) readDataHeader() (DataHeader, error) { | 167 func (d *Decoder) readDataHeader() (DataHeader, error) { |
| 153 if err := d.claimData(dataHeaderSize); err != nil { | 168 if err := d.claimData(dataHeaderSize); err != nil { |
| 154 return DataHeader{}, err | 169 return DataHeader{}, err |
| 155 } | 170 } |
| 156 oldEnd := d.end - dataHeaderSize | 171 oldEnd := d.end - dataHeaderSize |
| 157 header := DataHeader{ | 172 header := DataHeader{ |
| 158 Size: binary.LittleEndian.Uint32(d.buf[oldEnd:]), | 173 Size: binary.LittleEndian.Uint32(d.buf[oldEnd:]), |
| 159 ElementsOrVersion: binary.LittleEndian.Uint32(d.buf[oldEnd+4:]), | 174 ElementsOrVersion: binary.LittleEndian.Uint32(d.buf[oldEnd+4:]), |
| 160 } | 175 } |
| 161 return header, nil | 176 return header, nil |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 handle, err := d.ReadMessagePipeHandle() | 394 handle, err := d.ReadMessagePipeHandle() |
| 380 if err != nil { | 395 if err != nil { |
| 381 return nil, err | 396 return nil, err |
| 382 } | 397 } |
| 383 d.state().elementsProcessed-- | 398 d.state().elementsProcessed-- |
| 384 if _, err := d.ReadUint32(); err != nil { | 399 if _, err := d.ReadUint32(); err != nil { |
| 385 return nil, err | 400 return nil, err |
| 386 } | 401 } |
| 387 return handle, nil | 402 return handle, nil |
| 388 } | 403 } |
| OLD | NEW |