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