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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 } | 118 } |
119 if header != mapHeader { | 119 if header != mapHeader { |
120 return fmt.Errorf("invalid map header: %v", header) | 120 return fmt.Errorf("invalid map header: %v", header) |
121 } | 121 } |
122 if err := d.pushState(header, pointerBitSize); err != nil { | 122 if err := d.pushState(header, pointerBitSize); err != nil { |
123 return err | 123 return err |
124 } | 124 } |
125 return nil | 125 return nil |
126 } | 126 } |
127 | 127 |
128 // StartStruct starts decoding a struct and reads its data header, | 128 // StartStruct starts decoding a struct and reads its data header. |
129 // returning struct version declared in data header. | 129 // Returns the read data header. The caller should check if it is valid. |
130 // Note: it doesn't read a pointer to the encoded struct. | 130 // Note: it doesn't read a pointer to the encoded struct. |
131 // Call |Finish()| after reading all fields. | 131 // Call |Finish()| after reading all fields. |
132 func (d *Decoder) StartStruct() (uint32, error) { | 132 func (d *Decoder) StartStruct() (DataHeader, error) { |
133 header, err := d.readDataHeader() | 133 header, err := d.readDataHeader() |
134 if err != nil { | 134 if err != nil { |
135 » » return 0, err | 135 » » return DataHeader{}, err |
136 } | 136 } |
137 if header.Size < dataHeaderSize { | 137 if header.Size < dataHeaderSize { |
138 » » return 0, fmt.Errorf("data header size is too small: is %d, but
should be at least %d", header.Size, dataHeaderSize) | 138 » » return DataHeader{}, fmt.Errorf("data header size(%d) should be
at least %d", header.Size, dataHeaderSize) |
139 } | 139 } |
140 if err := d.pushState(header, 0); err != nil { | 140 if err := d.pushState(header, 0); err != nil { |
141 » » return 0, err | 141 » » return DataHeader{}, err |
142 } | 142 } |
143 » return header.ElementsOrVersion, nil | 143 » return header, nil |
144 } | 144 } |
145 | 145 |
146 func (d *Decoder) readDataHeader() (DataHeader, error) { | 146 func (d *Decoder) readDataHeader() (DataHeader, error) { |
147 if err := d.claimData(dataHeaderSize); err != nil { | 147 if err := d.claimData(dataHeaderSize); err != nil { |
148 return DataHeader{}, err | 148 return DataHeader{}, err |
149 } | 149 } |
150 oldEnd := d.end - dataHeaderSize | 150 oldEnd := d.end - dataHeaderSize |
151 header := DataHeader{ | 151 header := DataHeader{ |
152 Size: binary.LittleEndian.Uint32(d.buf[oldEnd:]), | 152 Size: binary.LittleEndian.Uint32(d.buf[oldEnd:]), |
153 ElementsOrVersion: binary.LittleEndian.Uint32(d.buf[oldEnd+4:]), | 153 ElementsOrVersion: binary.LittleEndian.Uint32(d.buf[oldEnd+4:]), |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 } | 358 } |
359 | 359 |
360 // ReadSharedBufferHandle reads a shared buffer handle. | 360 // ReadSharedBufferHandle reads a shared buffer handle. |
361 func (d *Decoder) ReadSharedBufferHandle() (system.SharedBufferHandle, error) { | 361 func (d *Decoder) ReadSharedBufferHandle() (system.SharedBufferHandle, error) { |
362 if handle, err := d.ReadUntypedHandle(); err != nil { | 362 if handle, err := d.ReadUntypedHandle(); err != nil { |
363 return nil, err | 363 return nil, err |
364 } else { | 364 } else { |
365 return handle.ToSharedBufferHandle(), nil | 365 return handle.ToSharedBufferHandle(), nil |
366 } | 366 } |
367 } | 367 } |
OLD | NEW |