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) CheckEOF() error {
797 return d.checkEOF(d.prevEnd)
798 }
799 func (d *decoderState) checkEOF(pos int) error {
800 switch pos, err := d.consumeWhitespace(pos); err {
801 case nil:
802 err := jsonwire.NewInvalidCharacterError(d.buf[pos:], "after top-level value")
803 return wrapSyntacticError(d, err, pos, 0)
804 case io.ErrUnexpectedEOF:
805 return nil
806 default:
807 return err
808 }
809 }
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828 func (d *decoderState) consumeWhitespace(pos int) (newPos int, err error) {
829 for {
830 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
831 if d.needMore(pos) {
832 absPos := d.baseOffset + int64(pos)
833 err = d.fetch()
834 pos = int(absPos - d.baseOffset)
835 if err != nil {
836 return pos, err
837 }
838 continue
839 }
840 return pos, nil
841 }
842 }
843
844
845
846 func (d *decoderState) consumeValue(flags *jsonwire.ValueFlags, pos, depth int) (newPos int, err error) {
847 for {
848 var n int
849 var err error
850 switch next := Kind(d.buf[pos]).normalize(); next {
851 case 'n':
852 if n = jsonwire.ConsumeNull(d.buf[pos:]); n == 0 {
853 n, err = jsonwire.ConsumeLiteral(d.buf[pos:], "null")
854 }
855 case 'f':
856 if n = jsonwire.ConsumeFalse(d.buf[pos:]); n == 0 {
857 n, err = jsonwire.ConsumeLiteral(d.buf[pos:], "false")
858 }
859 case 't':
860 if n = jsonwire.ConsumeTrue(d.buf[pos:]); n == 0 {
861 n, err = jsonwire.ConsumeLiteral(d.buf[pos:], "true")
862 }
863 case '"':
864 if n = jsonwire.ConsumeSimpleString(d.buf[pos:]); n == 0 {
865 return d.consumeString(flags, pos)
866 }
867 case '0':
868
869
870 if n = jsonwire.ConsumeSimpleNumber(d.buf[pos:]); n == 0 || d.needMore(pos+n) {
871 return d.consumeNumber(pos)
872 }
873 case '{':
874 return d.consumeObject(flags, pos, depth)
875 case '[':
876 return d.consumeArray(flags, pos, depth)
877 default:
878 if (d.Tokens.Last.isObject() && next == ']') || (d.Tokens.Last.isArray() && next == '}') {
879 return pos, errMismatchDelim
880 }
881 return pos, jsonwire.NewInvalidCharacterError(d.buf[pos:], "at start of value")
882 }
883 if err == io.ErrUnexpectedEOF {
884 absPos := d.baseOffset + int64(pos)
885 err = d.fetch()
886 pos = int(absPos - d.baseOffset)
887 if err != nil {
888 return pos + n, err
889 }
890 continue
891 }
892 return pos + n, err
893 }
894 }
895
896
897
898 func (d *decoderState) consumeLiteral(pos int, lit string) (newPos int, err error) {
899 for {
900 n, err := jsonwire.ConsumeLiteral(d.buf[pos:], lit)
901 if err == io.ErrUnexpectedEOF {
902 absPos := d.baseOffset + int64(pos)
903 err = d.fetch()
904 pos = int(absPos - d.baseOffset)
905 if err != nil {
906 return pos + n, err
907 }
908 continue
909 }
910 return pos + n, err
911 }
912 }
913
914
915
916 func (d *decoderState) consumeString(flags *jsonwire.ValueFlags, pos int) (newPos int, err error) {
917 var n int
918 for {
919 n, err = jsonwire.ConsumeStringResumable(flags, d.buf[pos:], n, !d.Flags.Get(jsonflags.AllowInvalidUTF8))
920 if err == io.ErrUnexpectedEOF {
921 absPos := d.baseOffset + int64(pos)
922 err = d.fetch()
923 pos = int(absPos - d.baseOffset)
924 if err != nil {
925 return pos + n, err
926 }
927 continue
928 }
929 return pos + n, err
930 }
931 }
932
933
934
935 func (d *decoderState) consumeNumber(pos int) (newPos int, err error) {
936 var n int
937 var state jsonwire.ConsumeNumberState
938 for {
939 n, state, err = jsonwire.ConsumeNumberResumable(d.buf[pos:], n, state)
940
941
942 if err == io.ErrUnexpectedEOF || d.needMore(pos+n) {
943 mayTerminate := err == nil
944 absPos := d.baseOffset + int64(pos)
945 err = d.fetch()
946 pos = int(absPos - d.baseOffset)
947 if err != nil {
948 if mayTerminate && err == io.ErrUnexpectedEOF {
949 return pos + n, nil
950 }
951 return pos, err
952 }
953 continue
954 }
955 return pos + n, err
956 }
957 }
958
959
960
961 func (d *decoderState) consumeObject(flags *jsonwire.ValueFlags, pos, depth int) (newPos int, err error) {
962 var n int
963 var names *objectNamespace
964 if !d.Flags.Get(jsonflags.AllowDuplicateNames) {
965 d.Namespaces.push()
966 defer d.Namespaces.pop()
967 names = d.Namespaces.Last()
968 }
969
970
971 if uint(pos) >= uint(len(d.buf)) || d.buf[pos] != '{' {
972 panic("BUG: consumeObject must be called with a buffer that starts with '{'")
973 } else if depth == maxNestingDepth+1 {
974 return pos, errMaxDepth
975 }
976 pos++
977
978
979 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
980 if d.needMore(pos) {
981 if pos, err = d.consumeWhitespace(pos); err != nil {
982 return pos, err
983 }
984 }
985 if d.buf[pos] == '}' {
986 pos++
987 return pos, nil
988 }
989
990 depth++
991 for {
992
993 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
994 if d.needMore(pos) {
995 if pos, err = d.consumeWhitespace(pos); err != nil {
996 return pos, err
997 }
998 }
999 var flags2 jsonwire.ValueFlags
1000 if n = jsonwire.ConsumeSimpleString(d.buf[pos:]); n == 0 {
1001 oldAbsPos := d.baseOffset + int64(pos)
1002 pos, err = d.consumeString(&flags2, pos)
1003 newAbsPos := d.baseOffset + int64(pos)
1004 n = int(newAbsPos - oldAbsPos)
1005 flags.Join(flags2)
1006 if err != nil {
1007 return pos, err
1008 }
1009 } else {
1010 pos += n
1011 }
1012 quotedName := d.buf[pos-n : pos]
1013 if !d.Flags.Get(jsonflags.AllowDuplicateNames) && !names.insertQuoted(quotedName, flags2.IsVerbatim()) {
1014 return pos - n, wrapWithObjectName(ErrDuplicateName, quotedName)
1015 }
1016
1017
1018 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1019 if d.needMore(pos) {
1020 if pos, err = d.consumeWhitespace(pos); err != nil {
1021 return pos, wrapWithObjectName(err, quotedName)
1022 }
1023 }
1024 if d.buf[pos] != ':' {
1025 err := jsonwire.NewInvalidCharacterError(d.buf[pos:], "after object name (expecting ':')")
1026 return pos, wrapWithObjectName(err, quotedName)
1027 }
1028 pos++
1029
1030
1031 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1032 if d.needMore(pos) {
1033 if pos, err = d.consumeWhitespace(pos); err != nil {
1034 return pos, wrapWithObjectName(err, quotedName)
1035 }
1036 }
1037 pos, err = d.consumeValue(flags, pos, depth)
1038 if err != nil {
1039 return pos, wrapWithObjectName(err, quotedName)
1040 }
1041
1042
1043 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1044 if d.needMore(pos) {
1045 if pos, err = d.consumeWhitespace(pos); err != nil {
1046 return pos, err
1047 }
1048 }
1049 switch d.buf[pos] {
1050 case ',':
1051 pos++
1052 continue
1053 case '}':
1054 pos++
1055 return pos, nil
1056 default:
1057 return pos, jsonwire.NewInvalidCharacterError(d.buf[pos:], "after object value (expecting ',' or '}')")
1058 }
1059 }
1060 }
1061
1062
1063
1064 func (d *decoderState) consumeArray(flags *jsonwire.ValueFlags, pos, depth int) (newPos int, err error) {
1065
1066 if uint(pos) >= uint(len(d.buf)) || d.buf[pos] != '[' {
1067 panic("BUG: consumeArray must be called with a buffer that starts with '['")
1068 } else if depth == maxNestingDepth+1 {
1069 return pos, errMaxDepth
1070 }
1071 pos++
1072
1073
1074 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1075 if d.needMore(pos) {
1076 if pos, err = d.consumeWhitespace(pos); err != nil {
1077 return pos, err
1078 }
1079 }
1080 if d.buf[pos] == ']' {
1081 pos++
1082 return pos, nil
1083 }
1084
1085 var idx int64
1086 depth++
1087 for {
1088
1089 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1090 if d.needMore(pos) {
1091 if pos, err = d.consumeWhitespace(pos); err != nil {
1092 return pos, err
1093 }
1094 }
1095 pos, err = d.consumeValue(flags, pos, depth)
1096 if err != nil {
1097 return pos, wrapWithArrayIndex(err, idx)
1098 }
1099
1100
1101 pos += jsonwire.ConsumeWhitespace(d.buf[pos:])
1102 if d.needMore(pos) {
1103 if pos, err = d.consumeWhitespace(pos); err != nil {
1104 return pos, err
1105 }
1106 }
1107 switch d.buf[pos] {
1108 case ',':
1109 pos++
1110 idx++
1111 continue
1112 case ']':
1113 pos++
1114 return pos, nil
1115 default:
1116 return pos, jsonwire.NewInvalidCharacterError(d.buf[pos:], "after array element (expecting ',' or ']')")
1117 }
1118 }
1119 }
1120
1121
1122
1123
1124
1125 func (d *Decoder) InputOffset() int64 {
1126 return d.s.previousOffsetEnd()
1127 }
1128
1129
1130
1131
1132
1133 func (d *Decoder) UnreadBuffer() []byte {
1134 return d.s.unreadBuffer()
1135 }
1136
1137
1138
1139
1140
1141
1142 func (d *Decoder) StackDepth() int {
1143
1144 return d.s.Tokens.Depth() - 1
1145 }
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159 func (d *Decoder) StackIndex(i int) (Kind, int64) {
1160
1161 switch s := d.s.Tokens.index(i); {
1162 case i > 0 && s.isObject():
1163 return '{', s.Length()
1164 case i > 0 && s.isArray():
1165 return '[', s.Length()
1166 default:
1167 return 0, s.Length()
1168 }
1169 }
1170
1171
1172 func (d *Decoder) StackPointer() Pointer {
1173 return Pointer(d.s.AppendStackPointer(nil, -1))
1174 }
1175
1176 func (d *decoderState) AppendStackPointer(b []byte, where int) []byte {
1177 d.Names.copyQuotedBuffer(d.buf)
1178 return d.state.appendStackPointer(b, where)
1179 }
1180
View as plain text