blob: 5fc0d8a07a9b80e31607bbd88d385617a5eb0aa7 [file] [log] [blame]
Don Newton379ae252019-04-01 12:17:06 -04001// Copyright (C) MongoDB, Inc. 2017-present.
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may
4// not use this file except in compliance with the License. You may obtain
5// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
7package bsonrw
8
9import (
10 "bytes"
11 "encoding/binary"
12 "errors"
13 "fmt"
14 "io"
15 "math"
16 "sync"
17 "unicode"
18
19 "github.com/mongodb/mongo-go-driver/bson/bsontype"
20 "github.com/mongodb/mongo-go-driver/bson/primitive"
21)
22
23var _ ValueReader = (*valueReader)(nil)
24
25var vrPool = sync.Pool{
26 New: func() interface{} {
27 return new(valueReader)
28 },
29}
30
31// BSONValueReaderPool is a pool for ValueReaders that read BSON.
32type BSONValueReaderPool struct {
33 pool sync.Pool
34}
35
36// NewBSONValueReaderPool instantiates a new BSONValueReaderPool.
37func NewBSONValueReaderPool() *BSONValueReaderPool {
38 return &BSONValueReaderPool{
39 pool: sync.Pool{
40 New: func() interface{} {
41 return new(valueReader)
42 },
43 },
44 }
45}
46
47// Get retrieves a ValueReader from the pool and uses src as the underlying BSON.
48func (bvrp *BSONValueReaderPool) Get(src []byte) ValueReader {
49 vr := bvrp.pool.Get().(*valueReader)
50 vr.reset(src)
51 return vr
52}
53
54// Put inserts a ValueReader into the pool. If the ValueReader is not a BSON ValueReader nothing
55// is inserted into the pool and ok will be false.
56func (bvrp *BSONValueReaderPool) Put(vr ValueReader) (ok bool) {
57 bvr, ok := vr.(*valueReader)
58 if !ok {
59 return false
60 }
61
62 bvr.reset(nil)
63 bvrp.pool.Put(bvr)
64 return true
65}
66
67// ErrEOA is the error returned when the end of a BSON array has been reached.
68var ErrEOA = errors.New("end of array")
69
70// ErrEOD is the error returned when the end of a BSON document has been reached.
71var ErrEOD = errors.New("end of document")
72
73type vrState struct {
74 mode mode
75 vType bsontype.Type
76 end int64
77}
78
79// valueReader is for reading BSON values.
80type valueReader struct {
81 offset int64
82 d []byte
83
84 stack []vrState
85 frame int64
86}
87
88// NewBSONDocumentReader returns a ValueReader using b for the underlying BSON
89// representation. Parameter b must be a BSON Document.
90//
91// TODO(skriptble): There's a lack of symmetry between the reader and writer, since the reader takes
92// a []byte while the writer takes an io.Writer. We should have two versions of each, one that takes
93// a []byte and one that takes an io.Reader or io.Writer. The []byte version will need to return a
94// thing that can return the finished []byte since it might be reallocated when appended to.
95func NewBSONDocumentReader(b []byte) ValueReader {
96 return newValueReader(b)
97}
98
99// NewBSONValueReader returns a ValueReader that starts in the Value mode instead of in top
100// level document mode. This enables the creation of a ValueReader for a single BSON value.
101func NewBSONValueReader(t bsontype.Type, val []byte) ValueReader {
102 stack := make([]vrState, 1, 5)
103 stack[0] = vrState{
104 mode: mValue,
105 vType: t,
106 }
107 return &valueReader{
108 d: val,
109 stack: stack,
110 }
111}
112
113func newValueReader(b []byte) *valueReader {
114 stack := make([]vrState, 1, 5)
115 stack[0] = vrState{
116 mode: mTopLevel,
117 }
118 return &valueReader{
119 d: b,
120 stack: stack,
121 }
122}
123
124func (vr *valueReader) reset(b []byte) {
125 if vr.stack == nil {
126 vr.stack = make([]vrState, 1, 5)
127 }
128 vr.stack = vr.stack[:1]
129 vr.stack[0] = vrState{mode: mTopLevel}
130 vr.d = b
131 vr.offset = 0
132 vr.frame = 0
133}
134
135func (vr *valueReader) advanceFrame() {
136 if vr.frame+1 >= int64(len(vr.stack)) { // We need to grow the stack
137 length := len(vr.stack)
138 if length+1 >= cap(vr.stack) {
139 // double it
140 buf := make([]vrState, 2*cap(vr.stack)+1)
141 copy(buf, vr.stack)
142 vr.stack = buf
143 }
144 vr.stack = vr.stack[:length+1]
145 }
146 vr.frame++
147
148 // Clean the stack
149 vr.stack[vr.frame].mode = 0
150 vr.stack[vr.frame].vType = 0
151 vr.stack[vr.frame].end = 0
152}
153
154func (vr *valueReader) pushDocument() error {
155 vr.advanceFrame()
156
157 vr.stack[vr.frame].mode = mDocument
158
159 size, err := vr.readLength()
160 if err != nil {
161 return err
162 }
163 vr.stack[vr.frame].end = int64(size) + vr.offset - 4
164
165 return nil
166}
167
168func (vr *valueReader) pushArray() error {
169 vr.advanceFrame()
170
171 vr.stack[vr.frame].mode = mArray
172
173 size, err := vr.readLength()
174 if err != nil {
175 return err
176 }
177 vr.stack[vr.frame].end = int64(size) + vr.offset - 4
178
179 return nil
180}
181
182func (vr *valueReader) pushElement(t bsontype.Type) {
183 vr.advanceFrame()
184
185 vr.stack[vr.frame].mode = mElement
186 vr.stack[vr.frame].vType = t
187}
188
189func (vr *valueReader) pushValue(t bsontype.Type) {
190 vr.advanceFrame()
191
192 vr.stack[vr.frame].mode = mValue
193 vr.stack[vr.frame].vType = t
194}
195
196func (vr *valueReader) pushCodeWithScope() (int64, error) {
197 vr.advanceFrame()
198
199 vr.stack[vr.frame].mode = mCodeWithScope
200
201 size, err := vr.readLength()
202 if err != nil {
203 return 0, err
204 }
205 vr.stack[vr.frame].end = int64(size) + vr.offset - 4
206
207 return int64(size), nil
208}
209
210func (vr *valueReader) pop() {
211 switch vr.stack[vr.frame].mode {
212 case mElement, mValue:
213 vr.frame--
214 case mDocument, mArray, mCodeWithScope:
215 vr.frame -= 2 // we pop twice to jump over the vrElement: vrDocument -> vrElement -> vrDocument/TopLevel/etc...
216 }
217}
218
219func (vr *valueReader) invalidTransitionErr(destination mode, name string, modes []mode) error {
220 te := TransitionError{
221 name: name,
222 current: vr.stack[vr.frame].mode,
223 destination: destination,
224 modes: modes,
225 action: "read",
226 }
227 if vr.frame != 0 {
228 te.parent = vr.stack[vr.frame-1].mode
229 }
230 return te
231}
232
233func (vr *valueReader) typeError(t bsontype.Type) error {
234 return fmt.Errorf("positioned on %s, but attempted to read %s", vr.stack[vr.frame].vType, t)
235}
236
237func (vr *valueReader) invalidDocumentLengthError() error {
238 return fmt.Errorf("document is invalid, end byte is at %d, but null byte found at %d", vr.stack[vr.frame].end, vr.offset)
239}
240
241func (vr *valueReader) ensureElementValue(t bsontype.Type, destination mode, callerName string) error {
242 switch vr.stack[vr.frame].mode {
243 case mElement, mValue:
244 if vr.stack[vr.frame].vType != t {
245 return vr.typeError(t)
246 }
247 default:
248 return vr.invalidTransitionErr(destination, callerName, []mode{mElement, mValue})
249 }
250
251 return nil
252}
253
254func (vr *valueReader) Type() bsontype.Type {
255 return vr.stack[vr.frame].vType
256}
257
258func (vr *valueReader) nextElementLength() (int32, error) {
259 var length int32
260 var err error
261 switch vr.stack[vr.frame].vType {
262 case bsontype.Array, bsontype.EmbeddedDocument, bsontype.CodeWithScope:
263 length, err = vr.peekLength()
264 case bsontype.Binary:
265 length, err = vr.peekLength()
266 length += 4 + 1 // binary length + subtype byte
267 case bsontype.Boolean:
268 length = 1
269 case bsontype.DBPointer:
270 length, err = vr.peekLength()
271 length += 4 + 12 // string length + ObjectID length
272 case bsontype.DateTime, bsontype.Double, bsontype.Int64, bsontype.Timestamp:
273 length = 8
274 case bsontype.Decimal128:
275 length = 16
276 case bsontype.Int32:
277 length = 4
278 case bsontype.JavaScript, bsontype.String, bsontype.Symbol:
279 length, err = vr.peekLength()
280 length += 4
281 case bsontype.MaxKey, bsontype.MinKey, bsontype.Null, bsontype.Undefined:
282 length = 0
283 case bsontype.ObjectID:
284 length = 12
285 case bsontype.Regex:
286 regex := bytes.IndexByte(vr.d[vr.offset:], 0x00)
287 if regex < 0 {
288 err = io.EOF
289 break
290 }
291 pattern := bytes.IndexByte(vr.d[regex+1:], 0x00)
292 if pattern < 0 {
293 err = io.EOF
294 break
295 }
296 length = int32(int64(regex) + 1 + int64(pattern) + 1 - vr.offset)
297 default:
298 return 0, fmt.Errorf("attempted to read bytes of unknown BSON type %v", vr.stack[vr.frame].vType)
299 }
300
301 return length, err
302}
303
304func (vr *valueReader) ReadValueBytes(dst []byte) (bsontype.Type, []byte, error) {
305 switch vr.stack[vr.frame].mode {
306 case mTopLevel:
307 length, err := vr.peekLength()
308 if err != nil {
309 return bsontype.Type(0), nil, err
310 }
311 dst, err = vr.appendBytes(dst, length)
312 if err != nil {
313 return bsontype.Type(0), nil, err
314 }
315 return bsontype.Type(0), dst, nil
316 case mElement, mValue:
317 length, err := vr.nextElementLength()
318 if err != nil {
319 return bsontype.Type(0), dst, err
320 }
321
322 dst, err = vr.appendBytes(dst, length)
323 t := vr.stack[vr.frame].vType
324 vr.pop()
325 return t, dst, err
326 default:
327 return bsontype.Type(0), nil, vr.invalidTransitionErr(0, "ReadValueBytes", []mode{mElement, mValue})
328 }
329}
330
331func (vr *valueReader) Skip() error {
332 switch vr.stack[vr.frame].mode {
333 case mElement, mValue:
334 default:
335 return vr.invalidTransitionErr(0, "Skip", []mode{mElement, mValue})
336 }
337
338 length, err := vr.nextElementLength()
339 if err != nil {
340 return err
341 }
342
343 err = vr.skipBytes(length)
344 vr.pop()
345 return err
346}
347
348func (vr *valueReader) ReadArray() (ArrayReader, error) {
349 if err := vr.ensureElementValue(bsontype.Array, mArray, "ReadArray"); err != nil {
350 return nil, err
351 }
352
353 err := vr.pushArray()
354 if err != nil {
355 return nil, err
356 }
357
358 return vr, nil
359}
360
361func (vr *valueReader) ReadBinary() (b []byte, btype byte, err error) {
362 if err := vr.ensureElementValue(bsontype.Binary, 0, "ReadBinary"); err != nil {
363 return nil, 0, err
364 }
365
366 length, err := vr.readLength()
367 if err != nil {
368 return nil, 0, err
369 }
370
371 btype, err = vr.readByte()
372 if err != nil {
373 return nil, 0, err
374 }
375
376 if btype == 0x02 {
377 length, err = vr.readLength()
378 if err != nil {
379 return nil, 0, err
380 }
381 }
382
383 b, err = vr.readBytes(length)
384 if err != nil {
385 return nil, 0, err
386 }
387
388 vr.pop()
389 return b, btype, nil
390}
391
392func (vr *valueReader) ReadBoolean() (bool, error) {
393 if err := vr.ensureElementValue(bsontype.Boolean, 0, "ReadBoolean"); err != nil {
394 return false, err
395 }
396
397 b, err := vr.readByte()
398 if err != nil {
399 return false, err
400 }
401
402 if b > 1 {
403 return false, fmt.Errorf("invalid byte for boolean, %b", b)
404 }
405
406 vr.pop()
407 return b == 1, nil
408}
409
410func (vr *valueReader) ReadDocument() (DocumentReader, error) {
411 switch vr.stack[vr.frame].mode {
412 case mTopLevel:
413 // read size
414 size, err := vr.readLength()
415 if err != nil {
416 return nil, err
417 }
418 if int(size) != len(vr.d) {
419 return nil, fmt.Errorf("invalid document length")
420 }
421 vr.stack[vr.frame].end = int64(size) + vr.offset - 4
422 return vr, nil
423 case mElement, mValue:
424 if vr.stack[vr.frame].vType != bsontype.EmbeddedDocument {
425 return nil, vr.typeError(bsontype.EmbeddedDocument)
426 }
427 default:
428 return nil, vr.invalidTransitionErr(mDocument, "ReadDocument", []mode{mTopLevel, mElement, mValue})
429 }
430
431 err := vr.pushDocument()
432 if err != nil {
433 return nil, err
434 }
435
436 return vr, nil
437}
438
439func (vr *valueReader) ReadCodeWithScope() (code string, dr DocumentReader, err error) {
440 if err := vr.ensureElementValue(bsontype.CodeWithScope, 0, "ReadCodeWithScope"); err != nil {
441 return "", nil, err
442 }
443
444 totalLength, err := vr.readLength()
445 if err != nil {
446 return "", nil, err
447 }
448 strLength, err := vr.readLength()
449 if err != nil {
450 return "", nil, err
451 }
452 strBytes, err := vr.readBytes(strLength)
453 if err != nil {
454 return "", nil, err
455 }
456 code = string(strBytes[:len(strBytes)-1])
457
458 size, err := vr.pushCodeWithScope()
459 if err != nil {
460 return "", nil, err
461 }
462
463 // The total length should equal:
464 // 4 (total length) + strLength + 4 (the length of str itself) + (document length)
465 componentsLength := int64(4+strLength+4) + size
466 if int64(totalLength) != componentsLength {
467 return "", nil, fmt.Errorf(
468 "length of CodeWithScope does not match lengths of components; total: %d; components: %d",
469 totalLength, componentsLength,
470 )
471 }
472 return code, vr, nil
473}
474
475func (vr *valueReader) ReadDBPointer() (ns string, oid primitive.ObjectID, err error) {
476 if err := vr.ensureElementValue(bsontype.DBPointer, 0, "ReadDBPointer"); err != nil {
477 return "", oid, err
478 }
479
480 ns, err = vr.readString()
481 if err != nil {
482 return "", oid, err
483 }
484
485 oidbytes, err := vr.readBytes(12)
486 if err != nil {
487 return "", oid, err
488 }
489
490 copy(oid[:], oidbytes)
491
492 vr.pop()
493 return ns, oid, nil
494}
495
496func (vr *valueReader) ReadDateTime() (int64, error) {
497 if err := vr.ensureElementValue(bsontype.DateTime, 0, "ReadDateTime"); err != nil {
498 return 0, err
499 }
500
501 i, err := vr.readi64()
502 if err != nil {
503 return 0, err
504 }
505
506 vr.pop()
507 return i, nil
508}
509
510func (vr *valueReader) ReadDecimal128() (primitive.Decimal128, error) {
511 if err := vr.ensureElementValue(bsontype.Decimal128, 0, "ReadDecimal128"); err != nil {
512 return primitive.Decimal128{}, err
513 }
514
515 b, err := vr.readBytes(16)
516 if err != nil {
517 return primitive.Decimal128{}, err
518 }
519
520 l := binary.LittleEndian.Uint64(b[0:8])
521 h := binary.LittleEndian.Uint64(b[8:16])
522
523 vr.pop()
524 return primitive.NewDecimal128(h, l), nil
525}
526
527func (vr *valueReader) ReadDouble() (float64, error) {
528 if err := vr.ensureElementValue(bsontype.Double, 0, "ReadDouble"); err != nil {
529 return 0, err
530 }
531
532 u, err := vr.readu64()
533 if err != nil {
534 return 0, err
535 }
536
537 vr.pop()
538 return math.Float64frombits(u), nil
539}
540
541func (vr *valueReader) ReadInt32() (int32, error) {
542 if err := vr.ensureElementValue(bsontype.Int32, 0, "ReadInt32"); err != nil {
543 return 0, err
544 }
545
546 vr.pop()
547 return vr.readi32()
548}
549
550func (vr *valueReader) ReadInt64() (int64, error) {
551 if err := vr.ensureElementValue(bsontype.Int64, 0, "ReadInt64"); err != nil {
552 return 0, err
553 }
554
555 vr.pop()
556 return vr.readi64()
557}
558
559func (vr *valueReader) ReadJavascript() (code string, err error) {
560 if err := vr.ensureElementValue(bsontype.JavaScript, 0, "ReadJavascript"); err != nil {
561 return "", err
562 }
563
564 vr.pop()
565 return vr.readString()
566}
567
568func (vr *valueReader) ReadMaxKey() error {
569 if err := vr.ensureElementValue(bsontype.MaxKey, 0, "ReadMaxKey"); err != nil {
570 return err
571 }
572
573 vr.pop()
574 return nil
575}
576
577func (vr *valueReader) ReadMinKey() error {
578 if err := vr.ensureElementValue(bsontype.MinKey, 0, "ReadMinKey"); err != nil {
579 return err
580 }
581
582 vr.pop()
583 return nil
584}
585
586func (vr *valueReader) ReadNull() error {
587 if err := vr.ensureElementValue(bsontype.Null, 0, "ReadNull"); err != nil {
588 return err
589 }
590
591 vr.pop()
592 return nil
593}
594
595func (vr *valueReader) ReadObjectID() (primitive.ObjectID, error) {
596 if err := vr.ensureElementValue(bsontype.ObjectID, 0, "ReadObjectID"); err != nil {
597 return primitive.ObjectID{}, err
598 }
599
600 oidbytes, err := vr.readBytes(12)
601 if err != nil {
602 return primitive.ObjectID{}, err
603 }
604
605 var oid primitive.ObjectID
606 copy(oid[:], oidbytes)
607
608 vr.pop()
609 return oid, nil
610}
611
612func (vr *valueReader) ReadRegex() (string, string, error) {
613 if err := vr.ensureElementValue(bsontype.Regex, 0, "ReadRegex"); err != nil {
614 return "", "", err
615 }
616
617 pattern, err := vr.readCString()
618 if err != nil {
619 return "", "", err
620 }
621
622 options, err := vr.readCString()
623 if err != nil {
624 return "", "", err
625 }
626
627 vr.pop()
628 return pattern, options, nil
629}
630
631func (vr *valueReader) ReadString() (string, error) {
632 if err := vr.ensureElementValue(bsontype.String, 0, "ReadString"); err != nil {
633 return "", err
634 }
635
636 vr.pop()
637 return vr.readString()
638}
639
640func (vr *valueReader) ReadSymbol() (symbol string, err error) {
641 if err := vr.ensureElementValue(bsontype.Symbol, 0, "ReadSymbol"); err != nil {
642 return "", err
643 }
644
645 vr.pop()
646 return vr.readString()
647}
648
649func (vr *valueReader) ReadTimestamp() (t uint32, i uint32, err error) {
650 if err := vr.ensureElementValue(bsontype.Timestamp, 0, "ReadTimestamp"); err != nil {
651 return 0, 0, err
652 }
653
654 i, err = vr.readu32()
655 if err != nil {
656 return 0, 0, err
657 }
658
659 t, err = vr.readu32()
660 if err != nil {
661 return 0, 0, err
662 }
663
664 vr.pop()
665 return t, i, nil
666}
667
668func (vr *valueReader) ReadUndefined() error {
669 if err := vr.ensureElementValue(bsontype.Undefined, 0, "ReadUndefined"); err != nil {
670 return err
671 }
672
673 vr.pop()
674 return nil
675}
676
677func (vr *valueReader) ReadElement() (string, ValueReader, error) {
678 switch vr.stack[vr.frame].mode {
679 case mTopLevel, mDocument, mCodeWithScope:
680 default:
681 return "", nil, vr.invalidTransitionErr(mElement, "ReadElement", []mode{mTopLevel, mDocument, mCodeWithScope})
682 }
683
684 t, err := vr.readByte()
685 if err != nil {
686 return "", nil, err
687 }
688
689 if t == 0 {
690 if vr.offset != vr.stack[vr.frame].end {
691 return "", nil, vr.invalidDocumentLengthError()
692 }
693
694 vr.pop()
695 return "", nil, ErrEOD
696 }
697
698 name, err := vr.readCString()
699 if err != nil {
700 return "", nil, err
701 }
702
703 vr.pushElement(bsontype.Type(t))
704 return name, vr, nil
705}
706
707func (vr *valueReader) ReadValue() (ValueReader, error) {
708 switch vr.stack[vr.frame].mode {
709 case mArray:
710 default:
711 return nil, vr.invalidTransitionErr(mValue, "ReadValue", []mode{mArray})
712 }
713
714 t, err := vr.readByte()
715 if err != nil {
716 return nil, err
717 }
718
719 if t == 0 {
720 if vr.offset != vr.stack[vr.frame].end {
721 return nil, vr.invalidDocumentLengthError()
722 }
723
724 vr.pop()
725 return nil, ErrEOA
726 }
727
728 _, err = vr.readCString()
729 if err != nil {
730 return nil, err
731 }
732
733 vr.pushValue(bsontype.Type(t))
734 return vr, nil
735}
736
737func (vr *valueReader) readBytes(length int32) ([]byte, error) {
738 if length < 0 {
739 return nil, fmt.Errorf("invalid length: %d", length)
740 }
741
742 if vr.offset+int64(length) > int64(len(vr.d)) {
743 return nil, io.EOF
744 }
745
746 start := vr.offset
747 vr.offset += int64(length)
748 return vr.d[start : start+int64(length)], nil
749}
750
751func (vr *valueReader) appendBytes(dst []byte, length int32) ([]byte, error) {
752 if vr.offset+int64(length) > int64(len(vr.d)) {
753 return nil, io.EOF
754 }
755
756 start := vr.offset
757 vr.offset += int64(length)
758 return append(dst, vr.d[start:start+int64(length)]...), nil
759}
760
761func (vr *valueReader) skipBytes(length int32) error {
762 if vr.offset+int64(length) > int64(len(vr.d)) {
763 return io.EOF
764 }
765
766 vr.offset += int64(length)
767 return nil
768}
769
770func (vr *valueReader) readByte() (byte, error) {
771 if vr.offset+1 > int64(len(vr.d)) {
772 return 0x0, io.EOF
773 }
774
775 vr.offset++
776 return vr.d[vr.offset-1], nil
777}
778
779func (vr *valueReader) readCString() (string, error) {
780 idx := bytes.IndexByte(vr.d[vr.offset:], 0x00)
781 if idx < 0 {
782 return "", io.EOF
783 }
784 start := vr.offset
785 // idx does not include the null byte
786 vr.offset += int64(idx) + 1
787 return string(vr.d[start : start+int64(idx)]), nil
788}
789
790func (vr *valueReader) skipCString() error {
791 idx := bytes.IndexByte(vr.d[vr.offset:], 0x00)
792 if idx < 0 {
793 return io.EOF
794 }
795 // idx does not include the null byte
796 vr.offset += int64(idx) + 1
797 return nil
798}
799
800func (vr *valueReader) readString() (string, error) {
801 length, err := vr.readLength()
802 if err != nil {
803 return "", err
804 }
805
806 if int64(length)+vr.offset > int64(len(vr.d)) {
807 return "", io.EOF
808 }
809
810 if length <= 0 {
811 return "", fmt.Errorf("invalid string length: %d", length)
812 }
813
814 if vr.d[vr.offset+int64(length)-1] != 0x00 {
815 return "", fmt.Errorf("string does not end with null byte, but with %v", vr.d[vr.offset+int64(length)-1])
816 }
817
818 start := vr.offset
819 vr.offset += int64(length)
820
821 if length == 2 {
822 asciiByte := vr.d[start]
823 if asciiByte > unicode.MaxASCII {
824 return "", fmt.Errorf("invalid ascii byte")
825 }
826 }
827
828 return string(vr.d[start : start+int64(length)-1]), nil
829}
830
831func (vr *valueReader) peekLength() (int32, error) {
832 if vr.offset+4 > int64(len(vr.d)) {
833 return 0, io.EOF
834 }
835
836 idx := vr.offset
837 return (int32(vr.d[idx]) | int32(vr.d[idx+1])<<8 | int32(vr.d[idx+2])<<16 | int32(vr.d[idx+3])<<24), nil
838}
839
840func (vr *valueReader) readLength() (int32, error) { return vr.readi32() }
841
842func (vr *valueReader) readi32() (int32, error) {
843 if vr.offset+4 > int64(len(vr.d)) {
844 return 0, io.EOF
845 }
846
847 idx := vr.offset
848 vr.offset += 4
849 return (int32(vr.d[idx]) | int32(vr.d[idx+1])<<8 | int32(vr.d[idx+2])<<16 | int32(vr.d[idx+3])<<24), nil
850}
851
852func (vr *valueReader) readu32() (uint32, error) {
853 if vr.offset+4 > int64(len(vr.d)) {
854 return 0, io.EOF
855 }
856
857 idx := vr.offset
858 vr.offset += 4
859 return (uint32(vr.d[idx]) | uint32(vr.d[idx+1])<<8 | uint32(vr.d[idx+2])<<16 | uint32(vr.d[idx+3])<<24), nil
860}
861
862func (vr *valueReader) readi64() (int64, error) {
863 if vr.offset+8 > int64(len(vr.d)) {
864 return 0, io.EOF
865 }
866
867 idx := vr.offset
868 vr.offset += 8
869 return int64(vr.d[idx]) | int64(vr.d[idx+1])<<8 | int64(vr.d[idx+2])<<16 | int64(vr.d[idx+3])<<24 |
870 int64(vr.d[idx+4])<<32 | int64(vr.d[idx+5])<<40 | int64(vr.d[idx+6])<<48 | int64(vr.d[idx+7])<<56, nil
871}
872
873func (vr *valueReader) readu64() (uint64, error) {
874 if vr.offset+8 > int64(len(vr.d)) {
875 return 0, io.EOF
876 }
877
878 idx := vr.offset
879 vr.offset += 8
880 return uint64(vr.d[idx]) | uint64(vr.d[idx+1])<<8 | uint64(vr.d[idx+2])<<16 | uint64(vr.d[idx+3])<<24 |
881 uint64(vr.d[idx+4])<<32 | uint64(vr.d[idx+5])<<40 | uint64(vr.d[idx+6])<<48 | uint64(vr.d[idx+7])<<56, nil
882}