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