1
2
3
4
5
6
7 package jsontext
8
9 import (
10 "bytes"
11 "errors"
12 "io"
13
14 "encoding/json/internal/jsonflags"
15 "encoding/json/internal/jsonopts"
16 "encoding/json/internal/jsonwire"
17 )
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 type Decoder struct {
79 s decoderState
80 }
81
82
83
84 type decoderState struct {
85 state
86 decodeBuffer
87 jsonopts.Struct
88
89 StringCache *[256]string
90 }
91
92
93
94
95
96
97
98
99
100
101
102 type decodeBuffer struct {
103 peekPos int
104 peekErr error
105
106 buf []byte
107 prevStart int
108 prevEnd int
109
110
111
112 baseOffset int64
113
114 rd io.Reader
115 }
116
117
118
119
120
121
122 func NewDecoder(r io.Reader, opts ...Options) *Decoder {
123 d := new(Decoder)
124 d.Reset(r, opts...)
125 return d
126 }
127
128
129
130
131
132 func (d *Decoder) Reset(r io.Reader, opts ...Options) {
133 switch {
134 case d == nil:
135 panic("jsontext: invalid nil Decoder")
136 case r == nil:
137 panic("jsontext: invalid nil io.Reader")
138 case d.s.Flags.Get(jsonflags.WithinArshalCall):
139 panic("jsontext: cannot reset Decoder passed to json.UnmarshalerFrom")
140 }
141 d.s.reset(nil, r, opts...)
142 }
143
144 func (d *decoderState) reset(b []byte, r io.Reader, opts ...Options) {
145 d.state.reset()
146 d.decodeBuffer = decodeBuffer{buf: b, rd: r}
147 opts2 := jsonopts.Struct{}
148 opts2.Join(opts...)
149 d.Struct = opts2
150 }
151
152
153
154
155
156
157
158
159
160 func (d *Decoder) Options() Options {
161 return &d.s.Struct
162 }
163
164 var errBufferWriteAfterNext = errors.New("invalid bytes.Buffer.Write call after calling bytes.Buffer.Next")
165
166
167
168 func (d *decoderState) fetch() error {
169 if d.rd == nil {
170 return io.ErrUnexpectedEOF
171 }
172
173
174 d.Names.copyQuotedBuffer(d.buf)
175
176
177 if bb, ok := d.rd.(*bytes.Buffer); ok {
178 switch {
179 case bb.Len() == 0:
180 return io.ErrUnexpectedEOF
181 case len(d.buf) == 0:
182 d.buf = bb.Next(bb.Len())
183 return nil
184 default:
185
186
187
188
189
190
191
192
193 return &ioError{action: "read", err: errBufferWriteAfterNext}
194 }
195 }
196
197
198 if cap(d.buf) == 0 {
199 d.buf = make([]byte, 0, 64)
200 }
201
202
203 const maxBufferSize = 4 << 10
204 const growthSizeFactor = 2
205 const growthRateFactor = 2
206
207 grow := cap(d.buf) <= maxBufferSize/growthSizeFactor
208
209
210 grow = grow && int64(cap(d.buf)) < d.previousOffsetEnd()/growthRateFactor
211
212
213
214
215 grow = grow || (d.prevStart == 0 && len(d.buf) >= 3*cap(d.buf)/4)
216
217 if grow {
218
219
220 buf := make([]byte, 0, cap(d.buf)*growthSizeFactor)
221 d.buf = append(buf, d.buf[d.prevStart:]...)
222 } else {
223
224 n := copy(d.buf[:cap(d.buf)], d.buf[d.prevStart:])
225 d.buf = d.buf[:n]
226 }
227 d.baseOffset += int64(d.prevStart)
228 d.prevEnd -= d.prevStart
229 d.prevStart = 0
230
231
232 for {
233 n, err := d.rd.Read(d.buf[len(d.buf):cap(d.buf)])
234 switch {
235 case n > 0:
236 d.buf = d.buf[:len(d.buf)+n]
237 return nil
238 case err == io.EOF:
239 return io.ErrUnexpectedEOF
240 case err != nil:
241 return &ioError{action: "read", err: err}
242 default:
243 continue
244 }
245 }
246 }
247
248 const invalidateBufferByte = '#'
249
250
251
252
253
254 func (d *decodeBuffer) invalidatePreviousRead() {
255
256
257 isBytesBuffer := func(r io.Reader) bool {
258 _, ok := r.(*bytes.Buffer)
259 return ok
260 }
261 if d.rd != nil && !isBytesBuffer(d.rd) && d.prevStart < d.prevEnd && uint(d.prevStart) < uint(len(d.buf)) {
262 d.buf[d.prevStart] = invalidateBufferByte
263 d.prevStart = d.prevEnd
264 }
265 }
266
267
268 func (d *decodeBuffer) needMore(pos int) bool {
269
270 return pos == len(d.buf)
271 }
272
273 func (d *decodeBuffer) offsetAt(pos int) int64 { return d.baseOffset + int64(pos) }
274 func (d *decodeBuffer) previousOffsetStart() int64 { return d.baseOffset + int64(d.prevStart) }
275 func (d *decodeBuffer) previousOffsetEnd() int64 { return d.baseOffset + int64(d.prevEnd) }
276 func (d *decodeBuffer) previousBuffer() []byte { return d.buf[d.prevStart:d.prevEnd] }
277 func (d *decodeBuffer) unreadBuffer() []byte { return d.buf[d.prevEnd:len(d.buf)] }
278
279
280
281
282
283 func (d *decodeBuffer) PreviousTokenOrValue() []byte {
284 b := d.previousBuffer()
285
286 if d.peekPos > 0 || len(b) > 0 && b[0] == invalidateBufferByte {
287 return nil
288 }
289
290
291 if len(b) == 0 {
292 b = d.buf[:d.prevEnd]
293 for _, tok := range []string{"null", "false", "true", "{", "}", "[", "]"} {
294 if len(b) >= len(tok) && string(b[len(b)-len(tok):]) == tok {
295 return b[len(b)-len(tok):]
296 }
297 }
298 }
299 return b
300 }
301
302
303
304
305
306
307 func (d *Decoder) PeekKind() Kind {
308 return d.s.PeekKind()
309 }
310 func (d *decoderState) PeekKind() Kind {
311
312 if d.peekPos > 0 {
313 return Kind(d.buf[d.peekPos]).normalize()
314 }
315
316 var err error
317 d.invalidatePreviousRead()
318 pos := d.prevEnd
319
320
321 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
322 if d.needMore(pos) {
323 if pos, err = d.consumeWhitespace(pos); err != nil {
324 if err == io.ErrUnexpectedEOF && d.Tokens.Depth() == 1 {
325 err = io.EOF
326 }
327 d.peekPos, d.peekErr = -1, wrapSyntacticError(d, err, pos, 0)
328 return invalidKind
329 }
330 }
331
332
333 var delim byte
334 if c := d.buf[pos]; c == ':' || c == ',' {
335 delim = c
336 pos += 1
337 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
338 if d.needMore(pos) {
339 if pos, err = d.consumeWhitespace(pos); err != nil {
340 err = wrapSyntacticError(d, err, pos, 0)
341 d.peekPos, d.peekErr = -1, d.checkDelimBeforeIOError(delim, err)
342 return invalidKind
343 }
344 }
345 }
346 next := Kind(d.buf[pos]).normalize()
347 if d.Tokens.needDelim(next) != delim {
348 d.peekPos, d.peekErr = -1, d.checkDelim(delim, next)
349 return invalidKind
350 }
351
352
353
354
355
356 d.peekPos, d.peekErr = pos, nil
357 return next
358 }
359
360
361
362 func (d *decoderState) checkDelimBeforeIOError(delim byte, err error) error {
363
364
365
366
367
368 const next = Kind('"')
369 if d.Tokens.needDelim(next) != delim {
370 err = d.checkDelim(delim, next)
371 }
372 return err
373 }
374
375
376
377
378 func (d *decoderState) CountNextDelimWhitespace() int {
379 d.PeekKind()
380 return len(d.unreadBuffer()) - len(bytes.TrimLeft(d.unreadBuffer(), ",: \n\r\t"))
381 }
382
383
384 func (d *decoderState) checkDelim(delim byte, next Kind) error {
385 where := "at start of value"
386 switch d.Tokens.needDelim(next) {
387 case delim:
388 return nil
389 case ':':
390 where = "after object name (expecting ':')"
391 case ',':
392 if d.Tokens.Last.isObject() {
393 where = "after object value (expecting ',' or '}')"
394 } else {
395 where = "after array element (expecting ',' or ']')"
396 }
397 }
398 pos := d.prevEnd
399 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
400 err := jsonwire.NewInvalidCharacterError(d.buf[pos:], where)
401 return wrapSyntacticError(d, err, pos, 0)
402 }
403
404
405
406 func (d *Decoder) SkipValue() error {
407 return d.s.SkipValue()
408 }
409 func (d *decoderState) SkipValue() error {
410 switch d.PeekKind() {
411 case '{', '[':
412
413
414 depth := d.Tokens.Depth()
415 for {
416 if _, err := d.ReadToken(); err != nil {
417 return err
418 }
419 if depth >= d.Tokens.Depth() {
420 return nil
421 }
422 }
423 default:
424
425
426 var flags jsonwire.ValueFlags
427 if _, err := d.ReadValue(&flags); err != nil {
428 return err
429 }
430 return nil
431 }
432 }
433
434
435
436 func (d *decoderState) SkipValueRemainder() error {
437 if d.Tokens.Depth()-1 > 0 && d.Tokens.Last.Length() == 0 {
438 for n := d.Tokens.Depth(); d.Tokens.Depth() >= n; {
439 if _, err := d.ReadToken(); err != nil {
440 return err
441 }
442 }
443 }
444 return nil
445 }
446
447
448
449 func (d *decoderState) SkipUntil(depth int, length int64) error {
450 for d.Tokens.Depth() > depth || (d.Tokens.Depth() == depth && d.Tokens.Last.Length() < length) {
451 if _, err := d.ReadToken(); err != nil {
452 return err
453 }
454 }
455 return nil
456 }
457
458
459
460
461 func (d *Decoder) ReadToken() (Token, error) {
462 return d.s.ReadToken()
463 }
464 func (d *decoderState) ReadToken() (Token, error) {
465
466 var err error
467 var next Kind
468 pos := d.peekPos
469 if pos != 0 {
470
471 if d.peekErr != nil {
472 err := d.peekErr
473 d.peekPos, d.peekErr = 0, nil
474 return Token{}, err
475 }
476 next = Kind(d.buf[pos]).normalize()
477 d.peekPos = 0
478 } else {
479 d.invalidatePreviousRead()
480 pos = d.prevEnd
481
482
483 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
484 if d.needMore(pos) {
485 if pos, err = d.consumeWhitespace(pos); err != nil {
486 if err == io.ErrUnexpectedEOF && d.Tokens.Depth() == 1 {
487 err = io.EOF
488 }
489 return Token{}, wrapSyntacticError(d, err, pos, 0)
490 }
491 }
492
493
494 var delim byte
495 if c := d.buf[pos]; c == ':' || c == ',' {
496 delim = c
497 pos += 1
498 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
499 if d.needMore(pos) {
500 if pos, err = d.consumeWhitespace(pos); err != nil {
501 err = wrapSyntacticError(d, err, pos, 0)
502 return Token{}, d.checkDelimBeforeIOError(delim, err)
503 }
504 }
505 }
506 next = Kind(d.buf[pos]).normalize()
507 if d.Tokens.needDelim(next) != delim {
508 return Token{}, d.checkDelim(delim, next)
509 }
510 }
511
512
513 var n int
514 switch next {
515 case 'n':
516 if jsonwire.ConsumeNull(d.buf[pos:]) == 0 {
517 pos, err = d.consumeLiteral(pos, "null")
518 if err != nil {
519 return Token{}, wrapSyntacticError(d, err, pos, +1)
520 }
521 } else {
522 pos += len("null")
523 }
524 if err = d.Tokens.appendLiteral(); err != nil {
525 return Token{}, wrapSyntacticError(d, err, pos-len("null"), +1)
526 }
527 d.prevStart, d.prevEnd = pos, pos
528 return Null, nil
529
530 case 'f':
531 if jsonwire.ConsumeFalse(d.buf[pos:]) == 0 {
532 pos, err = d.consumeLiteral(pos, "false")
533 if err != nil {
534 return Token{}, wrapSyntacticError(d, err, pos, +1)
535 }
536 } else {
537 pos += len("false")
538 }
539 if err = d.Tokens.appendLiteral(); err != nil {
540 return Token{}, wrapSyntacticError(d, err, pos-len("false"), +1)
541 }
542 d.prevStart, d.prevEnd = pos, pos
543 return False, nil
544
545 case 't':
546 if jsonwire.ConsumeTrue(d.buf[pos:]) == 0 {
547 pos, err = d.consumeLiteral(pos, "true")
548 if err != nil {
549 return Token{}, wrapSyntacticError(d, err, pos, +1)
550 }
551 } else {
552 pos += len("true")
553 }
554 if err = d.Tokens.appendLiteral(); err != nil {
555 return Token{}, wrapSyntacticError(d, err, pos-len("true"), +1)
556 }
557 d.prevStart, d.prevEnd = pos, pos
558 return True, nil
559
560 case '"':
561 var flags jsonwire.ValueFlags
562 if n = jsonwire.ConsumeSimpleString(d.buf[pos:]); n == 0 {
563 oldAbsPos := d.baseOffset + int64(pos)
564 pos, err = d.consumeString(&flags, pos)
565 newAbsPos := d.baseOffset + int64(pos)
566 n = int(newAbsPos - oldAbsPos)
567 if err != nil {
568 return Token{}, wrapSyntacticError(d, err, pos, +1)
569 }
570 } else {
571 pos += n
572 }
573 if d.Tokens.Last.NeedObjectName() {
574 if !d.Flags.Get(jsonflags.AllowDuplicateNames) {
575 if !d.Tokens.Last.isValidNamespace() {
576 return Token{}, wrapSyntacticError(d, errInvalidNamespace, pos-n, +1)
577 }
578 if d.Tokens.Last.isActiveNamespace() && !d.Namespaces.Last().insertQuoted(d.buf[pos-n:pos], flags.IsVerbatim()) {
579 err = wrapWithObjectName(ErrDuplicateName, d.buf[pos-n:pos])
580 return Token{}, wrapSyntacticError(d, err, pos-n, +1)
581 }
582 }
583 d.Names.ReplaceLastQuotedOffset(pos - n)
584 }
585 if err = d.Tokens.appendString(); err != nil {
586 return Token{}, wrapSyntacticError(d, err, pos-n, +1)
587 }
588 d.prevStart, d.prevEnd = pos-n, pos
589 return Token{raw: &d.decodeBuffer, num: uint64(d.previousOffsetStart())}, nil
590
591 case '0':
592
593
594 if n = jsonwire.ConsumeSimpleNumber(d.buf[pos:]); n == 0 || d.needMore(pos+n) {
595 oldAbsPos := d.baseOffset + int64(pos)
596 pos, err = d.consumeNumber(pos)
597 newAbsPos := d.baseOffset + int64(pos)
598 n = int(newAbsPos - oldAbsPos)
599 if err != nil {
600 return Token{}, wrapSyntacticError(d, err, pos, +1)
601 }
602 } else {
603 pos += n
604 }
605 if err = d.Tokens.appendNumber(); err != nil {
606 return Token{}, wrapSyntacticError(d, err, pos-n, +1)
607 }
608 d.prevStart, d.prevEnd = pos-n, pos
609 return Token{raw: &d.decodeBuffer, num: uint64(d.previousOffsetStart())}, nil
610
611 case '{':
612 if err = d.Tokens.pushObject(); err != nil {
613 return Token{}, wrapSyntacticError(d, err, pos, +1)
614 }
615 d.Names.push()
616 if !d.Flags.Get(jsonflags.AllowDuplicateNames) {
617 d.Namespaces.push()
618 }
619 pos += 1
620 d.prevStart, d.prevEnd = pos, pos
621 return BeginObject, nil
622
623 case '}':
624 if err = d.Tokens.popObject(); err != nil {
625 return Token{}, wrapSyntacticError(d, err, pos, +1)
626 }
627 d.Names.pop()
628 if !d.Flags.Get(jsonflags.AllowDuplicateNames) {
629 d.Namespaces.pop()
630 }
631 pos += 1
632 d.prevStart, d.prevEnd = pos, pos
633 return EndObject, nil
634
635 case '[':
636 if err = d.Tokens.pushArray(); err != nil {
637 return Token{}, wrapSyntacticError(d, err, pos, +1)
638 }
639 pos += 1
640 d.prevStart, d.prevEnd = pos, pos
641 return BeginArray, nil
642
643 case ']':
644 if err = d.Tokens.popArray(); err != nil {
645 return Token{}, wrapSyntacticError(d, err, pos, +1)
646 }
647 pos += 1
648 d.prevStart, d.prevEnd = pos, pos
649 return EndArray, nil
650
651 default:
652 err = jsonwire.NewInvalidCharacterError(d.buf[pos:], "at start of value")
653 return Token{}, wrapSyntacticError(d, err, pos, +1)
654 }
655 }
656
657
658
659
660
661
662
663
664
665
666
667 func (d *Decoder) ReadValue() (Value, error) {
668 var flags jsonwire.ValueFlags
669 return d.s.ReadValue(&flags)
670 }
671 func (d *decoderState) ReadValue(flags *jsonwire.ValueFlags) (Value, error) {
672
673 var err error
674 var next Kind
675 pos := d.peekPos
676 if pos != 0 {
677
678 if d.peekErr != nil {
679 err := d.peekErr
680 d.peekPos, d.peekErr = 0, nil
681 return nil, err
682 }
683 next = Kind(d.buf[pos]).normalize()
684 d.peekPos = 0
685 } else {
686 d.invalidatePreviousRead()
687 pos = d.prevEnd
688
689
690 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
691 if d.needMore(pos) {
692 if pos, err = d.consumeWhitespace(pos); err != nil {
693 if err == io.ErrUnexpectedEOF && d.Tokens.Depth() == 1 {
694 err = io.EOF
695 }
696 return nil, wrapSyntacticError(d, err, pos, 0)
697 }
698 }
699
700
701 var delim byte
702 if c := d.buf[pos]; c == ':' || c == ',' {
703 delim = c
704 pos += 1
705 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
706 if d.needMore(pos) {
707 if pos, err = d.consumeWhitespace(pos); err != nil {
708 err = wrapSyntacticError(d, err, pos, 0)
709 return nil, d.checkDelimBeforeIOError(delim, err)
710 }
711 }
712 }
713 next = Kind(d.buf[pos]).normalize()
714 if d.Tokens.needDelim(next) != delim {
715 return nil, d.checkDelim(delim, next)
716 }
717 }
718
719
720 oldAbsPos := d.baseOffset + int64(pos)
721 pos, err = d.consumeValue(flags, pos, d.Tokens.Depth())
722 newAbsPos := d.baseOffset + int64(pos)
723 n := int(newAbsPos - oldAbsPos)
724 if err != nil {
725 return nil, wrapSyntacticError(d, err, pos, +1)
726 }
727 switch next {
728 case 'n', 't', 'f':
729 err = d.Tokens.appendLiteral()
730 case '"':
731 if d.Tokens.Last.NeedObjectName() {
732 if !d.Flags.Get(jsonflags.AllowDuplicateNames) {
733 if !d.Tokens.Last.isValidNamespace() {
734 err = errInvalidNamespace
735 break
736 }
737 if d.Tokens.Last.isActiveNamespace() && !d.Namespaces.Last().insertQuoted(d.buf[pos-n:pos], flags.IsVerbatim()) {
738 err = wrapWithObjectName(ErrDuplicateName, d.buf[pos-n:pos])
739 break
740 }
741 }
742 d.Names.ReplaceLastQuotedOffset(pos - n)
743 }
744 err = d.Tokens.appendString()
745 case '0':
746 err = d.Tokens.appendNumber()
747 case '{':
748 if err = d.Tokens.pushObject(); err != nil {
749 break
750 }
751 if err = d.Tokens.popObject(); err != nil {
752 panic("BUG: popObject should never fail immediately after pushObject: " + err.Error())
753 }
754 case '[':
755 if err = d.Tokens.pushArray(); err != nil {
756 break
757 }
758 if err = d.Tokens.popArray(); err != nil {
759 panic("BUG: popArray should never fail immediately after pushArray: " + err.Error())
760 }
761 }
762 if err != nil {
763 return nil, wrapSyntacticError(d, err, pos-n, +1)
764 }
765 d.prevEnd = pos
766 d.prevStart = pos - n
767 return d.buf[pos-n : pos : pos], nil
768 }
769
770
771
772 func (d *decoderState) CheckNextValue() error {
773 d.PeekKind()
774 pos, err := d.peekPos, d.peekErr
775 d.peekPos, d.peekErr = 0, nil
776 if err != nil {
777 return err
778 }
779
780 var flags jsonwire.ValueFlags
781 if pos, err := d.consumeValue(&flags, pos, d.Tokens.Depth()); err != nil {
782 return wrapSyntacticError(d, err, pos, +1)
783 }
784 return nil
785 }
786
787
788 func (d *decoderState) CheckEOF() error {
789 switch pos, err := d.consumeWhitespace(d.prevEnd); err {
790 case nil:
791 err := jsonwire.NewInvalidCharacterError(d.buf[pos:], "after top-level value")
792 return wrapSyntacticError(d, err, pos, 0)
793 case io.ErrUnexpectedEOF:
794 return nil
795 default:
796 return err
797 }
798 }
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817 func (d *decoderState) consumeWhitespace(pos int) (newPos int, err error) {
818 for {
819 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
820 if d.needMore(pos) {
821 absPos := d.baseOffset + int64(pos)
822 err = d.fetch()
823 pos = int(absPos - d.baseOffset)
824 if err != nil {
825 return pos, err
826 }
827 continue
828 }
829 return pos, nil
830 }
831 }
832
833
834
835 func (d *decoderState) consumeValue(flags *jsonwire.ValueFlags, pos, depth int) (newPos int, err error) {
836 for {
837 var n int
838 var err error
839 switch next := Kind(d.buf[pos]).normalize(); next {
840 case 'n':
841 if n = jsonwire.ConsumeNull(d.buf[pos:]); n == 0 {
842 n, err = jsonwire.ConsumeLiteral(d.buf[pos:], "null")
843 }
844 case 'f':
845 if n = jsonwire.ConsumeFalse(d.buf[pos:]); n == 0 {
846 n, err = jsonwire.ConsumeLiteral(d.buf[pos:], "false")
847 }
848 case 't':
849 if n = jsonwire.ConsumeTrue(d.buf[pos:]); n == 0 {
850 n, err = jsonwire.ConsumeLiteral(d.buf[pos:], "true")
851 }
852 case '"':
853 if n = jsonwire.ConsumeSimpleString(d.buf[pos:]); n == 0 {
854 return d.consumeString(flags, pos)
855 }
856 case '0':
857
858
859 if n = jsonwire.ConsumeSimpleNumber(d.buf[pos:]); n == 0 || d.needMore(pos+n) {
860 return d.consumeNumber(pos)
861 }
862 case '{':
863 return d.consumeObject(flags, pos, depth)
864 case '[':
865 return d.consumeArray(flags, pos, depth)
866 default:
867 if (d.Tokens.Last.isObject() && next == ']') || (d.Tokens.Last.isArray() && next == '}') {
868 return pos, errMismatchDelim
869 }
870 return pos, jsonwire.NewInvalidCharacterError(d.buf[pos:], "at start of value")
871 }
872 if err == io.ErrUnexpectedEOF {
873 absPos := d.baseOffset + int64(pos)
874 err = d.fetch()
875 pos = int(absPos - d.baseOffset)
876 if err != nil {
877 return pos + n, err
878 }
879 continue
880 }
881 return pos + n, err
882 }
883 }
884
885
886
887 func (d *decoderState) consumeLiteral(pos int, lit string) (newPos int, err error) {
888 for {
889 n, err := jsonwire.ConsumeLiteral(d.buf[pos:], lit)
890 if err == io.ErrUnexpectedEOF {
891 absPos := d.baseOffset + int64(pos)
892 err = d.fetch()
893 pos = int(absPos - d.baseOffset)
894 if err != nil {
895 return pos + n, err
896 }
897 continue
898 }
899 return pos + n, err
900 }
901 }
902
903
904
905 func (d *decoderState) consumeString(flags *jsonwire.ValueFlags, pos int) (newPos int, err error) {
906 var n int
907 for {
908 n, err = jsonwire.ConsumeStringResumable(flags, d.buf[pos:], n, !d.Flags.Get(jsonflags.AllowInvalidUTF8))
909 if err == io.ErrUnexpectedEOF {
910 absPos := d.baseOffset + int64(pos)
911 err = d.fetch()
912 pos = int(absPos - d.baseOffset)
913 if err != nil {
914 return pos + n, err
915 }
916 continue
917 }
918 return pos + n, err
919 }
920 }
921
922
923
924 func (d *decoderState) consumeNumber(pos int) (newPos int, err error) {
925 var n int
926 var state jsonwire.ConsumeNumberState
927 for {
928 n, state, err = jsonwire.ConsumeNumberResumable(d.buf[pos:], n, state)
929
930
931 if err == io.ErrUnexpectedEOF || d.needMore(pos+n) {
932 mayTerminate := err == nil
933 absPos := d.baseOffset + int64(pos)
934 err = d.fetch()
935 pos = int(absPos - d.baseOffset)
936 if err != nil {
937 if mayTerminate && err == io.ErrUnexpectedEOF {
938 return pos + n, nil
939 }
940 return pos, err
941 }
942 continue
943 }
944 return pos + n, err
945 }
946 }
947
948
949
950 func (d *decoderState) consumeObject(flags *jsonwire.ValueFlags, pos, depth int) (newPos int, err error) {
951 var n int
952 var names *objectNamespace
953 if !d.Flags.Get(jsonflags.AllowDuplicateNames) {
954 d.Namespaces.push()
955 defer d.Namespaces.pop()
956 names = d.Namespaces.Last()
957 }
958
959
960 if uint(pos) >= uint(len(d.buf)) || d.buf[pos] != '{' {
961 panic("BUG: consumeObject must be called with a buffer that starts with '{'")
962 } else if depth == maxNestingDepth+1 {
963 return pos, errMaxDepth
964 }
965 pos++
966
967
968 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
969 if d.needMore(pos) {
970 if pos, err = d.consumeWhitespace(pos); err != nil {
971 return pos, err
972 }
973 }
974 if d.buf[pos] == '}' {
975 pos++
976 return pos, nil
977 }
978
979 depth++
980 for {
981
982 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
983 if d.needMore(pos) {
984 if pos, err = d.consumeWhitespace(pos); err != nil {
985 return pos, err
986 }
987 }
988 var flags2 jsonwire.ValueFlags
989 if n = jsonwire.ConsumeSimpleString(d.buf[pos:]); n == 0 {
990 oldAbsPos := d.baseOffset + int64(pos)
991 pos, err = d.consumeString(&flags2, pos)
992 newAbsPos := d.baseOffset + int64(pos)
993 n = int(newAbsPos - oldAbsPos)
994 flags.Join(flags2)
995 if err != nil {
996 return pos, err
997 }
998 } else {
999 pos += n
1000 }
1001 quotedName := d.buf[pos-n : pos]
1002 if !d.Flags.Get(jsonflags.AllowDuplicateNames) && !names.insertQuoted(quotedName, flags2.IsVerbatim()) {
1003 return pos - n, wrapWithObjectName(ErrDuplicateName, quotedName)
1004 }
1005
1006
1007 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1008 if d.needMore(pos) {
1009 if pos, err = d.consumeWhitespace(pos); err != nil {
1010 return pos, wrapWithObjectName(err, quotedName)
1011 }
1012 }
1013 if d.buf[pos] != ':' {
1014 err := jsonwire.NewInvalidCharacterError(d.buf[pos:], "after object name (expecting ':')")
1015 return pos, wrapWithObjectName(err, quotedName)
1016 }
1017 pos++
1018
1019
1020 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1021 if d.needMore(pos) {
1022 if pos, err = d.consumeWhitespace(pos); err != nil {
1023 return pos, wrapWithObjectName(err, quotedName)
1024 }
1025 }
1026 pos, err = d.consumeValue(flags, pos, depth)
1027 if err != nil {
1028 return pos, wrapWithObjectName(err, quotedName)
1029 }
1030
1031
1032 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1033 if d.needMore(pos) {
1034 if pos, err = d.consumeWhitespace(pos); err != nil {
1035 return pos, err
1036 }
1037 }
1038 switch d.buf[pos] {
1039 case ',':
1040 pos++
1041 continue
1042 case '}':
1043 pos++
1044 return pos, nil
1045 default:
1046 return pos, jsonwire.NewInvalidCharacterError(d.buf[pos:], "after object value (expecting ',' or '}')")
1047 }
1048 }
1049 }
1050
1051
1052
1053 func (d *decoderState) consumeArray(flags *jsonwire.ValueFlags, pos, depth int) (newPos int, err error) {
1054
1055 if uint(pos) >= uint(len(d.buf)) || d.buf[pos] != '[' {
1056 panic("BUG: consumeArray must be called with a buffer that starts with '['")
1057 } else if depth == maxNestingDepth+1 {
1058 return pos, errMaxDepth
1059 }
1060 pos++
1061
1062
1063 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1064 if d.needMore(pos) {
1065 if pos, err = d.consumeWhitespace(pos); err != nil {
1066 return pos, err
1067 }
1068 }
1069 if d.buf[pos] == ']' {
1070 pos++
1071 return pos, nil
1072 }
1073
1074 var idx int64
1075 depth++
1076 for {
1077
1078 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1079 if d.needMore(pos) {
1080 if pos, err = d.consumeWhitespace(pos); err != nil {
1081 return pos, err
1082 }
1083 }
1084 pos, err = d.consumeValue(flags, pos, depth)
1085 if err != nil {
1086 return pos, wrapWithArrayIndex(err, idx)
1087 }
1088
1089
1090 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1091 if d.needMore(pos) {
1092 if pos, err = d.consumeWhitespace(pos); err != nil {
1093 return pos, err
1094 }
1095 }
1096 switch d.buf[pos] {
1097 case ',':
1098 pos++
1099 idx++
1100 continue
1101 case ']':
1102 pos++
1103 return pos, nil
1104 default:
1105 return pos, jsonwire.NewInvalidCharacterError(d.buf[pos:], "after array element (expecting ',' or ']')")
1106 }
1107 }
1108 }
1109
1110
1111
1112
1113
1114 func (d *Decoder) InputOffset() int64 {
1115 return d.s.previousOffsetEnd()
1116 }
1117
1118
1119
1120
1121
1122 func (d *Decoder) UnreadBuffer() []byte {
1123 return d.s.unreadBuffer()
1124 }
1125
1126
1127
1128
1129
1130
1131 func (d *Decoder) StackDepth() int {
1132
1133 return d.s.Tokens.Depth() - 1
1134 }
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148 func (d *Decoder) StackIndex(i int) (Kind, int64) {
1149
1150 switch s := d.s.Tokens.index(i); {
1151 case i > 0 && s.isObject():
1152 return '{', s.Length()
1153 case i > 0 && s.isArray():
1154 return '[', s.Length()
1155 default:
1156 return 0, s.Length()
1157 }
1158 }
1159
1160
1161 func (d *Decoder) StackPointer() Pointer {
1162 return Pointer(d.s.AppendStackPointer(nil, -1))
1163 }
1164
1165 func (d *decoderState) AppendStackPointer(b []byte, where int) []byte {
1166 d.Names.copyQuotedBuffer(d.buf)
1167 return d.state.appendStackPointer(b, where)
1168 }
1169
View as plain text