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 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 func (d *Decoder) ReadInt8() (int8, error) { | 178 func (d *Decoder) ReadInt8() (int8, error) { |
179 value, err := d.ReadUint8() | 179 value, err := d.ReadUint8() |
180 return int8(value), err | 180 return int8(value), err |
181 } | 181 } |
182 | 182 |
183 // ReadUint8 reads an uint8 value. | 183 // ReadUint8 reads an uint8 value. |
184 func (d *Decoder) ReadUint8() (uint8, error) { | 184 func (d *Decoder) ReadUint8() (uint8, error) { |
185 if err := ensureElementBitSizeAndCapacity(d.state(), 8); err != nil { | 185 if err := ensureElementBitSizeAndCapacity(d.state(), 8); err != nil { |
186 return 0, err | 186 return 0, err |
187 } | 187 } |
188 d.state().alignOffsetToBytes() | |
189 value := d.buf[d.state().offset] | 188 value := d.buf[d.state().offset] |
190 d.state().skipBytes(1) | 189 d.state().skipBytes(1) |
191 d.state().elementsProcessed++ | 190 d.state().elementsProcessed++ |
192 return value, nil | 191 return value, nil |
193 } | 192 } |
194 | 193 |
195 // ReadInt16 reads an int16 value. | 194 // ReadInt16 reads an int16 value. |
196 func (d *Decoder) ReadInt16() (int16, error) { | 195 func (d *Decoder) ReadInt16() (int16, error) { |
197 value, err := d.ReadUint16() | 196 value, err := d.ReadUint16() |
198 return int16(value), err | 197 return int16(value), err |
199 } | 198 } |
200 | 199 |
201 // ReadUint16 reads an uint16 value. | 200 // ReadUint16 reads an uint16 value. |
202 func (d *Decoder) ReadUint16() (uint16, error) { | 201 func (d *Decoder) ReadUint16() (uint16, error) { |
203 if err := ensureElementBitSizeAndCapacity(d.state(), 16); err != nil { | 202 if err := ensureElementBitSizeAndCapacity(d.state(), 16); err != nil { |
204 return 0, err | 203 return 0, err |
205 } | 204 } |
206 d.state().alignOffsetToBytes() | |
207 d.state().offset = align(d.state().offset, 2) | 205 d.state().offset = align(d.state().offset, 2) |
208 value := binary.LittleEndian.Uint16(d.buf[d.state().offset:]) | 206 value := binary.LittleEndian.Uint16(d.buf[d.state().offset:]) |
209 d.state().skipBytes(2) | 207 d.state().skipBytes(2) |
210 d.state().elementsProcessed++ | 208 d.state().elementsProcessed++ |
211 return value, nil | 209 return value, nil |
212 } | 210 } |
213 | 211 |
214 // ReadInt32 reads an int32 value. | 212 // ReadInt32 reads an int32 value. |
215 func (d *Decoder) ReadInt32() (int32, error) { | 213 func (d *Decoder) ReadInt32() (int32, error) { |
216 value, err := d.ReadUint32() | 214 value, err := d.ReadUint32() |
217 return int32(value), err | 215 return int32(value), err |
218 } | 216 } |
219 | 217 |
220 // ReadUint32 reads an uint32 value. | 218 // ReadUint32 reads an uint32 value. |
221 func (d *Decoder) ReadUint32() (uint32, error) { | 219 func (d *Decoder) ReadUint32() (uint32, error) { |
222 if err := ensureElementBitSizeAndCapacity(d.state(), 32); err != nil { | 220 if err := ensureElementBitSizeAndCapacity(d.state(), 32); err != nil { |
223 return 0, err | 221 return 0, err |
224 } | 222 } |
225 d.state().alignOffsetToBytes() | |
226 d.state().offset = align(d.state().offset, 4) | 223 d.state().offset = align(d.state().offset, 4) |
227 value := binary.LittleEndian.Uint32(d.buf[d.state().offset:]) | 224 value := binary.LittleEndian.Uint32(d.buf[d.state().offset:]) |
228 d.state().skipBytes(4) | 225 d.state().skipBytes(4) |
229 d.state().elementsProcessed++ | 226 d.state().elementsProcessed++ |
230 return value, nil | 227 return value, nil |
231 } | 228 } |
232 | 229 |
233 // ReadInt64 reads an int64 value. | 230 // ReadInt64 reads an int64 value. |
234 func (d *Decoder) ReadInt64() (int64, error) { | 231 func (d *Decoder) ReadInt64() (int64, error) { |
235 value, err := d.ReadUint64() | 232 value, err := d.ReadUint64() |
236 return int64(value), err | 233 return int64(value), err |
237 } | 234 } |
238 | 235 |
239 // ReadUint64 reads an uint64 value. | 236 // ReadUint64 reads an uint64 value. |
240 func (d *Decoder) ReadUint64() (uint64, error) { | 237 func (d *Decoder) ReadUint64() (uint64, error) { |
241 if err := ensureElementBitSizeAndCapacity(d.state(), 64); err != nil { | 238 if err := ensureElementBitSizeAndCapacity(d.state(), 64); err != nil { |
242 return 0, err | 239 return 0, err |
243 } | 240 } |
244 d.state().alignOffsetToBytes() | |
245 d.state().offset = align(d.state().offset, 8) | 241 d.state().offset = align(d.state().offset, 8) |
246 value := binary.LittleEndian.Uint64(d.buf[d.state().offset:]) | 242 value := binary.LittleEndian.Uint64(d.buf[d.state().offset:]) |
247 d.state().skipBytes(8) | 243 d.state().skipBytes(8) |
248 d.state().elementsProcessed++ | 244 d.state().elementsProcessed++ |
249 return value, nil | 245 return value, nil |
250 } | 246 } |
251 | 247 |
252 // ReadFloat32 reads a float32 value. | 248 // ReadFloat32 reads a float32 value. |
253 func (d *Decoder) ReadFloat32() (float32, error) { | 249 func (d *Decoder) ReadFloat32() (float32, error) { |
254 bits, err := d.ReadUint32() | 250 bits, err := d.ReadUint32() |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 newEnd := uint64(oldEnd) + pointer | 293 newEnd := uint64(oldEnd) + pointer |
298 if newEnd >= uint64(len(d.buf)) { | 294 if newEnd >= uint64(len(d.buf)) { |
299 return 0, fmt.Errorf("trying to access out of range memory") | 295 return 0, fmt.Errorf("trying to access out of range memory") |
300 } | 296 } |
301 if newEnd < uint64(d.end) { | 297 if newEnd < uint64(d.end) { |
302 return 0, fmt.Errorf("trying to access memory out of order") | 298 return 0, fmt.Errorf("trying to access memory out of order") |
303 } | 299 } |
304 if newEnd%8 != 0 { | 300 if newEnd%8 != 0 { |
305 return 0, fmt.Errorf("incorrect pointer data alignment: %d", new
End) | 301 return 0, fmt.Errorf("incorrect pointer data alignment: %d", new
End) |
306 } | 302 } |
307 » d.claimData(int(newEnd) - d.end) | 303 » d.claimData(d.end - int(newEnd)) |
308 return pointer, nil | 304 return pointer, nil |
309 } | 305 } |
310 | 306 |
311 // ReadUntypedHandle reads an untyped handle. | 307 // ReadMessagePipeHandle reads a message pipe handle. |
312 func (d *Decoder) ReadUntypedHandle() (system.UntypedHandle, error) { | 308 func (d *Decoder) ReadMessagePipeHandle() (system.MessagePipeHandle, error) { |
313 handleIndex, err := d.ReadUint32() | 309 handleIndex, err := d.ReadUint32() |
314 if err != nil { | 310 if err != nil { |
315 return nil, err | 311 return nil, err |
316 } | 312 } |
317 » if handleIndex == ^uint32(0) { | 313 » untypedHandle, err := d.claimHandle(int(handleIndex)) |
318 » » return &InvalidHandle{}, nil | 314 » return untypedHandle.ToMessagePipeHandle(), err |
319 » } | |
320 » return d.claimHandle(int(handleIndex)) | |
321 } | 315 } |
322 | |
323 // ReadHandle reads a handle. | |
324 func (d *Decoder) ReadHandle() (system.Handle, error) { | |
325 return d.ReadUntypedHandle() | |
326 } | |
327 | |
328 // ReadMessagePipeHandle reads a message pipe handle. | |
329 func (d *Decoder) ReadMessagePipeHandle() (system.MessagePipeHandle, error) { | |
330 if handle, err := d.ReadUntypedHandle(); err != nil { | |
331 return nil, err | |
332 } else { | |
333 return handle.ToMessagePipeHandle(), nil | |
334 } | |
335 } | |
336 | |
337 // ReadConsumerHandle reads a data pipe consumer handle. | |
338 func (d *Decoder) ReadConsumerHandle() (system.ConsumerHandle, error) { | |
339 if handle, err := d.ReadUntypedHandle(); err != nil { | |
340 return nil, err | |
341 } else { | |
342 return handle.ToConsumerHandle(), nil | |
343 } | |
344 } | |
345 | |
346 // ReadProducerHandle reads a data pipe producer handle. | |
347 func (d *Decoder) ReadProducerHandle() (system.ProducerHandle, error) { | |
348 if handle, err := d.ReadUntypedHandle(); err != nil { | |
349 return nil, err | |
350 } else { | |
351 return handle.ToProducerHandle(), nil | |
352 } | |
353 } | |
354 | |
355 // ReadSharedBufferHandle reads a shared buffer handle. | |
356 func (d *Decoder) ReadSharedBufferHandle() (system.SharedBufferHandle, error) { | |
357 if handle, err := d.ReadUntypedHandle(); err != nil { | |
358 return nil, err | |
359 } else { | |
360 return handle.ToSharedBufferHandle(), nil | |
361 } | |
362 } | |
OLD | NEW |