reader.go 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324
  1. // Copyright (c) 2012-2018 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a MIT license found in the LICENSE file.
  3. package codec
  4. import "io"
  5. /*
  6. // decReader abstracts the reading source, allowing implementations that can
  7. // read from an io.Reader or directly off a byte slice with zero-copying.
  8. //
  9. // Deprecated: Use decRd instead.
  10. type decReader interface {
  11. unreadn1()
  12. // readx will use the implementation scratch buffer if possible i.e. n < len(scratchbuf), OR
  13. // just return a view of the []byte being decoded from.
  14. // Ensure you call detachZeroCopyBytes later if this needs to be sent outside codec control.
  15. readx(n int) []byte
  16. readb([]byte)
  17. readn1() uint8
  18. numread() uint // number of bytes read
  19. track()
  20. stopTrack() []byte
  21. // skip will skip any byte that matches, and return the first non-matching byte
  22. skip(accept *bitset256) (token byte)
  23. // readTo will read any byte that matches, stopping once no-longer matching.
  24. readTo(accept *bitset256) (out []byte)
  25. // readUntil will read, only stopping once it matches the 'stop' byte.
  26. readUntil(stop byte) (out []byte)
  27. }
  28. */
  29. // ------------------------------------------------
  30. type unreadByteStatus uint8
  31. // unreadByteStatus goes from
  32. // undefined (when initialized) -- (read) --> canUnread -- (unread) --> canRead ...
  33. const (
  34. unreadByteUndefined unreadByteStatus = iota
  35. unreadByteCanRead
  36. unreadByteCanUnread
  37. )
  38. // func appendPool(bs []byte, b byte, bufp *bytesBufPooler) []byte {
  39. // if cap(bs)-len(bs) < 1 {
  40. // bs = bufp.ensureCap(len(bs)+1, bs)
  41. // }
  42. // bs = append(bs, b)
  43. // return bs
  44. // }
  45. // func appendPoolMany(bs []byte, b []byte, bufp *bytesBufPooler) []byte {
  46. // if cap(bs)-len(bs) < 1 {
  47. // bs = bufp.ensureCap(len(bs)+1, bs)
  48. // }
  49. // bs = append(bs, b...)
  50. // return bs
  51. // }
  52. // --------------------
  53. type ioDecReaderCommon struct {
  54. r io.Reader // the reader passed in
  55. n uint // num read
  56. l byte // last byte
  57. ls unreadByteStatus // last byte status
  58. trb bool // tracking bytes turned on
  59. _ bool
  60. b [4]byte // tiny buffer for reading single bytes
  61. blist *bytesFreelist
  62. tr []byte // buffer for tracking bytes
  63. bufr []byte // buffer for readTo/readUntil
  64. }
  65. func (z *ioDecReaderCommon) reset(r io.Reader, blist *bytesFreelist) {
  66. z.blist = blist
  67. z.r = r
  68. z.ls = unreadByteUndefined
  69. z.l, z.n = 0, 0
  70. z.trb = false
  71. }
  72. func (z *ioDecReaderCommon) numread() uint {
  73. return z.n
  74. }
  75. func (z *ioDecReaderCommon) track() {
  76. z.tr = z.blist.check(z.tr, 256)[:0]
  77. z.trb = true
  78. }
  79. func (z *ioDecReaderCommon) stopTrack() (bs []byte) {
  80. z.trb = false
  81. return z.tr
  82. }
  83. // func (z *ioDecReaderCommon) resetBufr() {
  84. // if cap(z.bufr) < 128 {
  85. // blist.put(z.bufr)
  86. // z.bufr = blist.get(128)
  87. // }
  88. // z.bufr = z.bufr[:0]
  89. // }
  90. // func (z *ioDecReaderCommon) release() {
  91. // z.tr.end()
  92. // z.bufr.end()
  93. // }
  94. // ------------------------------------------
  95. // ioDecReader is a decReader that reads off an io.Reader.
  96. //
  97. // It also has a fallback implementation of ByteScanner if needed.
  98. type ioDecReader struct {
  99. ioDecReaderCommon
  100. rr io.Reader
  101. br io.ByteScanner
  102. x [scratchByteArrayLen]byte // for: get struct field name, swallow valueTypeBytes, etc
  103. // _ [1]uint64 // padding
  104. }
  105. func (z *ioDecReader) reset(r io.Reader, blist *bytesFreelist) {
  106. z.ioDecReaderCommon.reset(r, blist)
  107. var ok bool
  108. z.rr = r
  109. z.br, ok = r.(io.ByteScanner)
  110. if !ok {
  111. z.br = z
  112. z.rr = z
  113. }
  114. }
  115. func (z *ioDecReader) Read(p []byte) (n int, err error) {
  116. if len(p) == 0 {
  117. return
  118. }
  119. var firstByte bool
  120. if z.ls == unreadByteCanRead {
  121. z.ls = unreadByteCanUnread
  122. p[0] = z.l
  123. if len(p) == 1 {
  124. n = 1
  125. return
  126. }
  127. firstByte = true
  128. p = p[1:]
  129. }
  130. n, err = z.r.Read(p)
  131. if n > 0 {
  132. if err == io.EOF && n == len(p) {
  133. err = nil // read was successful, so postpone EOF (till next time)
  134. }
  135. z.l = p[n-1]
  136. z.ls = unreadByteCanUnread
  137. }
  138. if firstByte {
  139. n++
  140. }
  141. return
  142. }
  143. func (z *ioDecReader) ReadByte() (c byte, err error) {
  144. n, err := z.Read(z.b[:1])
  145. if n == 1 {
  146. c = z.b[0]
  147. if err == io.EOF {
  148. err = nil // read was successful, so postpone EOF (till next time)
  149. }
  150. }
  151. return
  152. }
  153. func (z *ioDecReader) UnreadByte() (err error) {
  154. switch z.ls {
  155. case unreadByteCanUnread:
  156. z.ls = unreadByteCanRead
  157. case unreadByteCanRead:
  158. err = errDecUnreadByteLastByteNotRead
  159. case unreadByteUndefined:
  160. err = errDecUnreadByteNothingToRead
  161. default:
  162. err = errDecUnreadByteUnknown
  163. }
  164. return
  165. }
  166. func (z *ioDecReader) readn3() (bs [3]byte) {
  167. z.readb(bs[:])
  168. // copy(bs[:], z.readx(3))
  169. return
  170. }
  171. func (z *ioDecReader) readn4() (bs [4]byte) {
  172. z.readb(bs[:])
  173. // copy(bs[:], z.readx(4))
  174. return
  175. }
  176. func (z *ioDecReader) readx(n uint) (bs []byte) {
  177. if n == 0 {
  178. return
  179. }
  180. if n < uint(len(z.x)) {
  181. bs = z.x[:n]
  182. } else {
  183. bs = make([]byte, n)
  184. }
  185. if _, err := decReadFull(z.rr, bs); err != nil {
  186. panic(err)
  187. }
  188. z.n += uint(len(bs))
  189. if z.trb {
  190. z.tr = append(z.tr, bs...)
  191. }
  192. return
  193. }
  194. func (z *ioDecReader) readb(bs []byte) {
  195. if len(bs) == 0 {
  196. return
  197. }
  198. if _, err := decReadFull(z.rr, bs); err != nil {
  199. panic(err)
  200. }
  201. z.n += uint(len(bs))
  202. if z.trb {
  203. z.tr = append(z.tr, bs...)
  204. }
  205. }
  206. func (z *ioDecReader) readn1eof() (b uint8, eof bool) {
  207. b, err := z.br.ReadByte()
  208. if err == nil {
  209. z.n++
  210. if z.trb {
  211. z.tr = append(z.tr, b)
  212. }
  213. } else if err == io.EOF {
  214. eof = true
  215. } else {
  216. panic(err)
  217. }
  218. return
  219. }
  220. func (z *ioDecReader) readn1() (b uint8) {
  221. b, err := z.br.ReadByte()
  222. if err == nil {
  223. z.n++
  224. if z.trb {
  225. z.tr = append(z.tr, b)
  226. }
  227. return
  228. }
  229. panic(err)
  230. }
  231. func (z *ioDecReader) skip(accept *bitset256) (token byte) {
  232. var eof bool
  233. // for {
  234. // token, eof = z.readn1eof()
  235. // if eof {
  236. // return
  237. // }
  238. // if accept.isset(token) {
  239. // continue
  240. // }
  241. // return
  242. // }
  243. LOOP:
  244. token, eof = z.readn1eof()
  245. if eof {
  246. return
  247. }
  248. if accept.isset(token) {
  249. goto LOOP
  250. }
  251. return
  252. }
  253. func (z *ioDecReader) readTo(accept *bitset256) []byte {
  254. // out = in
  255. // for {
  256. // token, eof := z.readn1eof()
  257. // if eof {
  258. // return
  259. // }
  260. // if accept.isset(token) {
  261. // out = append(out, token)
  262. // } else {
  263. // z.unreadn1()
  264. // return
  265. // }
  266. // }
  267. z.bufr = z.blist.check(z.bufr, 256)[:0]
  268. LOOP:
  269. token, eof := z.readn1eof()
  270. if eof {
  271. return z.bufr
  272. }
  273. if accept.isset(token) {
  274. // out = append(out, token)
  275. z.bufr = append(z.bufr, token)
  276. goto LOOP
  277. }
  278. z.unreadn1()
  279. return z.bufr
  280. }
  281. func (z *ioDecReader) readUntil(stop byte) []byte {
  282. // for {
  283. // token, eof := z.readn1eof()
  284. // if eof {
  285. // panic(io.EOF)
  286. // }
  287. // out = append(out, token)
  288. // if token == stop {
  289. // return
  290. // }
  291. // }
  292. z.bufr = z.blist.check(z.bufr, 256)[:0]
  293. LOOP:
  294. token, eof := z.readn1eof()
  295. if eof {
  296. panic(io.EOF)
  297. }
  298. z.bufr = append(z.bufr, token)
  299. if token == stop {
  300. return z.bufr
  301. }
  302. goto LOOP
  303. }
  304. //go:noinline
  305. func (z *ioDecReader) unreadn1() {
  306. err := z.br.UnreadByte()
  307. if err != nil {
  308. panic(err)
  309. }
  310. z.n--
  311. if z.trb {
  312. if l := len(z.tr) - 1; l >= 0 {
  313. z.tr = z.tr[:l]
  314. }
  315. }
  316. }
  317. // ------------------------------------
  318. type bufioDecReader struct {
  319. ioDecReaderCommon
  320. // _ uint64 // padding (cache-aligned)
  321. c uint // cursor
  322. buf []byte
  323. // bp bytesBufSlicePooler
  324. // err error
  325. }
  326. func (z *bufioDecReader) reset(r io.Reader, bufsize int, blist *bytesFreelist) {
  327. z.ioDecReaderCommon.reset(r, blist)
  328. z.c = 0
  329. if cap(z.buf) < bufsize {
  330. // z.bp.get(bufsize)
  331. // z.buf = make([]byte, 0, bufsize)
  332. z.buf = blist.get(bufsize)
  333. }
  334. z.buf = z.buf[:0]
  335. }
  336. // func (z *bufioDecReader) release() {
  337. // z.ioDecReaderCommon.release()
  338. // // z.bp.end()
  339. // }
  340. func (z *bufioDecReader) readb(p []byte) {
  341. var n = uint(copy(p, z.buf[z.c:]))
  342. z.n += n
  343. z.c += n
  344. if len(p) == int(n) {
  345. if z.trb {
  346. z.tr = append(z.tr, p...)
  347. }
  348. } else {
  349. z.readbFill(p, n)
  350. }
  351. }
  352. func (z *bufioDecReader) readbFill(p0 []byte, n uint) {
  353. // at this point, there's nothing in z.buf to read (z.buf is fully consumed)
  354. p := p0[n:]
  355. var n2 uint
  356. var err error
  357. if len(p) > cap(z.buf) {
  358. n2, err = decReadFull(z.r, p)
  359. if err != nil {
  360. panic(err)
  361. }
  362. n += n2
  363. z.n += n2
  364. // always keep last byte in z.buf
  365. z.buf = z.buf[:1]
  366. z.buf[0] = p[len(p)-1]
  367. z.c = 1
  368. if z.trb {
  369. z.tr = append(z.tr, p0[:n]...)
  370. }
  371. return
  372. }
  373. // z.c is now 0, and len(p) <= cap(z.buf)
  374. LOOP:
  375. // for len(p) > 0 && z.err == nil {
  376. if len(p) > 0 {
  377. z.buf = z.buf[0:cap(z.buf)]
  378. var n1 int
  379. n1, err = z.r.Read(z.buf)
  380. n2 = uint(n1)
  381. if n2 == 0 && err != nil {
  382. panic(err)
  383. }
  384. z.buf = z.buf[:n2]
  385. n2 = uint(copy(p, z.buf))
  386. z.c = n2
  387. n += n2
  388. z.n += n2
  389. p = p[n2:]
  390. goto LOOP
  391. }
  392. if z.c == 0 {
  393. z.buf = z.buf[:1]
  394. z.buf[0] = p[len(p)-1]
  395. z.c = 1
  396. }
  397. if z.trb {
  398. z.tr = append(z.tr, p0[:n]...)
  399. }
  400. }
  401. func (z *bufioDecReader) readn1() (b byte) {
  402. // fast-path, so we elide calling into Read() most of the time
  403. if z.c < uint(len(z.buf)) {
  404. b = z.buf[z.c]
  405. z.c++
  406. z.n++
  407. if z.trb {
  408. z.tr = append(z.tr, b)
  409. }
  410. } else { // meaning z.c == len(z.buf) or greater ... so need to fill
  411. z.readbFill(z.b[:1], 0)
  412. b = z.b[0]
  413. }
  414. return
  415. }
  416. func (z *bufioDecReader) unreadn1() {
  417. if z.c == 0 {
  418. panic(errDecUnreadByteNothingToRead)
  419. }
  420. z.c--
  421. z.n--
  422. if z.trb {
  423. z.tr = z.tr[:len(z.tr)-1]
  424. }
  425. }
  426. func (z *bufioDecReader) readn3() (bs [3]byte) {
  427. z.readb(bs[:])
  428. return
  429. }
  430. func (z *bufioDecReader) readn4() (bs [4]byte) {
  431. z.readb(bs[:])
  432. // copy(bs[:], z.readx(4))
  433. return
  434. }
  435. func (z *bufioDecReader) readx(n uint) (bs []byte) {
  436. if n == 0 {
  437. // return
  438. } else if z.c+n <= uint(len(z.buf)) {
  439. bs = z.buf[z.c : z.c+n]
  440. z.n += n
  441. z.c += n
  442. if z.trb {
  443. z.tr = append(z.tr, bs...)
  444. }
  445. } else {
  446. bs = make([]byte, n)
  447. // n no longer used - can reuse
  448. n = uint(copy(bs, z.buf[z.c:]))
  449. z.n += n
  450. z.c += n
  451. z.readbFill(bs, n)
  452. }
  453. return
  454. }
  455. // func (z *bufioDecReader) doTrack(y uint) {
  456. // z.tr = append(z.tr, z.buf[z.c:y]...) // cost=14???
  457. // }
  458. // func (z *bufioDecReader) skipLoopFn(i uint) {
  459. // z.n += (i - z.c) - 1
  460. // i++
  461. // if z.trb {
  462. // // z.tr = append(z.tr, z.buf[z.c:i]...)
  463. // z.doTrack(i)
  464. // }
  465. // z.c = i
  466. // }
  467. func (z *bufioDecReader) skip(accept *bitset256) (token byte) {
  468. // token, _ = z.search(nil, accept, 0, 1); return
  469. // for i := z.c; i < len(z.buf); i++ {
  470. // if token = z.buf[i]; !accept.isset(token) {
  471. // z.skipLoopFn(i)
  472. // return
  473. // }
  474. // }
  475. i := z.c
  476. LOOP:
  477. if i < uint(len(z.buf)) {
  478. // inline z.skipLoopFn(i) and refactor, so cost is within inline budget
  479. token = z.buf[i]
  480. i++
  481. if accept.isset(token) {
  482. goto LOOP
  483. }
  484. z.n += i - 2 - z.c
  485. if z.trb {
  486. z.tr = append(z.tr, z.buf[z.c:i]...) // z.doTrack(i)
  487. }
  488. z.c = i
  489. return
  490. }
  491. return z.skipFill(accept)
  492. }
  493. func (z *bufioDecReader) skipFill(accept *bitset256) (token byte) {
  494. // defer func() { xdebugf("skipFill '%c'", token) }()
  495. z.n += uint(len(z.buf)) - z.c
  496. if z.trb {
  497. z.tr = append(z.tr, z.buf[z.c:]...)
  498. }
  499. var i, n2 int
  500. var err error
  501. for {
  502. z.c = 0
  503. z.buf = z.buf[0:cap(z.buf)]
  504. n2, err = z.r.Read(z.buf)
  505. if n2 == 0 && err != nil {
  506. panic(err)
  507. }
  508. z.buf = z.buf[:n2]
  509. for i, token = range z.buf {
  510. if !accept.isset(token) {
  511. z.n += (uint(i) - z.c) - 1
  512. z.loopFn(uint(i + 1))
  513. return
  514. }
  515. }
  516. // for i := 0; i < n2; i++ {
  517. // if token = z.buf[i]; !accept.isset(token) {
  518. // z.skipLoopFn(i)
  519. // return
  520. // }
  521. // }
  522. z.n += uint(n2)
  523. if z.trb {
  524. z.tr = append(z.tr, z.buf...)
  525. }
  526. }
  527. }
  528. // func (z *bufioDecReader) readLoopFn(i uint, out0 []byte) (out []byte) {
  529. // out = appendPool(out0, z.buf[z.c:i]...)
  530. // z.loopFn(i)
  531. // return
  532. // }
  533. func (z *bufioDecReader) loopFn(i uint) {
  534. if z.trb {
  535. z.tr = append(z.tr, z.buf[z.c:i]...) // z.doTrack(i)
  536. }
  537. z.c = i
  538. }
  539. // func (z *bufioDecReader) readToLoopFn(i uint, out0 []byte) (out []byte) {
  540. // // out0 is never nil
  541. // z.n += (i - z.c) - 1
  542. // return z.readLoopFn(i, out0)
  543. // }
  544. func (z *bufioDecReader) readTo(accept *bitset256) (out []byte) {
  545. // defer func() { xdebug2f("bufio: readTo: %s", out) }()
  546. // _, out = z.search(in, accept, 0, 2); return
  547. // for i := z.c; i < len(z.buf); i++ {
  548. // if !accept.isset(z.buf[i]) {
  549. // return z.readToLoopFn(i, nil)
  550. // }
  551. // }
  552. i := z.c
  553. LOOP:
  554. if i < uint(len(z.buf)) {
  555. if !accept.isset(z.buf[i]) {
  556. // return z.readToLoopFn(i, nil)
  557. // inline readToLoopFn here (for performance)
  558. z.n += (i - z.c) - 1
  559. out = z.buf[z.c:i]
  560. if z.trb {
  561. z.tr = append(z.tr, z.buf[z.c:i]...) // z.doTrack(i)
  562. }
  563. z.c = i
  564. return
  565. }
  566. i++
  567. goto LOOP
  568. }
  569. return z.readToFill(accept)
  570. }
  571. func (z *bufioDecReader) readToFill(accept *bitset256) []byte {
  572. z.bufr = z.blist.check(z.bufr, 256)[:0]
  573. z.n += uint(len(z.buf)) - z.c
  574. z.bufr = append(z.bufr, z.buf[z.c:]...)
  575. if z.trb {
  576. z.tr = append(z.tr, z.buf[z.c:]...)
  577. }
  578. var n2 int
  579. var err error
  580. for {
  581. z.c = 0
  582. z.buf = z.buf[:cap(z.buf)]
  583. n2, err = z.r.Read(z.buf)
  584. if n2 == 0 && err != nil {
  585. if err == io.EOF {
  586. return z.bufr // readTo should read until it matches or end is reached
  587. }
  588. panic(err)
  589. }
  590. z.buf = z.buf[:n2]
  591. for i, token := range z.buf {
  592. if !accept.isset(token) {
  593. z.n += (uint(i) - z.c) - 1
  594. z.bufr = append(z.bufr, z.buf[z.c:i]...)
  595. z.loopFn(uint(i))
  596. return z.bufr
  597. }
  598. }
  599. // for i := 0; i < n2; i++ {
  600. // if !accept.isset(z.buf[i]) {
  601. // return z.readToLoopFn(i, out)
  602. // }
  603. // }
  604. z.bufr = append(z.bufr, z.buf...)
  605. z.n += uint(n2)
  606. if z.trb {
  607. z.tr = append(z.tr, z.buf...)
  608. }
  609. }
  610. }
  611. // func (z *bufioDecReader) readUntilLoopFn(i uint, out0 []byte) (out []byte) {
  612. // z.n += (i - z.c) - 1
  613. // return z.readLoopFn(i+1, out0)
  614. // }
  615. func (z *bufioDecReader) readUntil(stop byte) (out []byte) {
  616. // defer func() { xdebug2f("bufio: readUntil: %s", out) }()
  617. // _, out = z.search(in, nil, stop, 4); return
  618. // for i := z.c; i < len(z.buf); i++ {
  619. // if z.buf[i] == stop {
  620. // return z.readUntilLoopFn(i, nil)
  621. // }
  622. // }
  623. i := z.c
  624. LOOP:
  625. if i < uint(len(z.buf)) {
  626. if z.buf[i] == stop {
  627. // inline readUntilLoopFn
  628. // return z.readUntilLoopFn(i, nil)
  629. z.n += (i - z.c) - 1
  630. i++
  631. out = z.buf[z.c:i]
  632. if z.trb {
  633. z.tr = append(z.tr, z.buf[z.c:i]...) // z.doTrack(i)
  634. }
  635. z.c = i
  636. return
  637. }
  638. i++
  639. goto LOOP
  640. }
  641. return z.readUntilFill(stop)
  642. }
  643. func (z *bufioDecReader) readUntilFill(stop byte) []byte {
  644. z.bufr = z.blist.check(z.bufr, 256)[:0]
  645. z.n += uint(len(z.buf)) - z.c
  646. z.bufr = append(z.bufr, z.buf[z.c:]...)
  647. if z.trb {
  648. z.tr = append(z.tr, z.buf[z.c:]...)
  649. }
  650. for {
  651. z.c = 0
  652. z.buf = z.buf[0:cap(z.buf)]
  653. n1, err := z.r.Read(z.buf)
  654. if n1 == 0 && err != nil {
  655. panic(err)
  656. }
  657. n2 := uint(n1)
  658. z.buf = z.buf[:n2]
  659. for i, token := range z.buf {
  660. if token == stop {
  661. z.n += (uint(i) - z.c) - 1
  662. z.bufr = append(z.bufr, z.buf[z.c:i+1]...)
  663. z.loopFn(uint(i + 1))
  664. return z.bufr
  665. }
  666. }
  667. // for i := 0; i < n2; i++ {
  668. // if z.buf[i] == stop {
  669. // return z.readUntilLoopFn(i, out)
  670. // }
  671. // }
  672. z.bufr = append(z.bufr, z.buf...)
  673. z.n += n2
  674. if z.trb {
  675. z.tr = append(z.tr, z.buf...)
  676. }
  677. }
  678. }
  679. // ------------------------------------
  680. // bytesDecReader is a decReader that reads off a byte slice with zero copying
  681. type bytesDecReader struct {
  682. b []byte // data
  683. c uint // cursor
  684. t uint // track start
  685. // a int // available
  686. }
  687. func (z *bytesDecReader) reset(in []byte) {
  688. z.b = in
  689. // z.a = len(in)
  690. z.c = 0
  691. z.t = 0
  692. }
  693. func (z *bytesDecReader) numread() uint {
  694. return z.c
  695. }
  696. func (z *bytesDecReader) unreadn1() {
  697. if z.c == 0 || len(z.b) == 0 {
  698. panic(errBytesDecReaderCannotUnread)
  699. }
  700. z.c--
  701. // z.a++
  702. }
  703. func (z *bytesDecReader) readx(n uint) (bs []byte) {
  704. // slicing from a non-constant start position is more expensive,
  705. // as more computation is required to decipher the pointer start position.
  706. // However, we do it only once, and it's better than reslicing both z.b and return value.
  707. // if n <= 0 {
  708. // } else if z.a == 0 {
  709. // panic(io.EOF)
  710. // } else if n > z.a {
  711. // panic(io.ErrUnexpectedEOF)
  712. // } else {
  713. // c0 := z.c
  714. // z.c = c0 + n
  715. // z.a = z.a - n
  716. // bs = z.b[c0:z.c]
  717. // }
  718. // return
  719. if n != 0 {
  720. z.c += n
  721. if z.c > uint(len(z.b)) {
  722. z.c = uint(len(z.b))
  723. panic(io.EOF)
  724. }
  725. bs = z.b[z.c-n : z.c]
  726. }
  727. return
  728. // if n == 0 {
  729. // } else if z.c+n > uint(len(z.b)) {
  730. // z.c = uint(len(z.b))
  731. // panic(io.EOF)
  732. // } else {
  733. // z.c += n
  734. // bs = z.b[z.c-n : z.c]
  735. // }
  736. // return
  737. // if n == 0 {
  738. // return
  739. // }
  740. // if z.c == uint(len(z.b)) {
  741. // panic(io.EOF)
  742. // }
  743. // if z.c+n > uint(len(z.b)) {
  744. // panic(io.ErrUnexpectedEOF)
  745. // }
  746. // // z.a -= n
  747. // z.c += n
  748. // return z.b[z.c-n : z.c]
  749. }
  750. func (z *bytesDecReader) readb(bs []byte) {
  751. copy(bs, z.readx(uint(len(bs))))
  752. }
  753. func (z *bytesDecReader) readn1() (v uint8) {
  754. if z.c >= uint(len(z.b)) {
  755. panic(io.EOF)
  756. }
  757. v = z.b[z.c]
  758. z.c++
  759. // z.a--
  760. return
  761. // return
  762. }
  763. func (z *bytesDecReader) readn3() (bs [3]byte) {
  764. if z.c+2 >= uint(len(z.b)) {
  765. panic(io.EOF)
  766. }
  767. // copy(bs[:], z.b[z.c:z.c+3])
  768. bs[2] = z.b[z.c+2]
  769. bs[1] = z.b[z.c+1]
  770. bs[0] = z.b[z.c]
  771. z.c += 3
  772. return
  773. }
  774. func (z *bytesDecReader) readn4() (bs [4]byte) {
  775. if z.c+3 >= uint(len(z.b)) {
  776. panic(io.EOF)
  777. }
  778. // copy(bs[:], z.b[z.c:z.c+4])
  779. bs[3] = z.b[z.c+3]
  780. bs[2] = z.b[z.c+2]
  781. bs[1] = z.b[z.c+1]
  782. bs[0] = z.b[z.c]
  783. z.c += 4
  784. return
  785. }
  786. // func (z *bytesDecReader) readn1eof() (v uint8, eof bool) {
  787. // if z.a == 0 {
  788. // eof = true
  789. // return
  790. // }
  791. // v = z.b[z.c]
  792. // z.c++
  793. // z.a--
  794. // return
  795. // }
  796. func (z *bytesDecReader) skip(accept *bitset256) (token byte) {
  797. i := z.c
  798. // if i == len(z.b) {
  799. // goto END
  800. // // panic(io.EOF)
  801. // }
  802. // Replace loop with goto construct, so that this can be inlined
  803. // for i := z.c; i < blen; i++ {
  804. // if !accept.isset(z.b[i]) {
  805. // token = z.b[i]
  806. // i++
  807. // z.a -= (i - z.c)
  808. // z.c = i
  809. // return
  810. // }
  811. // }
  812. // i := z.c
  813. LOOP:
  814. if i < uint(len(z.b)) {
  815. token = z.b[i]
  816. i++
  817. if accept.isset(token) {
  818. goto LOOP
  819. }
  820. // z.a -= (i - z.c)
  821. z.c = i
  822. return
  823. }
  824. // END:
  825. panic(io.EOF)
  826. // // z.a = 0
  827. // z.c = blen
  828. // return
  829. }
  830. func (z *bytesDecReader) readTo(accept *bitset256) (out []byte) {
  831. i := z.c
  832. if i == uint(len(z.b)) {
  833. panic(io.EOF)
  834. }
  835. // Replace loop with goto construct, so that this can be inlined
  836. // for i := z.c; i < blen; i++ {
  837. // if !accept.isset(z.b[i]) {
  838. // out = z.b[z.c:i]
  839. // z.a -= (i - z.c)
  840. // z.c = i
  841. // return
  842. // }
  843. // }
  844. // out = z.b[z.c:]
  845. // z.a, z.c = 0, blen
  846. // return
  847. // i := z.c
  848. // LOOP:
  849. // if i < blen {
  850. // if accept.isset(z.b[i]) {
  851. // i++
  852. // goto LOOP
  853. // }
  854. // out = z.b[z.c:i]
  855. // z.a -= (i - z.c)
  856. // z.c = i
  857. // return
  858. // }
  859. // out = z.b[z.c:]
  860. // // z.a, z.c = 0, blen
  861. // z.a = 0
  862. // z.c = blen
  863. // return
  864. // c := i
  865. LOOP:
  866. if i < uint(len(z.b)) {
  867. if accept.isset(z.b[i]) {
  868. i++
  869. goto LOOP
  870. }
  871. }
  872. out = z.b[z.c:i]
  873. // z.a -= (i - z.c)
  874. z.c = i
  875. return // z.b[c:i]
  876. // z.c, i = i, z.c
  877. // return z.b[i:z.c]
  878. }
  879. func (z *bytesDecReader) readUntil(stop byte) (out []byte) {
  880. i := z.c
  881. // if i == len(z.b) {
  882. // panic(io.EOF)
  883. // }
  884. // Replace loop with goto construct, so that this can be inlined
  885. // for i := z.c; i < blen; i++ {
  886. // if z.b[i] == stop {
  887. // i++
  888. // out = z.b[z.c:i]
  889. // z.a -= (i - z.c)
  890. // z.c = i
  891. // return
  892. // }
  893. // }
  894. LOOP:
  895. if i < uint(len(z.b)) {
  896. if z.b[i] == stop {
  897. i++
  898. out = z.b[z.c:i]
  899. // z.a -= (i - z.c)
  900. z.c = i
  901. return
  902. }
  903. i++
  904. goto LOOP
  905. }
  906. // z.a = 0
  907. // z.c = blen
  908. panic(io.EOF)
  909. }
  910. func (z *bytesDecReader) track() {
  911. z.t = z.c
  912. }
  913. func (z *bytesDecReader) stopTrack() (bs []byte) {
  914. return z.b[z.t:z.c]
  915. }
  916. // --------------
  917. type decRd struct {
  918. esep bool // has elem separators
  919. mtr, str bool // whether maptype or slicetype are known types
  920. be bool // is binary encoding
  921. js bool // is json handle
  922. jsms bool // is json handle, and MapKeyAsString
  923. // typ entryType
  924. bytes bool // is bytes reader
  925. bufio bool // is this a bufioDecReader?
  926. rb bytesDecReader
  927. ri *ioDecReader
  928. bi *bufioDecReader
  929. }
  930. // numread, track and stopTrack are always inlined, as they just check int fields, etc.
  931. /*
  932. func (z *decRd) numread() int {
  933. switch z.typ {
  934. case entryTypeBytes:
  935. return z.rb.numread()
  936. case entryTypeIo:
  937. return z.ri.numread()
  938. default:
  939. return z.bi.numread()
  940. }
  941. }
  942. func (z *decRd) track() {
  943. switch z.typ {
  944. case entryTypeBytes:
  945. z.rb.track()
  946. case entryTypeIo:
  947. z.ri.track()
  948. default:
  949. z.bi.track()
  950. }
  951. }
  952. func (z *decRd) stopTrack() []byte {
  953. switch z.typ {
  954. case entryTypeBytes:
  955. return z.rb.stopTrack()
  956. case entryTypeIo:
  957. return z.ri.stopTrack()
  958. default:
  959. return z.bi.stopTrack()
  960. }
  961. }
  962. func (z *decRd) unreadn1() {
  963. switch z.typ {
  964. case entryTypeBytes:
  965. z.rb.unreadn1()
  966. case entryTypeIo:
  967. z.ri.unreadn1()
  968. default:
  969. z.bi.unreadn1()
  970. }
  971. }
  972. func (z *decRd) readx(n int) []byte {
  973. switch z.typ {
  974. case entryTypeBytes:
  975. return z.rb.readx(n)
  976. case entryTypeIo:
  977. return z.ri.readx(n)
  978. default:
  979. return z.bi.readx(n)
  980. }
  981. }
  982. func (z *decRd) readb(s []byte) {
  983. switch z.typ {
  984. case entryTypeBytes:
  985. z.rb.readb(s)
  986. case entryTypeIo:
  987. z.ri.readb(s)
  988. default:
  989. z.bi.readb(s)
  990. }
  991. }
  992. func (z *decRd) readn1() uint8 {
  993. switch z.typ {
  994. case entryTypeBytes:
  995. return z.rb.readn1()
  996. case entryTypeIo:
  997. return z.ri.readn1()
  998. default:
  999. return z.bi.readn1()
  1000. }
  1001. }
  1002. func (z *decRd) skip(accept *bitset256) (token byte) {
  1003. switch z.typ {
  1004. case entryTypeBytes:
  1005. return z.rb.skip(accept)
  1006. case entryTypeIo:
  1007. return z.ri.skip(accept)
  1008. default:
  1009. return z.bi.skip(accept)
  1010. }
  1011. }
  1012. func (z *decRd) readTo(accept *bitset256) (out []byte) {
  1013. switch z.typ {
  1014. case entryTypeBytes:
  1015. return z.rb.readTo(accept)
  1016. case entryTypeIo:
  1017. return z.ri.readTo(accept)
  1018. default:
  1019. return z.bi.readTo(accept)
  1020. }
  1021. }
  1022. func (z *decRd) readUntil(stop byte) (out []byte) {
  1023. switch z.typ {
  1024. case entryTypeBytes:
  1025. return z.rb.readUntil(stop)
  1026. case entryTypeIo:
  1027. return z.ri.readUntil(stop)
  1028. default:
  1029. return z.bi.readUntil(stop)
  1030. }
  1031. }
  1032. */
  1033. // the if/else-if/else block is expensive to inline.
  1034. // Each node of this construct costs a lot and dominates the budget.
  1035. // Best to only do an if fast-path else block (so fast-path is inlined).
  1036. // This is irrespective of inlineExtraCallCost set in $GOROOT/src/cmd/compile/internal/gc/inl.go
  1037. //
  1038. // In decRd methods below, we delegate all IO functions into their own methods.
  1039. // This allows for the inlining of the common path when z.bytes=true.
  1040. // Go 1.12+ supports inlining methods with up to 1 inlined function (or 2 if no other constructs).
  1041. // func (z *decRd) release() {
  1042. // if z.bytes {
  1043. // } else if z.bufio {
  1044. // z.bi.release()
  1045. // } else {
  1046. // z.ri.release()
  1047. // }
  1048. // }
  1049. func (z *decRd) numread() uint {
  1050. if z.bytes {
  1051. return z.rb.numread()
  1052. } else if z.bufio {
  1053. return z.bi.numread()
  1054. } else {
  1055. return z.ri.numread()
  1056. }
  1057. }
  1058. func (z *decRd) track() {
  1059. if z.bytes {
  1060. z.rb.track()
  1061. } else if z.bufio {
  1062. z.bi.track()
  1063. } else {
  1064. z.ri.track()
  1065. }
  1066. }
  1067. func (z *decRd) stopTrack() []byte {
  1068. if z.bytes {
  1069. return z.rb.stopTrack()
  1070. } else if z.bufio {
  1071. return z.bi.stopTrack()
  1072. } else {
  1073. return z.ri.stopTrack()
  1074. }
  1075. }
  1076. // func (z *decRd) unreadn1() {
  1077. // if z.bytes {
  1078. // z.rb.unreadn1()
  1079. // } else {
  1080. // z.unreadn1IO()
  1081. // }
  1082. // }
  1083. // func (z *decRd) unreadn1IO() {
  1084. // if z.bufio {
  1085. // z.bi.unreadn1()
  1086. // } else {
  1087. // z.ri.unreadn1()
  1088. // }
  1089. // }
  1090. func (z *decRd) unreadn1() {
  1091. if z.bytes {
  1092. z.rb.unreadn1()
  1093. } else if z.bufio {
  1094. z.bi.unreadn1()
  1095. } else {
  1096. z.ri.unreadn1() // not inlined
  1097. }
  1098. }
  1099. func (z *decRd) readn3() [3]byte {
  1100. if z.bytes {
  1101. return z.rb.readn3()
  1102. }
  1103. return z.readn3IO()
  1104. }
  1105. func (z *decRd) readn3IO() [3]byte {
  1106. if z.bufio {
  1107. return z.bi.readn3()
  1108. }
  1109. return z.ri.readn3()
  1110. }
  1111. func (z *decRd) readn4() [4]byte {
  1112. if z.bytes {
  1113. return z.rb.readn4()
  1114. }
  1115. return z.readn4IO()
  1116. }
  1117. func (z *decRd) readn4IO() [4]byte {
  1118. if z.bufio {
  1119. return z.bi.readn4()
  1120. }
  1121. return z.ri.readn4()
  1122. }
  1123. func (z *decRd) readx(n uint) []byte {
  1124. if z.bytes {
  1125. return z.rb.readx(n)
  1126. }
  1127. return z.readxIO(n)
  1128. }
  1129. func (z *decRd) readxIO(n uint) []byte {
  1130. if z.bufio {
  1131. return z.bi.readx(n)
  1132. }
  1133. return z.ri.readx(n)
  1134. }
  1135. func (z *decRd) readb(s []byte) {
  1136. if z.bytes {
  1137. z.rb.readb(s)
  1138. } else {
  1139. z.readbIO(s)
  1140. }
  1141. }
  1142. func (z *decRd) readbIO(s []byte) {
  1143. if z.bufio {
  1144. z.bi.readb(s)
  1145. } else {
  1146. z.ri.readb(s)
  1147. }
  1148. }
  1149. func (z *decRd) readn1() uint8 {
  1150. if z.bytes {
  1151. return z.rb.readn1()
  1152. }
  1153. return z.readn1IO()
  1154. }
  1155. func (z *decRd) readn1IO() uint8 {
  1156. if z.bufio {
  1157. return z.bi.readn1()
  1158. }
  1159. return z.ri.readn1()
  1160. }
  1161. func (z *decRd) skip(accept *bitset256) (token byte) {
  1162. if z.bytes {
  1163. return z.rb.skip(accept)
  1164. }
  1165. return z.skipIO(accept)
  1166. }
  1167. func (z *decRd) skipIO(accept *bitset256) (token byte) {
  1168. if z.bufio {
  1169. return z.bi.skip(accept)
  1170. }
  1171. return z.ri.skip(accept)
  1172. }
  1173. func (z *decRd) readTo(accept *bitset256) (out []byte) {
  1174. if z.bytes {
  1175. return z.rb.readTo(accept)
  1176. }
  1177. return z.readToIO(accept)
  1178. }
  1179. func (z *decRd) readToIO(accept *bitset256) (out []byte) {
  1180. if z.bufio {
  1181. return z.bi.readTo(accept)
  1182. }
  1183. return z.ri.readTo(accept)
  1184. }
  1185. func (z *decRd) readUntil(stop byte) (out []byte) {
  1186. if z.bytes {
  1187. return z.rb.readUntil(stop)
  1188. }
  1189. return z.readUntilIO(stop)
  1190. }
  1191. func (z *decRd) readUntilIO(stop byte) (out []byte) {
  1192. if z.bufio {
  1193. return z.bi.readUntil(stop)
  1194. }
  1195. return z.ri.readUntil(stop)
  1196. }
  1197. // // register these here, so that staticcheck stops barfing
  1198. // var _ = (*bytesDecReader).readTo
  1199. // var _ = (*bytesDecReader).readUntil