read.go 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679
  1. package msgp
  2. import (
  3. "encoding"
  4. "encoding/binary"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "math"
  9. "strconv"
  10. "sync"
  11. "time"
  12. "github.com/philhofer/fwd"
  13. )
  14. // where we keep old *Readers
  15. var readerPool = sync.Pool{New: func() any { return &Reader{} }}
  16. // Type is a MessagePack wire type,
  17. // including this package's built-in
  18. // extension types.
  19. type Type byte
  20. // MessagePack Types
  21. //
  22. // The zero value of Type
  23. // is InvalidType.
  24. const (
  25. InvalidType Type = iota
  26. // MessagePack built-in types
  27. StrType
  28. BinType
  29. MapType
  30. ArrayType
  31. Float64Type
  32. Float32Type
  33. BoolType
  34. IntType
  35. UintType
  36. NilType
  37. DurationType
  38. ExtensionType
  39. // pseudo-types provided
  40. // by extensions
  41. Complex64Type
  42. Complex128Type
  43. TimeType
  44. NumberType
  45. _maxtype
  46. )
  47. // String implements fmt.Stringer
  48. func (t Type) String() string {
  49. switch t {
  50. case StrType:
  51. return "str"
  52. case BinType:
  53. return "bin"
  54. case MapType:
  55. return "map"
  56. case ArrayType:
  57. return "array"
  58. case Float64Type:
  59. return "float64"
  60. case Float32Type:
  61. return "float32"
  62. case BoolType:
  63. return "bool"
  64. case UintType:
  65. return "uint"
  66. case IntType:
  67. return "int"
  68. case ExtensionType:
  69. return "ext"
  70. case NilType:
  71. return "nil"
  72. case NumberType:
  73. return "number"
  74. default:
  75. return "<invalid>"
  76. }
  77. }
  78. func freeR(m *Reader) {
  79. readerPool.Put(m)
  80. }
  81. // Unmarshaler is the interface fulfilled
  82. // by objects that know how to unmarshal
  83. // themselves from MessagePack.
  84. // UnmarshalMsg unmarshals the object
  85. // from binary, returing any leftover
  86. // bytes and any errors encountered.
  87. type Unmarshaler interface {
  88. UnmarshalMsg([]byte) ([]byte, error)
  89. }
  90. // Decodable is the interface fulfilled
  91. // by objects that know how to read
  92. // themselves from a *Reader.
  93. type Decodable interface {
  94. DecodeMsg(*Reader) error
  95. }
  96. // Decode decodes 'd' from 'r'.
  97. func Decode(r io.Reader, d Decodable) error {
  98. rd := NewReader(r)
  99. err := d.DecodeMsg(rd)
  100. freeR(rd)
  101. return err
  102. }
  103. // NewReader returns a *Reader that
  104. // reads from the provided reader. The
  105. // reader will be buffered.
  106. func NewReader(r io.Reader) *Reader {
  107. p := readerPool.Get().(*Reader)
  108. p.recursionDepth = 0
  109. p.maxElements = 0
  110. p.maxRecursionDepth = 0
  111. p.maxStrLen = 0
  112. if p.R == nil {
  113. p.R = fwd.NewReader(r)
  114. } else {
  115. p.R.Reset(r)
  116. }
  117. return p
  118. }
  119. // NewReaderSize returns a *Reader with a buffer of the given size.
  120. // (This is vastly preferable to passing the decoder a reader that is already buffered.)
  121. func NewReaderSize(r io.Reader, sz int) *Reader {
  122. return &Reader{R: fwd.NewReaderSize(r, sz)}
  123. }
  124. // NewReaderBuf returns a *Reader with a provided buffer.
  125. func NewReaderBuf(r io.Reader, buf []byte) *Reader {
  126. return &Reader{R: fwd.NewReaderBuf(r, buf)}
  127. }
  128. // Reader wraps an io.Reader and provides
  129. // methods to read MessagePack-encoded values
  130. // from it. Readers are buffered.
  131. type Reader struct {
  132. // R is the buffered reader
  133. // that the Reader uses
  134. // to decode MessagePack.
  135. // The Reader itself
  136. // is stateless; all the
  137. // buffering is done
  138. // within R.
  139. R *fwd.Reader
  140. scratch []byte
  141. recursionDepth int
  142. maxRecursionDepth int // maximum recursion depth
  143. maxElements uint32 // maximum number of elements in arrays and maps
  144. maxStrLen uint64 // maximum number of bytes in any string
  145. }
  146. // Read implements `io.Reader`
  147. func (m *Reader) Read(p []byte) (int, error) {
  148. return m.R.Read(p)
  149. }
  150. // CopyNext reads the next object from m without decoding it and writes it to w.
  151. // It avoids unnecessary copies internally.
  152. func (m *Reader) CopyNext(w io.Writer) (int64, error) {
  153. sz, o, err := getNextSize(m.R)
  154. if err != nil {
  155. return 0, err
  156. }
  157. var n int64
  158. // Opportunistic optimization: if we can fit the whole thing in the m.R
  159. // buffer, then just get a pointer to that, and pass it to w.Write,
  160. // avoiding an allocation.
  161. if int(sz) >= 0 && int(sz) <= m.R.BufferSize() {
  162. var nn int
  163. var buf []byte
  164. buf, err = m.R.Next(int(sz))
  165. if err != nil {
  166. if err == io.ErrUnexpectedEOF {
  167. err = ErrShortBytes
  168. }
  169. return 0, err
  170. }
  171. nn, err = w.Write(buf)
  172. n += int64(nn)
  173. } else {
  174. // Fall back to io.CopyN.
  175. // May avoid allocating if w is a ReaderFrom (e.g. bytes.Buffer)
  176. n, err = io.CopyN(w, m.R, int64(sz))
  177. if err == io.ErrUnexpectedEOF {
  178. err = ErrShortBytes
  179. }
  180. }
  181. if err != nil {
  182. return n, err
  183. } else if n < int64(sz) {
  184. return n, io.ErrShortWrite
  185. }
  186. if done, err := m.recursiveCall(); err != nil {
  187. return n, err
  188. } else {
  189. defer done()
  190. }
  191. // for maps and slices, read elements
  192. for range o {
  193. var n2 int64
  194. n2, err = m.CopyNext(w)
  195. if err != nil {
  196. return n, err
  197. }
  198. n += n2
  199. }
  200. return n, nil
  201. }
  202. // SetMaxRecursionDepth sets the maximum recursion depth.
  203. func (m *Reader) SetMaxRecursionDepth(d int) {
  204. m.maxRecursionDepth = d
  205. }
  206. // GetMaxRecursionDepth returns the maximum recursion depth.
  207. // Set to 0 to use the default value of 100000.
  208. func (m *Reader) GetMaxRecursionDepth() int {
  209. if m.maxRecursionDepth <= 0 {
  210. return recursionLimit
  211. }
  212. return m.maxRecursionDepth
  213. }
  214. // SetMaxElements sets the maximum number of elements to allow in map, bin, array or extension payload.
  215. // Setting this to 0 will allow any number of elements - math.MaxUint32.
  216. // This does currently apply to generated code.
  217. func (m *Reader) SetMaxElements(d uint32) {
  218. m.maxElements = d
  219. }
  220. // GetMaxElements will return the maximum number of elements in a map, bin, array or extension payload.
  221. func (m *Reader) GetMaxElements() uint32 {
  222. if m.maxElements <= 0 {
  223. return math.MaxUint32
  224. }
  225. return m.maxElements
  226. }
  227. // SetMaxStringLength sets the maximum number of bytes to allow in strings.
  228. // Setting this == 0 will allow any number of elements - math.MaxUint64.
  229. func (m *Reader) SetMaxStringLength(d uint64) {
  230. m.maxStrLen = d
  231. }
  232. // GetMaxStringLength will return the current string length limit.
  233. func (m *Reader) GetMaxStringLength() uint64 {
  234. if m.maxStrLen <= 0 {
  235. return math.MaxUint64
  236. }
  237. return min(m.maxStrLen, math.MaxUint64)
  238. }
  239. // recursiveCall will increment the recursion depth and return an error if it is exceeded.
  240. // If a nil error is returned, done must be called to decrement the counter.
  241. func (m *Reader) recursiveCall() (done func(), err error) {
  242. if m.recursionDepth >= m.GetMaxRecursionDepth() {
  243. return func() {}, ErrRecursion
  244. }
  245. m.recursionDepth++
  246. return func() {
  247. m.recursionDepth--
  248. }, nil
  249. }
  250. // ReadFull implements `io.ReadFull`
  251. func (m *Reader) ReadFull(p []byte) (int, error) {
  252. return m.R.ReadFull(p)
  253. }
  254. // Reset resets the underlying reader.
  255. func (m *Reader) Reset(r io.Reader) { m.R.Reset(r) }
  256. // Buffered returns the number of bytes currently in the read buffer.
  257. func (m *Reader) Buffered() int { return m.R.Buffered() }
  258. // BufferSize returns the capacity of the read buffer.
  259. func (m *Reader) BufferSize() int { return m.R.BufferSize() }
  260. // NextType returns the next object type to be decoded.
  261. func (m *Reader) NextType() (Type, error) {
  262. next, err := m.R.PeekByte()
  263. if err != nil {
  264. return InvalidType, err
  265. }
  266. t := getType(next)
  267. if t == InvalidType {
  268. return t, InvalidPrefixError(next)
  269. }
  270. if t == ExtensionType {
  271. v, err := m.peekExtensionType()
  272. if err != nil {
  273. return InvalidType, err
  274. }
  275. switch v {
  276. case Complex64Extension:
  277. return Complex64Type, nil
  278. case Complex128Extension:
  279. return Complex128Type, nil
  280. case TimeExtension, MsgTimeExtension:
  281. return TimeType, nil
  282. }
  283. }
  284. return t, nil
  285. }
  286. // IsNil returns whether or not
  287. // the next byte is a null messagepack byte
  288. func (m *Reader) IsNil() bool {
  289. p, err := m.R.PeekByte()
  290. return err == nil && p == mnil
  291. }
  292. // getNextSize returns the size of the next object on the wire.
  293. // returns (obj size, obj elements, error)
  294. // only maps and arrays have non-zero obj elements
  295. // for maps and arrays, obj size does not include elements
  296. //
  297. // use uintptr b/c it's guaranteed to be large enough
  298. // to hold whatever we can fit in memory.
  299. func getNextSize(r *fwd.Reader) (uintptr, uintptr, error) {
  300. lead, err := r.PeekByte()
  301. if err != nil {
  302. return 0, 0, err
  303. }
  304. spec := getBytespec(lead)
  305. size, mode := spec.size, spec.extra
  306. if size == 0 {
  307. return 0, 0, InvalidPrefixError(lead)
  308. }
  309. if mode >= 0 {
  310. return uintptr(size), uintptr(mode), nil
  311. }
  312. b, err := r.Peek(int(size))
  313. if err != nil {
  314. return 0, 0, err
  315. }
  316. switch mode {
  317. case extra8:
  318. return uintptr(size) + uintptr(b[1]), 0, nil
  319. case extra16:
  320. return uintptr(size) + uintptr(big.Uint16(b[1:])), 0, nil
  321. case extra32:
  322. return uintptr(size) + uintptr(big.Uint32(b[1:])), 0, nil
  323. case map16v:
  324. return uintptr(size), 2 * uintptr(big.Uint16(b[1:])), nil
  325. case map32v:
  326. return uintptr(size), 2 * uintptr(big.Uint32(b[1:])), nil
  327. case array16v:
  328. return uintptr(size), uintptr(big.Uint16(b[1:])), nil
  329. case array32v:
  330. return uintptr(size), uintptr(big.Uint32(b[1:])), nil
  331. default:
  332. return 0, 0, fatal
  333. }
  334. }
  335. // Skip skips over the next object, regardless of
  336. // its type. If it is an array or map, the whole array
  337. // or map will be skipped.
  338. func (m *Reader) Skip() error {
  339. var (
  340. v uintptr // bytes
  341. o uintptr // objects
  342. err error
  343. p []byte
  344. )
  345. // we can use the faster
  346. // method if we have enough
  347. // buffered data
  348. if m.R.Buffered() >= 5 {
  349. p, err = m.R.Peek(5)
  350. if err != nil {
  351. return err
  352. }
  353. v, o, err = getSize(p)
  354. if err != nil {
  355. return err
  356. }
  357. } else {
  358. v, o, err = getNextSize(m.R)
  359. if err != nil {
  360. return err
  361. }
  362. }
  363. // 'v' is always non-zero
  364. // if err == nil
  365. _, err = m.R.Skip(int(v))
  366. if err != nil {
  367. return err
  368. }
  369. // for maps and slices, skip elements with recursive call
  370. if done, err := m.recursiveCall(); err != nil {
  371. return err
  372. } else {
  373. defer done()
  374. }
  375. for x := uintptr(0); x < o; x++ {
  376. err = m.Skip()
  377. if err != nil {
  378. return err
  379. }
  380. }
  381. return nil
  382. }
  383. // ReadMapHeader reads the next object
  384. // as a map header and returns the size
  385. // of the map and the number of bytes written.
  386. // It will return a TypeError{} if the next
  387. // object is not a map.
  388. func (m *Reader) ReadMapHeader() (sz uint32, err error) {
  389. var p []byte
  390. var lead byte
  391. lead, err = m.R.PeekByte()
  392. if err != nil {
  393. return
  394. }
  395. if isfixmap(lead) {
  396. sz = uint32(rfixmap(lead))
  397. _, err = m.R.Skip(1)
  398. return
  399. }
  400. switch lead {
  401. case mmap16:
  402. p, err = m.R.Next(3)
  403. if err != nil {
  404. return
  405. }
  406. sz = uint32(big.Uint16(p[1:]))
  407. return
  408. case mmap32:
  409. p, err = m.R.Next(5)
  410. if err != nil {
  411. return
  412. }
  413. sz = big.Uint32(p[1:])
  414. return
  415. default:
  416. err = badPrefix(MapType, lead)
  417. return
  418. }
  419. }
  420. // ReadMapKey reads either a 'str' or 'bin' field from
  421. // the reader and returns the value as a []byte. It uses
  422. // scratch for storage if it is large enough.
  423. func (m *Reader) ReadMapKey(scratch []byte) ([]byte, error) {
  424. out, err := m.ReadStringAsBytes(scratch)
  425. if err != nil {
  426. if tperr, ok := err.(TypeError); ok && tperr.Encoded == BinType {
  427. key, err := m.ReadBytes(scratch)
  428. if uint64(len(key)) > m.GetMaxStringLength() {
  429. return nil, ErrLimitExceeded
  430. }
  431. return key, err
  432. }
  433. return nil, err
  434. }
  435. return out, nil
  436. }
  437. // ReadMapKeyPtr returns a []byte pointing to the contents
  438. // of a valid map key. The key cannot be empty, and it
  439. // must be shorter than the total buffer size of the
  440. // *Reader. Additionally, the returned slice is only
  441. // valid until the next *Reader method call. Users
  442. // should exercise extreme care when using this
  443. // method; writing into the returned slice may
  444. // corrupt future reads.
  445. func (m *Reader) ReadMapKeyPtr() ([]byte, error) {
  446. lead, err := m.R.PeekByte()
  447. if err != nil {
  448. return nil, err
  449. }
  450. var read int
  451. var p []byte
  452. if isfixstr(lead) {
  453. read = int(rfixstr(lead))
  454. m.R.Skip(1)
  455. goto fill
  456. }
  457. switch lead {
  458. case mstr8, mbin8:
  459. p, err = m.R.Next(2)
  460. if err != nil {
  461. return nil, err
  462. }
  463. read = int(p[1])
  464. case mstr16, mbin16:
  465. p, err = m.R.Next(3)
  466. if err != nil {
  467. return nil, err
  468. }
  469. read = int(big.Uint16(p[1:]))
  470. case mstr32, mbin32:
  471. p, err = m.R.Next(5)
  472. if err != nil {
  473. return nil, err
  474. }
  475. read = int(big.Uint32(p[1:]))
  476. default:
  477. return nil, badPrefix(StrType, lead)
  478. }
  479. fill:
  480. if read == 0 {
  481. return nil, ErrShortBytes
  482. }
  483. if uint64(read) > m.GetMaxStringLength() {
  484. return nil, ErrLimitExceeded
  485. }
  486. return m.R.Next(read)
  487. }
  488. // ReadArrayHeader reads the next object as an
  489. // array header and returns the size of the array
  490. // and the number of bytes read.
  491. func (m *Reader) ReadArrayHeader() (sz uint32, err error) {
  492. lead, err := m.R.PeekByte()
  493. if err != nil {
  494. return
  495. }
  496. if isfixarray(lead) {
  497. sz = uint32(rfixarray(lead))
  498. _, err = m.R.Skip(1)
  499. return
  500. }
  501. var p []byte
  502. switch lead {
  503. case marray16:
  504. p, err = m.R.Next(3)
  505. if err != nil {
  506. return
  507. }
  508. sz = uint32(big.Uint16(p[1:]))
  509. return
  510. case marray32:
  511. p, err = m.R.Next(5)
  512. if err != nil {
  513. return
  514. }
  515. sz = big.Uint32(p[1:])
  516. return
  517. default:
  518. err = badPrefix(ArrayType, lead)
  519. return
  520. }
  521. }
  522. // ReadNil reads a 'nil' MessagePack byte from the reader
  523. func (m *Reader) ReadNil() error {
  524. p, err := m.R.PeekByte()
  525. if err != nil {
  526. return err
  527. }
  528. if p != mnil {
  529. return badPrefix(NilType, p)
  530. }
  531. _, err = m.R.Skip(1)
  532. return err
  533. }
  534. // ReadFloat64 reads a float64 from the reader.
  535. // (If the value on the wire is encoded as a float32,
  536. // it will be up-cast to a float64.)
  537. func (m *Reader) ReadFloat64() (f float64, err error) {
  538. var p []byte
  539. p, err = m.R.Peek(9)
  540. if err != nil {
  541. // we'll allow a conversion from float32 to float64,
  542. // since we don't lose any precision
  543. if err == io.EOF && len(p) > 0 && p[0] == mfloat32 {
  544. ef, err := m.ReadFloat32()
  545. return float64(ef), err
  546. }
  547. return
  548. }
  549. if p[0] != mfloat64 {
  550. // see above
  551. if p[0] == mfloat32 {
  552. ef, err := m.ReadFloat32()
  553. return float64(ef), err
  554. }
  555. err = badPrefix(Float64Type, p[0])
  556. return
  557. }
  558. f = math.Float64frombits(getMuint64(p))
  559. _, err = m.R.Skip(9)
  560. return
  561. }
  562. // ReadFloat32 reads a float32 from the reader
  563. func (m *Reader) ReadFloat32() (f float32, err error) {
  564. var p []byte
  565. p, err = m.R.Peek(5)
  566. if err != nil {
  567. return
  568. }
  569. if p[0] != mfloat32 {
  570. err = badPrefix(Float32Type, p[0])
  571. return
  572. }
  573. f = math.Float32frombits(getMuint32(p))
  574. _, err = m.R.Skip(5)
  575. return
  576. }
  577. // ReadBool reads a bool from the reader
  578. func (m *Reader) ReadBool() (b bool, err error) {
  579. var p byte
  580. p, err = m.R.PeekByte()
  581. if err != nil {
  582. return
  583. }
  584. switch p {
  585. case mtrue:
  586. b = true
  587. case mfalse:
  588. default:
  589. err = badPrefix(BoolType, p)
  590. return
  591. }
  592. _, err = m.R.Skip(1)
  593. return
  594. }
  595. // ReadDuration reads a time.Duration from the reader
  596. func (m *Reader) ReadDuration() (d time.Duration, err error) {
  597. i, err := m.ReadInt64()
  598. return time.Duration(i), err
  599. }
  600. // ReadInt64 reads an int64 from the reader
  601. func (m *Reader) ReadInt64() (i int64, err error) {
  602. var p []byte
  603. lead, err := m.R.PeekByte()
  604. if err != nil {
  605. return
  606. }
  607. if isfixint(lead) {
  608. i = int64(rfixint(lead))
  609. _, err = m.R.Skip(1)
  610. return
  611. } else if isnfixint(lead) {
  612. i = int64(rnfixint(lead))
  613. _, err = m.R.Skip(1)
  614. return
  615. }
  616. switch lead {
  617. case mint8:
  618. p, err = m.R.Next(2)
  619. if err != nil {
  620. return
  621. }
  622. i = int64(getMint8(p))
  623. return
  624. case muint8:
  625. p, err = m.R.Next(2)
  626. if err != nil {
  627. return
  628. }
  629. i = int64(getMuint8(p))
  630. return
  631. case mint16:
  632. p, err = m.R.Next(3)
  633. if err != nil {
  634. return
  635. }
  636. i = int64(getMint16(p))
  637. return
  638. case muint16:
  639. p, err = m.R.Next(3)
  640. if err != nil {
  641. return
  642. }
  643. i = int64(getMuint16(p))
  644. return
  645. case mint32:
  646. p, err = m.R.Next(5)
  647. if err != nil {
  648. return
  649. }
  650. i = int64(getMint32(p))
  651. return
  652. case muint32:
  653. p, err = m.R.Next(5)
  654. if err != nil {
  655. return
  656. }
  657. i = int64(getMuint32(p))
  658. return
  659. case mint64:
  660. p, err = m.R.Next(9)
  661. if err != nil {
  662. return
  663. }
  664. i = getMint64(p)
  665. return
  666. case muint64:
  667. p, err = m.R.Next(9)
  668. if err != nil {
  669. return
  670. }
  671. u := getMuint64(p)
  672. if u > math.MaxInt64 {
  673. err = UintOverflow{Value: u, FailedBitsize: 64}
  674. return
  675. }
  676. i = int64(u)
  677. return
  678. default:
  679. err = badPrefix(IntType, lead)
  680. return
  681. }
  682. }
  683. // ReadInt32 reads an int32 from the reader
  684. func (m *Reader) ReadInt32() (i int32, err error) {
  685. var in int64
  686. in, err = m.ReadInt64()
  687. if in > math.MaxInt32 || in < math.MinInt32 {
  688. err = IntOverflow{Value: in, FailedBitsize: 32}
  689. return
  690. }
  691. i = int32(in)
  692. return
  693. }
  694. // ReadInt16 reads an int16 from the reader
  695. func (m *Reader) ReadInt16() (i int16, err error) {
  696. var in int64
  697. in, err = m.ReadInt64()
  698. if in > math.MaxInt16 || in < math.MinInt16 {
  699. err = IntOverflow{Value: in, FailedBitsize: 16}
  700. return
  701. }
  702. i = int16(in)
  703. return
  704. }
  705. // ReadInt8 reads an int8 from the reader
  706. func (m *Reader) ReadInt8() (i int8, err error) {
  707. var in int64
  708. in, err = m.ReadInt64()
  709. if in > math.MaxInt8 || in < math.MinInt8 {
  710. err = IntOverflow{Value: in, FailedBitsize: 8}
  711. return
  712. }
  713. i = int8(in)
  714. return
  715. }
  716. // ReadInt reads an int from the reader
  717. func (m *Reader) ReadInt() (i int, err error) {
  718. if smallint {
  719. var in int32
  720. in, err = m.ReadInt32()
  721. i = int(in)
  722. return
  723. }
  724. var in int64
  725. in, err = m.ReadInt64()
  726. i = int(in)
  727. return
  728. }
  729. // ReadUint64 reads a uint64 from the reader
  730. func (m *Reader) ReadUint64() (u uint64, err error) {
  731. var p []byte
  732. lead, err := m.R.PeekByte()
  733. if err != nil {
  734. return
  735. }
  736. if isfixint(lead) {
  737. u = uint64(rfixint(lead))
  738. _, err = m.R.Skip(1)
  739. return
  740. }
  741. switch lead {
  742. case mint8:
  743. p, err = m.R.Next(2)
  744. if err != nil {
  745. return
  746. }
  747. v := int64(getMint8(p))
  748. if v < 0 {
  749. err = UintBelowZero{Value: v}
  750. return
  751. }
  752. u = uint64(v)
  753. return
  754. case muint8:
  755. p, err = m.R.Next(2)
  756. if err != nil {
  757. return
  758. }
  759. u = uint64(getMuint8(p))
  760. return
  761. case mint16:
  762. p, err = m.R.Next(3)
  763. if err != nil {
  764. return
  765. }
  766. v := int64(getMint16(p))
  767. if v < 0 {
  768. err = UintBelowZero{Value: v}
  769. return
  770. }
  771. u = uint64(v)
  772. return
  773. case muint16:
  774. p, err = m.R.Next(3)
  775. if err != nil {
  776. return
  777. }
  778. u = uint64(getMuint16(p))
  779. return
  780. case mint32:
  781. p, err = m.R.Next(5)
  782. if err != nil {
  783. return
  784. }
  785. v := int64(getMint32(p))
  786. if v < 0 {
  787. err = UintBelowZero{Value: v}
  788. return
  789. }
  790. u = uint64(v)
  791. return
  792. case muint32:
  793. p, err = m.R.Next(5)
  794. if err != nil {
  795. return
  796. }
  797. u = uint64(getMuint32(p))
  798. return
  799. case mint64:
  800. p, err = m.R.Next(9)
  801. if err != nil {
  802. return
  803. }
  804. v := getMint64(p)
  805. if v < 0 {
  806. err = UintBelowZero{Value: v}
  807. return
  808. }
  809. u = uint64(v)
  810. return
  811. case muint64:
  812. p, err = m.R.Next(9)
  813. if err != nil {
  814. return
  815. }
  816. u = getMuint64(p)
  817. return
  818. default:
  819. if isnfixint(lead) {
  820. err = UintBelowZero{Value: int64(rnfixint(lead))}
  821. } else {
  822. err = badPrefix(UintType, lead)
  823. }
  824. return
  825. }
  826. }
  827. // ReadUint32 reads a uint32 from the reader
  828. func (m *Reader) ReadUint32() (u uint32, err error) {
  829. var in uint64
  830. in, err = m.ReadUint64()
  831. if in > math.MaxUint32 {
  832. err = UintOverflow{Value: in, FailedBitsize: 32}
  833. return
  834. }
  835. u = uint32(in)
  836. return
  837. }
  838. // ReadUint16 reads a uint16 from the reader
  839. func (m *Reader) ReadUint16() (u uint16, err error) {
  840. var in uint64
  841. in, err = m.ReadUint64()
  842. if in > math.MaxUint16 {
  843. err = UintOverflow{Value: in, FailedBitsize: 16}
  844. return
  845. }
  846. u = uint16(in)
  847. return
  848. }
  849. // ReadUint8 reads a uint8 from the reader
  850. func (m *Reader) ReadUint8() (u uint8, err error) {
  851. var in uint64
  852. in, err = m.ReadUint64()
  853. if in > math.MaxUint8 {
  854. err = UintOverflow{Value: in, FailedBitsize: 8}
  855. return
  856. }
  857. u = uint8(in)
  858. return
  859. }
  860. // ReadUint reads a uint from the reader
  861. func (m *Reader) ReadUint() (u uint, err error) {
  862. if smallint {
  863. var un uint32
  864. un, err = m.ReadUint32()
  865. u = uint(un)
  866. return
  867. }
  868. var un uint64
  869. un, err = m.ReadUint64()
  870. u = uint(un)
  871. return
  872. }
  873. // ReadByte is analogous to ReadUint8.
  874. //
  875. // NOTE: this is *not* an implementation
  876. // of io.ByteReader.
  877. func (m *Reader) ReadByte() (b byte, err error) {
  878. var in uint64
  879. in, err = m.ReadUint64()
  880. if in > math.MaxUint8 {
  881. err = UintOverflow{Value: in, FailedBitsize: 8}
  882. return
  883. }
  884. b = byte(in)
  885. return
  886. }
  887. // ReadBytes reads a MessagePack 'bin' object
  888. // from the reader and returns its value. It may
  889. // use 'scratch' for storage if it is non-nil.
  890. func (m *Reader) ReadBytes(scratch []byte) (b []byte, err error) {
  891. var p []byte
  892. var lead byte
  893. p, err = m.R.Peek(2)
  894. if err != nil {
  895. return
  896. }
  897. lead = p[0]
  898. var read int64
  899. switch lead {
  900. case mbin8:
  901. read = int64(p[1])
  902. m.R.Skip(2)
  903. case mbin16:
  904. p, err = m.R.Next(3)
  905. if err != nil {
  906. return
  907. }
  908. read = int64(big.Uint16(p[1:]))
  909. case mbin32:
  910. p, err = m.R.Next(5)
  911. if err != nil {
  912. return
  913. }
  914. read = int64(big.Uint32(p[1:]))
  915. default:
  916. err = badPrefix(BinType, lead)
  917. return
  918. }
  919. if int64(cap(scratch)) < read {
  920. if read > int64(m.GetMaxElements()) {
  921. err = ErrLimitExceeded
  922. return
  923. }
  924. b = make([]byte, read)
  925. } else {
  926. b = scratch[0:read]
  927. }
  928. _, err = m.R.ReadFull(b)
  929. return
  930. }
  931. // ReadBytesLimit reads a MessagePack 'bin' object
  932. // from the reader and returns its value. It may
  933. // use 'scratch' for storage if it is non-nil.
  934. // If n >= 0 this will be the maximum bytes read.
  935. // If n < 0, the cap(scratch) will be the limit.
  936. // If SetMaxElements has been used on the Reader,
  937. // that will only be checked if the scratch is too small.
  938. func (m *Reader) ReadBytesLimit(scratch []byte, n int64) (b []byte, err error) {
  939. var p []byte
  940. var lead byte
  941. p, err = m.R.Peek(2)
  942. if err != nil {
  943. return
  944. }
  945. lead = p[0]
  946. var read int64
  947. switch lead {
  948. case mbin8:
  949. read = int64(p[1])
  950. m.R.Skip(2)
  951. case mbin16:
  952. p, err = m.R.Next(3)
  953. if err != nil {
  954. return
  955. }
  956. read = int64(big.Uint16(p[1:]))
  957. case mbin32:
  958. p, err = m.R.Next(5)
  959. if err != nil {
  960. return
  961. }
  962. read = int64(big.Uint32(p[1:]))
  963. default:
  964. err = badPrefix(BinType, lead)
  965. return
  966. }
  967. if n < 0 {
  968. n = int64(cap(scratch))
  969. }
  970. if read > n {
  971. err = ErrLimitExceeded
  972. return
  973. }
  974. if int64(cap(scratch)) < read {
  975. b = make([]byte, read)
  976. if read > int64(m.GetMaxElements()) {
  977. err = ErrLimitExceeded
  978. return
  979. }
  980. } else {
  981. b = scratch[0:read]
  982. }
  983. _, err = m.R.ReadFull(b)
  984. return
  985. }
  986. // ReadBytesHeader reads the size header
  987. // of a MessagePack 'bin' object. The user
  988. // is responsible for dealing with the next
  989. // 'sz' bytes from the reader in an application-specific
  990. // way.
  991. func (m *Reader) ReadBytesHeader() (sz uint32, err error) {
  992. var p []byte
  993. lead, err := m.R.PeekByte()
  994. if err != nil {
  995. return
  996. }
  997. switch lead {
  998. case mbin8:
  999. p, err = m.R.Next(2)
  1000. if err != nil {
  1001. return
  1002. }
  1003. sz = uint32(p[1])
  1004. return
  1005. case mbin16:
  1006. p, err = m.R.Next(3)
  1007. if err != nil {
  1008. return
  1009. }
  1010. sz = uint32(big.Uint16(p[1:]))
  1011. return
  1012. case mbin32:
  1013. p, err = m.R.Next(5)
  1014. if err != nil {
  1015. return
  1016. }
  1017. sz = big.Uint32(p[1:])
  1018. return
  1019. default:
  1020. err = badPrefix(BinType, lead)
  1021. return
  1022. }
  1023. }
  1024. // ReadExactBytes reads a MessagePack 'bin'-encoded
  1025. // object off of the wire into the provided slice. An
  1026. // ArrayError will be returned if the object is not
  1027. // exactly the length of the input slice.
  1028. func (m *Reader) ReadExactBytes(into []byte) error {
  1029. p, err := m.R.Peek(2)
  1030. if err != nil {
  1031. return err
  1032. }
  1033. lead := p[0]
  1034. var read int64 // bytes to read
  1035. var skip int // prefix size to skip
  1036. switch lead {
  1037. case mbin8:
  1038. read = int64(p[1])
  1039. skip = 2
  1040. case mbin16:
  1041. p, err = m.R.Peek(3)
  1042. if err != nil {
  1043. return err
  1044. }
  1045. read = int64(big.Uint16(p[1:]))
  1046. skip = 3
  1047. case mbin32:
  1048. p, err = m.R.Peek(5)
  1049. if err != nil {
  1050. return err
  1051. }
  1052. read = int64(big.Uint32(p[1:]))
  1053. skip = 5
  1054. default:
  1055. return badPrefix(BinType, lead)
  1056. }
  1057. if read != int64(len(into)) {
  1058. return ArrayError{Wanted: uint32(len(into)), Got: uint32(read)}
  1059. }
  1060. m.R.Skip(skip)
  1061. _, err = m.R.ReadFull(into)
  1062. return err
  1063. }
  1064. // ReadStringAsBytes reads a MessagePack 'str' (utf-8) string
  1065. // and returns its value as bytes. It may use 'scratch' for storage
  1066. // if it is non-nil.
  1067. func (m *Reader) ReadStringAsBytes(scratch []byte) (b []byte, err error) {
  1068. var p []byte
  1069. lead, err := m.R.PeekByte()
  1070. if err != nil {
  1071. return
  1072. }
  1073. var read int64
  1074. if isfixstr(lead) {
  1075. read = int64(rfixstr(lead))
  1076. m.R.Skip(1)
  1077. goto fill
  1078. }
  1079. switch lead {
  1080. case mstr8:
  1081. p, err = m.R.Next(2)
  1082. if err != nil {
  1083. return
  1084. }
  1085. read = int64(p[1])
  1086. case mstr16:
  1087. p, err = m.R.Next(3)
  1088. if err != nil {
  1089. return
  1090. }
  1091. read = int64(big.Uint16(p[1:]))
  1092. case mstr32:
  1093. p, err = m.R.Next(5)
  1094. if err != nil {
  1095. return
  1096. }
  1097. read = int64(big.Uint32(p[1:]))
  1098. default:
  1099. err = badPrefix(StrType, lead)
  1100. return
  1101. }
  1102. fill:
  1103. if uint64(read) > m.GetMaxStringLength() {
  1104. err = ErrLimitExceeded
  1105. return
  1106. }
  1107. if int64(cap(scratch)) < read {
  1108. b = make([]byte, read)
  1109. } else {
  1110. b = scratch[0:read]
  1111. }
  1112. _, err = m.R.ReadFull(b)
  1113. return
  1114. }
  1115. // ReadStringHeader reads a string header
  1116. // off of the wire. The user is then responsible
  1117. // for dealing with the next 'sz' bytes from
  1118. // the reader in an application-specific manner.
  1119. func (m *Reader) ReadStringHeader() (sz uint32, err error) {
  1120. lead, err := m.R.PeekByte()
  1121. if err != nil {
  1122. return
  1123. }
  1124. if isfixstr(lead) {
  1125. sz = uint32(rfixstr(lead))
  1126. m.R.Skip(1)
  1127. return
  1128. }
  1129. var p []byte
  1130. switch lead {
  1131. case mstr8:
  1132. p, err = m.R.Next(2)
  1133. if err != nil {
  1134. return
  1135. }
  1136. sz = uint32(p[1])
  1137. return
  1138. case mstr16:
  1139. p, err = m.R.Next(3)
  1140. if err != nil {
  1141. return
  1142. }
  1143. sz = uint32(big.Uint16(p[1:]))
  1144. return
  1145. case mstr32:
  1146. p, err = m.R.Next(5)
  1147. if err != nil {
  1148. return
  1149. }
  1150. sz = big.Uint32(p[1:])
  1151. return
  1152. default:
  1153. err = badPrefix(StrType, lead)
  1154. return
  1155. }
  1156. }
  1157. // ReadString reads a utf-8 string from the reader
  1158. func (m *Reader) ReadString() (s string, err error) {
  1159. var read int64
  1160. lead, err := m.R.PeekByte()
  1161. if err != nil {
  1162. return
  1163. }
  1164. var p []byte
  1165. if isfixstr(lead) {
  1166. read = int64(rfixstr(lead))
  1167. m.R.Skip(1)
  1168. goto fill
  1169. }
  1170. switch lead {
  1171. case mstr8:
  1172. p, err = m.R.Next(2)
  1173. if err != nil {
  1174. return
  1175. }
  1176. read = int64(p[1])
  1177. case mstr16:
  1178. p, err = m.R.Next(3)
  1179. if err != nil {
  1180. return
  1181. }
  1182. read = int64(big.Uint16(p[1:]))
  1183. case mstr32:
  1184. p, err = m.R.Next(5)
  1185. if err != nil {
  1186. return
  1187. }
  1188. read = int64(big.Uint32(p[1:]))
  1189. default:
  1190. err = badPrefix(StrType, lead)
  1191. return
  1192. }
  1193. fill:
  1194. if read == 0 {
  1195. s, err = "", nil
  1196. return
  1197. }
  1198. if uint64(read) > m.GetMaxStringLength() {
  1199. err = ErrLimitExceeded
  1200. return
  1201. }
  1202. // reading into the memory
  1203. // that will become the string
  1204. // itself has vastly superior
  1205. // worst-case performance, because
  1206. // the reader buffer doesn't have
  1207. // to be large enough to hold the string.
  1208. // the idea here is to make it more
  1209. // difficult for someone malicious
  1210. // to cause the system to run out of
  1211. // memory by sending very large strings.
  1212. //
  1213. // NOTE: this works because the argument
  1214. // passed to (*fwd.Reader).ReadFull escapes
  1215. // to the heap; its argument may, in turn,
  1216. // be passed to the underlying reader, and
  1217. // thus escape analysis *must* conclude that
  1218. // 'out' escapes.
  1219. out := make([]byte, read)
  1220. _, err = m.R.ReadFull(out)
  1221. if err != nil {
  1222. return
  1223. }
  1224. s = UnsafeString(out)
  1225. return
  1226. }
  1227. // ReadComplex64 reads a complex64 from the reader
  1228. func (m *Reader) ReadComplex64() (f complex64, err error) {
  1229. var p []byte
  1230. p, err = m.R.Peek(10)
  1231. if err != nil {
  1232. return
  1233. }
  1234. if p[0] != mfixext8 {
  1235. err = badPrefix(Complex64Type, p[0])
  1236. return
  1237. }
  1238. if int8(p[1]) != Complex64Extension {
  1239. err = errExt(int8(p[1]), Complex64Extension)
  1240. return
  1241. }
  1242. f = complex(math.Float32frombits(big.Uint32(p[2:])),
  1243. math.Float32frombits(big.Uint32(p[6:])))
  1244. _, err = m.R.Skip(10)
  1245. return
  1246. }
  1247. // ReadComplex128 reads a complex128 from the reader
  1248. func (m *Reader) ReadComplex128() (f complex128, err error) {
  1249. var p []byte
  1250. p, err = m.R.Peek(18)
  1251. if err != nil {
  1252. return
  1253. }
  1254. if p[0] != mfixext16 {
  1255. err = badPrefix(Complex128Type, p[0])
  1256. return
  1257. }
  1258. if int8(p[1]) != Complex128Extension {
  1259. err = errExt(int8(p[1]), Complex128Extension)
  1260. return
  1261. }
  1262. f = complex(math.Float64frombits(big.Uint64(p[2:])),
  1263. math.Float64frombits(big.Uint64(p[10:])))
  1264. _, err = m.R.Skip(18)
  1265. return
  1266. }
  1267. // ReadMapStrIntf reads a MessagePack map into a map[string]interface{}.
  1268. // (You must pass a non-nil map into the function.)
  1269. func (m *Reader) ReadMapStrIntf(mp map[string]any) (err error) {
  1270. var sz uint32
  1271. sz, err = m.ReadMapHeader()
  1272. if err != nil {
  1273. return
  1274. }
  1275. for key := range mp {
  1276. delete(mp, key)
  1277. }
  1278. if sz > m.GetMaxElements() {
  1279. err = ErrLimitExceeded
  1280. return
  1281. }
  1282. for i := uint32(0); i < sz; i++ {
  1283. var key string
  1284. var val any
  1285. key, err = m.ReadString()
  1286. if err != nil {
  1287. return
  1288. }
  1289. val, err = m.ReadIntf()
  1290. if err != nil {
  1291. return
  1292. }
  1293. mp[key] = val
  1294. }
  1295. return
  1296. }
  1297. // ReadTimeUTC reads a time.Time object from the reader.
  1298. // The returned time's location will be set to UTC.
  1299. func (m *Reader) ReadTimeUTC() (t time.Time, err error) {
  1300. t, err = m.ReadTime()
  1301. return t.UTC(), err
  1302. }
  1303. // ReadTime reads a time.Time object from the reader.
  1304. // The returned time's location will be set to time.Local.
  1305. func (m *Reader) ReadTime() (t time.Time, err error) {
  1306. offset, length, extType, err := m.peekExtensionHeader()
  1307. if err != nil {
  1308. return t, err
  1309. }
  1310. switch extType {
  1311. case TimeExtension:
  1312. var p []byte
  1313. p, err = m.R.Peek(15)
  1314. if err != nil {
  1315. return
  1316. }
  1317. if p[0] != mext8 || p[1] != 12 {
  1318. err = badPrefix(TimeType, p[0])
  1319. return
  1320. }
  1321. if int8(p[2]) != TimeExtension {
  1322. err = errExt(int8(p[2]), TimeExtension)
  1323. return
  1324. }
  1325. sec, nsec := getUnix(p[3:])
  1326. t = time.Unix(sec, int64(nsec)).Local()
  1327. _, err = m.R.Skip(15)
  1328. return
  1329. case MsgTimeExtension:
  1330. switch length {
  1331. case 4, 8, 12:
  1332. var tmp [12]byte
  1333. _, err = m.R.Skip(offset)
  1334. if err != nil {
  1335. return
  1336. }
  1337. var n int
  1338. n, err = m.R.Read(tmp[:length])
  1339. if err != nil {
  1340. return
  1341. }
  1342. if n != length {
  1343. err = ErrShortBytes
  1344. return
  1345. }
  1346. b := tmp[:length]
  1347. switch length {
  1348. case 4:
  1349. t = time.Unix(int64(binary.BigEndian.Uint32(b)), 0).Local()
  1350. case 8:
  1351. v := binary.BigEndian.Uint64(b)
  1352. nanos := int64(v >> 34)
  1353. if nanos > 999999999 {
  1354. // In timestamp 64 and timestamp 96 formats, nanoseconds must not be larger than 999999999.
  1355. err = InvalidTimestamp{Nanos: nanos}
  1356. return
  1357. }
  1358. t = time.Unix(int64(v&(1<<34-1)), nanos).Local()
  1359. case 12:
  1360. nanos := int64(binary.BigEndian.Uint32(b))
  1361. if nanos > 999999999 {
  1362. // In timestamp 64 and timestamp 96 formats, nanoseconds must not be larger than 999999999.
  1363. err = InvalidTimestamp{Nanos: nanos}
  1364. return
  1365. }
  1366. ux := int64(binary.BigEndian.Uint64(b[4:]))
  1367. t = time.Unix(ux, nanos).Local()
  1368. }
  1369. default:
  1370. err = InvalidTimestamp{FieldLength: length}
  1371. }
  1372. default:
  1373. err = errExt(extType, TimeExtension)
  1374. }
  1375. return
  1376. }
  1377. // ReadJSONNumber reads an integer or a float value and return as json.Number
  1378. func (m *Reader) ReadJSONNumber() (n json.Number, err error) {
  1379. t, err := m.NextType()
  1380. if err != nil {
  1381. return
  1382. }
  1383. switch t {
  1384. case IntType:
  1385. v, err := m.ReadInt64()
  1386. if err == nil {
  1387. return json.Number(strconv.FormatInt(v, 10)), nil
  1388. }
  1389. return "", err
  1390. case UintType:
  1391. v, err := m.ReadUint64()
  1392. if err == nil {
  1393. return json.Number(strconv.FormatUint(v, 10)), nil
  1394. }
  1395. return "", err
  1396. case Float32Type, Float64Type:
  1397. v, err := m.ReadFloat64()
  1398. if err == nil {
  1399. return json.Number(strconv.FormatFloat(v, 'f', -1, 64)), nil
  1400. }
  1401. return "", err
  1402. }
  1403. return "", TypeError{Method: NumberType, Encoded: t}
  1404. }
  1405. // ReadIntf reads out the next object as a raw interface{}/any.
  1406. // Arrays are decoded as []interface{}, and maps are decoded
  1407. // as map[string]interface{}. Integers are decoded as int64
  1408. // and unsigned integers are decoded as uint64.
  1409. func (m *Reader) ReadIntf() (i any, err error) {
  1410. var t Type
  1411. t, err = m.NextType()
  1412. if err != nil {
  1413. return
  1414. }
  1415. switch t {
  1416. case BoolType:
  1417. i, err = m.ReadBool()
  1418. return
  1419. case IntType:
  1420. i, err = m.ReadInt64()
  1421. return
  1422. case UintType:
  1423. i, err = m.ReadUint64()
  1424. return
  1425. case BinType:
  1426. i, err = m.ReadBytes(nil)
  1427. return
  1428. case StrType:
  1429. i, err = m.ReadString()
  1430. return
  1431. case Complex64Type:
  1432. i, err = m.ReadComplex64()
  1433. return
  1434. case Complex128Type:
  1435. i, err = m.ReadComplex128()
  1436. return
  1437. case TimeType:
  1438. i, err = m.ReadTime()
  1439. return
  1440. case DurationType:
  1441. i, err = m.ReadDuration()
  1442. return
  1443. case ExtensionType:
  1444. var t int8
  1445. t, err = m.peekExtensionType()
  1446. if err != nil {
  1447. return
  1448. }
  1449. f, ok := extensionReg[t]
  1450. if ok {
  1451. e := f()
  1452. err = m.ReadExtension(e)
  1453. i = e
  1454. return
  1455. }
  1456. var e RawExtension
  1457. e.Type = t
  1458. err = m.ReadExtension(&e)
  1459. i = &e
  1460. return
  1461. case MapType:
  1462. // This can call back here, so treat as recursive call.
  1463. if done, err := m.recursiveCall(); err != nil {
  1464. return nil, err
  1465. } else {
  1466. defer done()
  1467. }
  1468. mp := make(map[string]any)
  1469. err = m.ReadMapStrIntf(mp)
  1470. i = mp
  1471. return
  1472. case NilType:
  1473. err = m.ReadNil()
  1474. i = nil
  1475. return
  1476. case Float32Type:
  1477. i, err = m.ReadFloat32()
  1478. return
  1479. case Float64Type:
  1480. i, err = m.ReadFloat64()
  1481. return
  1482. case ArrayType:
  1483. var sz uint32
  1484. sz, err = m.ReadArrayHeader()
  1485. if err != nil {
  1486. return
  1487. }
  1488. if done, err := m.recursiveCall(); err != nil {
  1489. return nil, err
  1490. } else {
  1491. defer done()
  1492. }
  1493. if sz > m.GetMaxElements() {
  1494. err = ErrLimitExceeded
  1495. return
  1496. }
  1497. out := make([]any, int(sz))
  1498. for j := range out {
  1499. out[j], err = m.ReadIntf()
  1500. if err != nil {
  1501. return
  1502. }
  1503. }
  1504. i = out
  1505. return
  1506. default:
  1507. return nil, fatal // unreachable
  1508. }
  1509. }
  1510. // ReadBinaryUnmarshal reads a binary-encoded object from the reader and unmarshals it into dst.
  1511. func (m *Reader) ReadBinaryUnmarshal(dst encoding.BinaryUnmarshaler) (err error) {
  1512. defer func() {
  1513. if r := recover(); r != nil {
  1514. err = fmt.Errorf("msgp: panic during UnmarshalBinary: %v", r)
  1515. }
  1516. }()
  1517. tmp := bytesPool.Get().([]byte)
  1518. defer bytesPool.Put(tmp) //nolint:staticcheck
  1519. tmp, err = m.ReadBytes(tmp[:0])
  1520. if err != nil {
  1521. return
  1522. }
  1523. return dst.UnmarshalBinary(tmp)
  1524. }
  1525. // ReadTextUnmarshal reads a text-encoded bin array from the reader and unmarshals it into dst.
  1526. func (m *Reader) ReadTextUnmarshal(dst encoding.TextUnmarshaler) (err error) {
  1527. defer func() {
  1528. if r := recover(); r != nil {
  1529. err = fmt.Errorf("msgp: panic during UnmarshalText: %v", r)
  1530. }
  1531. }()
  1532. tmp := bytesPool.Get().([]byte)
  1533. defer bytesPool.Put(tmp) //nolint:staticcheck
  1534. tmp, err = m.ReadBytes(tmp[:0])
  1535. if err != nil {
  1536. return
  1537. }
  1538. return dst.UnmarshalText(tmp)
  1539. }
  1540. // ReadTextUnmarshalString reads a text-encoded string from the reader and unmarshals it into dst.
  1541. func (m *Reader) ReadTextUnmarshalString(dst encoding.TextUnmarshaler) (err error) {
  1542. defer func() {
  1543. if r := recover(); r != nil {
  1544. err = fmt.Errorf("msgp: panic during UnmarshalText: %v", r)
  1545. }
  1546. }()
  1547. tmp := bytesPool.Get().([]byte)
  1548. defer bytesPool.Put(tmp) //nolint:staticcheck
  1549. tmp, err = m.ReadStringAsBytes(tmp[:0])
  1550. if err != nil {
  1551. return
  1552. }
  1553. return dst.UnmarshalText(tmp)
  1554. }