uint.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package decoder
  2. import (
  3. "fmt"
  4. "reflect"
  5. "unsafe"
  6. "github.com/goccy/go-json/internal/errors"
  7. "github.com/goccy/go-json/internal/runtime"
  8. )
  9. type uintDecoder struct {
  10. typ *runtime.Type
  11. kind reflect.Kind
  12. op func(unsafe.Pointer, uint64)
  13. structName string
  14. fieldName string
  15. }
  16. func newUintDecoder(typ *runtime.Type, structName, fieldName string, op func(unsafe.Pointer, uint64)) *uintDecoder {
  17. return &uintDecoder{
  18. typ: typ,
  19. kind: typ.Kind(),
  20. op: op,
  21. structName: structName,
  22. fieldName: fieldName,
  23. }
  24. }
  25. func (d *uintDecoder) typeError(buf []byte, offset int64) *errors.UnmarshalTypeError {
  26. return &errors.UnmarshalTypeError{
  27. Value: fmt.Sprintf("number %s", string(buf)),
  28. Type: runtime.RType2Type(d.typ),
  29. Offset: offset,
  30. }
  31. }
  32. var (
  33. pow10u64 = [...]uint64{
  34. 1e00, 1e01, 1e02, 1e03, 1e04, 1e05, 1e06, 1e07, 1e08, 1e09,
  35. 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
  36. }
  37. pow10u64Len = len(pow10u64)
  38. )
  39. func (d *uintDecoder) parseUint(b []byte) (uint64, error) {
  40. maxDigit := len(b)
  41. if maxDigit > pow10u64Len {
  42. return 0, fmt.Errorf("invalid length of number")
  43. }
  44. sum := uint64(0)
  45. for i := 0; i < maxDigit; i++ {
  46. c := uint64(b[i]) - 48
  47. digitValue := pow10u64[maxDigit-i-1]
  48. sum += c * digitValue
  49. }
  50. return sum, nil
  51. }
  52. func (d *uintDecoder) decodeStreamByte(s *Stream) ([]byte, error) {
  53. for {
  54. switch s.char() {
  55. case ' ', '\n', '\t', '\r':
  56. s.cursor++
  57. continue
  58. case '0':
  59. s.cursor++
  60. return numZeroBuf, nil
  61. case '1', '2', '3', '4', '5', '6', '7', '8', '9':
  62. start := s.cursor
  63. for {
  64. s.cursor++
  65. if numTable[s.char()] {
  66. continue
  67. } else if s.char() == nul {
  68. if s.read() {
  69. s.cursor-- // for retry current character
  70. continue
  71. }
  72. }
  73. break
  74. }
  75. num := s.buf[start:s.cursor]
  76. return num, nil
  77. case 'n':
  78. if err := nullBytes(s); err != nil {
  79. return nil, err
  80. }
  81. return nil, nil
  82. case nul:
  83. if s.read() {
  84. continue
  85. }
  86. default:
  87. return nil, d.typeError([]byte{s.char()}, s.totalOffset())
  88. }
  89. break
  90. }
  91. return nil, errors.ErrUnexpectedEndOfJSON("number(unsigned integer)", s.totalOffset())
  92. }
  93. func (d *uintDecoder) decodeByte(buf []byte, cursor int64) ([]byte, int64, error) {
  94. for {
  95. switch buf[cursor] {
  96. case ' ', '\n', '\t', '\r':
  97. cursor++
  98. continue
  99. case '0':
  100. cursor++
  101. return numZeroBuf, cursor, nil
  102. case '1', '2', '3', '4', '5', '6', '7', '8', '9':
  103. start := cursor
  104. cursor++
  105. for numTable[buf[cursor]] {
  106. cursor++
  107. }
  108. num := buf[start:cursor]
  109. return num, cursor, nil
  110. case 'n':
  111. if err := validateNull(buf, cursor); err != nil {
  112. return nil, 0, err
  113. }
  114. cursor += 4
  115. return nil, cursor, nil
  116. default:
  117. return nil, 0, d.typeError([]byte{buf[cursor]}, cursor)
  118. }
  119. }
  120. }
  121. func (d *uintDecoder) DecodeStream(s *Stream, depth int64, p unsafe.Pointer) error {
  122. bytes, err := d.decodeStreamByte(s)
  123. if err != nil {
  124. return err
  125. }
  126. if bytes == nil {
  127. return nil
  128. }
  129. u64, err := d.parseUint(bytes)
  130. if err != nil {
  131. return d.typeError(bytes, s.totalOffset())
  132. }
  133. switch d.kind {
  134. case reflect.Uint8:
  135. if (1 << 8) <= u64 {
  136. return d.typeError(bytes, s.totalOffset())
  137. }
  138. case reflect.Uint16:
  139. if (1 << 16) <= u64 {
  140. return d.typeError(bytes, s.totalOffset())
  141. }
  142. case reflect.Uint32:
  143. if (1 << 32) <= u64 {
  144. return d.typeError(bytes, s.totalOffset())
  145. }
  146. }
  147. d.op(p, u64)
  148. return nil
  149. }
  150. func (d *uintDecoder) Decode(ctx *RuntimeContext, cursor, depth int64, p unsafe.Pointer) (int64, error) {
  151. bytes, c, err := d.decodeByte(ctx.Buf, cursor)
  152. if err != nil {
  153. return 0, err
  154. }
  155. if bytes == nil {
  156. return c, nil
  157. }
  158. cursor = c
  159. u64, err := d.parseUint(bytes)
  160. if err != nil {
  161. return 0, d.typeError(bytes, cursor)
  162. }
  163. switch d.kind {
  164. case reflect.Uint8:
  165. if (1 << 8) <= u64 {
  166. return 0, d.typeError(bytes, cursor)
  167. }
  168. case reflect.Uint16:
  169. if (1 << 16) <= u64 {
  170. return 0, d.typeError(bytes, cursor)
  171. }
  172. case reflect.Uint32:
  173. if (1 << 32) <= u64 {
  174. return 0, d.typeError(bytes, cursor)
  175. }
  176. }
  177. d.op(p, u64)
  178. return cursor, nil
  179. }