reader.go 25 KB

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