@port-labs/jq-node-bindings 0.0.13 → 0.0.15-dev1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +6 -1
  2. package/binding.gyp +41 -19
  3. package/configure +1 -1
  4. package/deps/jq/.gitattributes +12 -0
  5. package/deps/jq/AUTHORS +149 -43
  6. package/deps/jq/COPYING +75 -1
  7. package/deps/jq/ChangeLog +2 -2
  8. package/deps/jq/Makefile.am +106 -65
  9. package/deps/jq/NEWS.md +391 -0
  10. package/deps/jq/README.md +54 -52
  11. package/deps/jq/SECURITY.md +7 -0
  12. package/deps/jq/compile-ios.sh +106 -102
  13. package/deps/jq/configure.ac +72 -59
  14. package/deps/jq/docs/Pipfile +14 -0
  15. package/deps/jq/docs/Pipfile.lock +415 -0
  16. package/deps/jq/docs/README.md +15 -14
  17. package/deps/jq/docs/build_manpage.py +251 -0
  18. package/deps/jq/docs/build_mantests.py +21 -0
  19. package/deps/jq/docs/build_website.py +95 -0
  20. package/deps/jq/docs/content/download/default.yml +249 -0
  21. package/deps/jq/docs/content/index.yml +83 -0
  22. package/deps/jq/docs/content/{3.manual/v1.6 → manual/dev}/manual.yml +992 -452
  23. package/deps/jq/docs/content/{3.manual → manual}/v1.3/manual.yml +105 -116
  24. package/deps/jq/docs/content/{3.manual → manual}/v1.4/manual.yml +122 -129
  25. package/deps/jq/docs/content/{3.manual → manual}/v1.5/manual.yml +313 -262
  26. package/deps/jq/docs/content/{3.manual → manual/v1.6}/manual.yml +407 -332
  27. package/deps/jq/docs/content/manual/v1.7/manual.yml +3697 -0
  28. package/deps/jq/docs/content/tutorial/default.yml +337 -0
  29. package/deps/jq/docs/manual_schema.yml +60 -0
  30. package/deps/jq/docs/public/css/style.css +99 -0
  31. package/deps/jq/docs/public/icon.png +0 -0
  32. package/deps/jq/docs/public/icon.svg +1 -0
  33. package/deps/jq/docs/public/jq.svg +1 -0
  34. package/deps/jq/docs/public/js/manual-search.js +31 -49
  35. package/deps/jq/docs/templates/default.html.j2 +31 -0
  36. package/deps/jq/docs/templates/index.html.j2 +58 -0
  37. package/deps/jq/docs/templates/manual.html.j2 +120 -0
  38. package/deps/jq/docs/templates/shared/_footer.html.j2 +14 -0
  39. package/deps/jq/docs/templates/shared/_head.html.j2 +23 -0
  40. package/deps/jq/docs/templates/shared/_navbar.html.j2 +40 -0
  41. package/deps/jq/docs/validate_manual_schema.py +19 -0
  42. package/deps/jq/jq.1.prebuilt +1102 -294
  43. package/deps/jq/jq.spec +2 -3
  44. package/deps/jq/libjq.pc.in +11 -0
  45. package/deps/jq/m4/ax_pthread.m4 +522 -0
  46. package/deps/jq/modules/oniguruma/.travis.yml +17 -0
  47. package/deps/jq/modules/oniguruma/CMakeLists.txt +206 -41
  48. package/deps/jq/modules/oniguruma/COPYING +23 -25
  49. package/deps/jq/modules/oniguruma/HISTORY +368 -23
  50. package/deps/jq/modules/oniguruma/Makefile.am +61 -7
  51. package/deps/jq/modules/oniguruma/README +34 -20
  52. package/deps/jq/modules/oniguruma/README.md +106 -33
  53. package/deps/jq/modules/oniguruma/README_japanese +183 -0
  54. package/deps/jq/modules/oniguruma/autogen.sh +9 -0
  55. package/deps/jq/modules/oniguruma/cmake/Config.cmake.in +4 -0
  56. package/deps/jq/modules/oniguruma/configure.ac +66 -55
  57. package/deps/jq/modules/oniguruma/doc/API +485 -42
  58. package/deps/jq/modules/oniguruma/doc/API.ja +732 -293
  59. package/deps/jq/modules/oniguruma/doc/CALLOUTS.API +397 -0
  60. package/deps/jq/modules/oniguruma/doc/CALLOUTS.API.ja +393 -0
  61. package/deps/jq/modules/oniguruma/doc/CALLOUTS.BUILTIN +95 -0
  62. package/deps/jq/modules/oniguruma/doc/CALLOUTS.BUILTIN.ja +93 -0
  63. package/deps/jq/modules/oniguruma/doc/FAQ +3 -3
  64. package/deps/jq/modules/oniguruma/doc/FAQ.ja +8 -8
  65. package/deps/jq/modules/oniguruma/doc/RE +223 -63
  66. package/deps/jq/modules/oniguruma/doc/RE.ja +420 -265
  67. package/deps/jq/modules/oniguruma/doc/SYNTAX.md +1091 -0
  68. package/deps/jq/modules/oniguruma/doc/UNICODE_PROPERTIES +840 -697
  69. package/deps/jq/modules/oniguruma/harnesses/ascii_compatible.dict +113 -0
  70. package/deps/jq/modules/oniguruma/harnesses/base.c +749 -0
  71. package/deps/jq/modules/oniguruma/harnesses/deluxe.c +206 -0
  72. package/deps/jq/modules/oniguruma/harnesses/dict_conv.py +72 -0
  73. package/deps/jq/modules/oniguruma/harnesses/fuzzer.options +2 -0
  74. package/deps/jq/modules/oniguruma/harnesses/libfuzzer-onig.cpp +45 -0
  75. package/deps/jq/modules/oniguruma/harnesses/regset.c +392 -0
  76. package/deps/jq/modules/oniguruma/index.html +16 -5
  77. package/deps/jq/modules/oniguruma/index_ja.html +16 -5
  78. package/deps/jq/modules/oniguruma/make_win.bat +5 -0
  79. package/deps/jq/modules/oniguruma/make_win32.bat +5 -3
  80. package/deps/jq/modules/oniguruma/make_win64.bat +5 -3
  81. package/deps/jq/modules/oniguruma/onig-config.cmake.in +80 -0
  82. package/deps/jq/modules/oniguruma/onig-config.in +1 -1
  83. package/deps/jq/modules/oniguruma/oniguruma.pc.cmake.in +1 -1
  84. package/deps/jq/modules/oniguruma/oniguruma.pc.in +0 -1
  85. package/deps/jq/modules/oniguruma/sample/CMakeLists.txt +9 -2
  86. package/deps/jq/modules/oniguruma/sample/Makefile.am +24 -5
  87. package/deps/jq/modules/oniguruma/sample/bug_fix.c +13 -51
  88. package/deps/jq/modules/oniguruma/sample/callback_each_match.c +168 -0
  89. package/deps/jq/modules/oniguruma/sample/callout.c +268 -0
  90. package/deps/jq/modules/oniguruma/sample/count.c +125 -0
  91. package/deps/jq/modules/oniguruma/sample/crnl.c +6 -4
  92. package/deps/jq/modules/oniguruma/sample/echo.c +136 -0
  93. package/deps/jq/modules/oniguruma/sample/encode.c +53 -146
  94. package/deps/jq/modules/oniguruma/sample/listcap.c +18 -10
  95. package/deps/jq/modules/oniguruma/sample/names.c +10 -6
  96. package/deps/jq/modules/oniguruma/sample/posix.c +13 -2
  97. package/deps/jq/modules/oniguruma/sample/regset.c +95 -0
  98. package/deps/jq/modules/oniguruma/sample/scan.c +20 -6
  99. package/deps/jq/modules/oniguruma/sample/simple.c +8 -4
  100. package/deps/jq/modules/oniguruma/sample/sql.c +13 -8
  101. package/deps/jq/modules/oniguruma/sample/syntax.c +11 -10
  102. package/deps/jq/modules/oniguruma/sample/user_property.c +12 -7
  103. package/deps/jq/modules/oniguruma/src/Makefile.am +41 -15
  104. package/deps/jq/modules/oniguruma/src/Makefile.windows +196 -183
  105. package/deps/jq/modules/oniguruma/src/ascii.c +64 -7
  106. package/deps/jq/modules/oniguruma/src/big5.c +25 -15
  107. package/deps/jq/modules/oniguruma/src/config.h.cmake.in +7 -22
  108. package/deps/jq/modules/oniguruma/src/config.h.win32 +56 -84
  109. package/deps/jq/modules/oniguruma/src/config.h.win64 +56 -84
  110. package/deps/jq/modules/oniguruma/src/config.h.windows.in +62 -0
  111. package/deps/jq/modules/oniguruma/src/cp1251.c +14 -8
  112. package/deps/jq/modules/oniguruma/src/euc_jp.c +28 -30
  113. package/deps/jq/modules/oniguruma/src/euc_jp_prop.c +25 -32
  114. package/deps/jq/modules/oniguruma/src/euc_jp_prop.gperf +1 -2
  115. package/deps/jq/modules/oniguruma/src/euc_kr.c +27 -15
  116. package/deps/jq/modules/oniguruma/src/euc_tw.c +40 -17
  117. package/deps/jq/modules/oniguruma/src/gb18030.c +177 -119
  118. package/deps/jq/modules/oniguruma/src/gperf_fold_key_conv.py +12 -8
  119. package/deps/jq/modules/oniguruma/src/gperf_unfold_key_conv.py +8 -6
  120. package/deps/jq/modules/oniguruma/src/iso8859_1.c +92 -91
  121. package/deps/jq/modules/oniguruma/src/iso8859_10.c +13 -29
  122. package/deps/jq/modules/oniguruma/src/iso8859_11.c +4 -2
  123. package/deps/jq/modules/oniguruma/src/iso8859_13.c +13 -33
  124. package/deps/jq/modules/oniguruma/src/iso8859_14.c +13 -30
  125. package/deps/jq/modules/oniguruma/src/iso8859_15.c +13 -34
  126. package/deps/jq/modules/oniguruma/src/iso8859_16.c +13 -29
  127. package/deps/jq/modules/oniguruma/src/iso8859_2.c +13 -29
  128. package/deps/jq/modules/oniguruma/src/iso8859_3.c +13 -33
  129. package/deps/jq/modules/oniguruma/src/iso8859_4.c +13 -32
  130. package/deps/jq/modules/oniguruma/src/iso8859_5.c +16 -23
  131. package/deps/jq/modules/oniguruma/src/iso8859_6.c +4 -2
  132. package/deps/jq/modules/oniguruma/src/iso8859_7.c +14 -29
  133. package/deps/jq/modules/oniguruma/src/iso8859_8.c +4 -2
  134. package/deps/jq/modules/oniguruma/src/iso8859_9.c +13 -33
  135. package/deps/jq/modules/oniguruma/src/koi8.c +14 -27
  136. package/deps/jq/modules/oniguruma/src/koi8_r.c +12 -19
  137. package/deps/jq/modules/oniguruma/src/make_property.sh +21 -0
  138. package/deps/jq/modules/oniguruma/src/make_unicode_egcb.sh +7 -0
  139. package/deps/jq/modules/oniguruma/src/make_unicode_egcb_data.py +267 -0
  140. package/deps/jq/modules/oniguruma/src/make_unicode_fold.sh +25 -11
  141. package/deps/jq/modules/oniguruma/src/make_unicode_fold_data.py +206 -26
  142. package/deps/jq/modules/oniguruma/src/make_unicode_property.sh +19 -10
  143. package/deps/jq/modules/oniguruma/src/make_unicode_property_data.py +474 -375
  144. package/deps/jq/modules/oniguruma/src/make_unicode_wb.sh +7 -0
  145. package/deps/jq/modules/oniguruma/src/make_unicode_wb_data.py +267 -0
  146. package/deps/jq/modules/oniguruma/src/mktable.c +28 -24
  147. package/deps/jq/modules/oniguruma/src/onig_init.c +2 -2
  148. package/deps/jq/modules/oniguruma/src/oniggnu.h +7 -5
  149. package/deps/jq/modules/oniguruma/src/onigposix.h +40 -16
  150. package/deps/jq/modules/oniguruma/src/oniguruma.h +357 -107
  151. package/deps/jq/modules/oniguruma/src/regcomp.c +6214 -3933
  152. package/deps/jq/modules/oniguruma/src/regenc.c +197 -120
  153. package/deps/jq/modules/oniguruma/src/regenc.h +106 -63
  154. package/deps/jq/modules/oniguruma/src/regerror.c +112 -91
  155. package/deps/jq/modules/oniguruma/src/regexec.c +4876 -2010
  156. package/deps/jq/modules/oniguruma/src/regext.c +8 -8
  157. package/deps/jq/modules/oniguruma/src/reggnu.c +13 -17
  158. package/deps/jq/modules/oniguruma/src/regint.h +757 -491
  159. package/deps/jq/modules/oniguruma/src/regparse.c +7204 -3240
  160. package/deps/jq/modules/oniguruma/src/regparse.h +361 -218
  161. package/deps/jq/modules/oniguruma/src/regposerr.c +49 -9
  162. package/deps/jq/modules/oniguruma/src/regposix.c +106 -24
  163. package/deps/jq/modules/oniguruma/src/regsyntax.c +66 -13
  164. package/deps/jq/modules/oniguruma/src/regtrav.c +1 -1
  165. package/deps/jq/modules/oniguruma/src/regversion.c +6 -4
  166. package/deps/jq/modules/oniguruma/src/sjis.c +23 -52
  167. package/deps/jq/modules/oniguruma/src/sjis_prop.c +25 -32
  168. package/deps/jq/modules/oniguruma/src/sjis_prop.gperf +1 -2
  169. package/deps/jq/modules/oniguruma/src/st.c +248 -249
  170. package/deps/jq/modules/oniguruma/src/st.h +4 -5
  171. package/deps/jq/modules/oniguruma/src/unicode.c +869 -294
  172. package/deps/jq/modules/oniguruma/src/unicode_egcb_data.c +1419 -0
  173. package/deps/jq/modules/oniguruma/src/unicode_fold1_key.c +1829 -1300
  174. package/deps/jq/modules/oniguruma/src/unicode_fold2_key.c +32 -9
  175. package/deps/jq/modules/oniguruma/src/unicode_fold3_key.c +32 -9
  176. package/deps/jq/modules/oniguruma/src/unicode_fold_data.c +1210 -984
  177. package/deps/jq/modules/oniguruma/src/unicode_property_data.c +22480 -15198
  178. package/deps/jq/modules/oniguruma/src/unicode_property_data_posix.c +1463 -591
  179. package/deps/jq/modules/oniguruma/src/unicode_unfold_key.c +1958 -1418
  180. package/deps/jq/modules/oniguruma/src/unicode_wb_data.c +1106 -0
  181. package/deps/jq/modules/oniguruma/src/utf16_be.c +90 -49
  182. package/deps/jq/modules/oniguruma/src/utf16_le.c +80 -49
  183. package/deps/jq/modules/oniguruma/src/utf32_be.c +14 -42
  184. package/deps/jq/modules/oniguruma/src/utf32_le.c +13 -40
  185. package/deps/jq/modules/oniguruma/src/utf8.c +33 -78
  186. package/deps/jq/modules/oniguruma/test/CMakeLists.txt +55 -0
  187. package/deps/jq/modules/oniguruma/test/Makefile.am +65 -10
  188. package/deps/jq/modules/oniguruma/test/test.sh +17 -0
  189. package/deps/jq/modules/oniguruma/test/test_back.c +1450 -0
  190. package/deps/jq/modules/oniguruma/test/test_options.c +228 -0
  191. package/deps/jq/modules/oniguruma/test/test_regset.c +466 -0
  192. package/deps/jq/modules/oniguruma/test/test_syntax.c +365 -0
  193. package/deps/jq/modules/oniguruma/test/test_utf8.c +1761 -0
  194. package/deps/jq/modules/oniguruma/test/testc.c +128 -88
  195. package/deps/jq/modules/oniguruma/test/testp.c +613 -0
  196. package/deps/jq/modules/oniguruma/test/testu.c +75 -28
  197. package/deps/jq/modules/oniguruma/tis-ci/stub.c +3 -0
  198. package/deps/jq/modules/oniguruma/tis-ci/test_back.config +26 -0
  199. package/deps/jq/modules/oniguruma/tis-ci/test_regset.config +20 -0
  200. package/deps/jq/modules/oniguruma/tis-ci/test_syntax.config +26 -0
  201. package/deps/jq/modules/oniguruma/tis-ci/test_utf8.config +25 -0
  202. package/deps/jq/modules/oniguruma/tis-ci/testc.config +26 -0
  203. package/deps/jq/modules/oniguruma/tis-ci/testu.config +24 -0
  204. package/deps/jq/modules/oniguruma/tis.config +1336 -0
  205. package/deps/jq/modules/oniguruma/windows/CMakeLists.txt +8 -0
  206. package/deps/jq/modules/oniguruma/windows/testc.c +865 -869
  207. package/deps/jq/scripts/update-website +6 -5
  208. package/deps/jq/scripts/version +10 -7
  209. package/deps/jq/sig/jq-release-new.key +29 -0
  210. package/deps/jq/sig/v1.4/sha256sum.txt +1 -0
  211. package/deps/jq/sig/v1.5/sha256sum.txt +2 -0
  212. package/deps/jq/sig/v1.5rc1/sha256sum.txt +1 -0
  213. package/deps/jq/sig/v1.5rc2/sha256sum.txt +2 -0
  214. package/deps/jq/sig/v1.6/sha256sum.txt +2 -0
  215. package/deps/jq/sig/v1.7/jq-1.7.tar.gz.asc +16 -0
  216. package/deps/jq/sig/v1.7/jq-1.7.zip.asc +16 -0
  217. package/deps/jq/sig/v1.7/jq-linux-amd64.asc +16 -0
  218. package/deps/jq/sig/v1.7/jq-linux-arm64.asc +16 -0
  219. package/deps/jq/sig/v1.7/jq-linux-armel.asc +16 -0
  220. package/deps/jq/sig/v1.7/jq-linux-armhf.asc +16 -0
  221. package/deps/jq/sig/v1.7/jq-linux-i386.asc +16 -0
  222. package/deps/jq/sig/v1.7/jq-linux-mips.asc +16 -0
  223. package/deps/jq/sig/v1.7/jq-linux-mips64.asc +16 -0
  224. package/deps/jq/sig/v1.7/jq-linux-mips64el.asc +16 -0
  225. package/deps/jq/sig/v1.7/jq-linux-mips64r6.asc +16 -0
  226. package/deps/jq/sig/v1.7/jq-linux-mips64r6el.asc +16 -0
  227. package/deps/jq/sig/v1.7/jq-linux-mipsel.asc +16 -0
  228. package/deps/jq/sig/v1.7/jq-linux-mipsr6.asc +16 -0
  229. package/deps/jq/sig/v1.7/jq-linux-mipsr6el.asc +16 -0
  230. package/deps/jq/sig/v1.7/jq-linux-powerpc.asc +16 -0
  231. package/deps/jq/sig/v1.7/jq-linux-ppc64el.asc +16 -0
  232. package/deps/jq/sig/v1.7/jq-linux-riscv64.asc +16 -0
  233. package/deps/jq/sig/v1.7/jq-linux-s390x.asc +16 -0
  234. package/deps/jq/sig/v1.7/jq-macos-amd64.asc +16 -0
  235. package/deps/jq/sig/v1.7/jq-macos-arm64.asc +16 -0
  236. package/deps/jq/sig/v1.7/jq-windows-amd64.exe.asc +16 -0
  237. package/deps/jq/sig/v1.7/jq-windows-i386.exe.asc +16 -0
  238. package/deps/jq/sig/v1.7/sha256sum.txt +23 -0
  239. package/deps/jq/sig/v1.7.1/jq-1.7.1.tar.gz.asc +16 -0
  240. package/deps/jq/sig/v1.7.1/jq-1.7.1.zip.asc +16 -0
  241. package/deps/jq/sig/v1.7.1/jq-linux-amd64.asc +16 -0
  242. package/deps/jq/sig/v1.7.1/jq-linux-arm64.asc +16 -0
  243. package/deps/jq/sig/v1.7.1/jq-linux-armel.asc +16 -0
  244. package/deps/jq/sig/v1.7.1/jq-linux-armhf.asc +16 -0
  245. package/deps/jq/sig/v1.7.1/jq-linux-i386.asc +16 -0
  246. package/deps/jq/sig/v1.7.1/jq-linux-mips.asc +16 -0
  247. package/deps/jq/sig/v1.7.1/jq-linux-mips64.asc +16 -0
  248. package/deps/jq/sig/v1.7.1/jq-linux-mips64el.asc +16 -0
  249. package/deps/jq/sig/v1.7.1/jq-linux-mips64r6.asc +16 -0
  250. package/deps/jq/sig/v1.7.1/jq-linux-mips64r6el.asc +16 -0
  251. package/deps/jq/sig/v1.7.1/jq-linux-mipsel.asc +16 -0
  252. package/deps/jq/sig/v1.7.1/jq-linux-mipsr6.asc +16 -0
  253. package/deps/jq/sig/v1.7.1/jq-linux-mipsr6el.asc +16 -0
  254. package/deps/jq/sig/v1.7.1/jq-linux-powerpc.asc +16 -0
  255. package/deps/jq/sig/v1.7.1/jq-linux-ppc64el.asc +16 -0
  256. package/deps/jq/sig/v1.7.1/jq-linux-riscv64.asc +16 -0
  257. package/deps/jq/sig/v1.7.1/jq-linux-s390x.asc +16 -0
  258. package/deps/jq/sig/v1.7.1/jq-linux64.asc +16 -0
  259. package/deps/jq/sig/v1.7.1/jq-macos-amd64.asc +16 -0
  260. package/deps/jq/sig/v1.7.1/jq-macos-arm64.asc +16 -0
  261. package/deps/jq/sig/v1.7.1/jq-osx-amd64.asc +16 -0
  262. package/deps/jq/sig/v1.7.1/jq-win64.exe.asc +16 -0
  263. package/deps/jq/sig/v1.7.1/jq-windows-amd64.exe.asc +16 -0
  264. package/deps/jq/sig/v1.7.1/jq-windows-i386.exe.asc +16 -0
  265. package/deps/jq/sig/v1.7.1/sha256sum.txt +26 -0
  266. package/deps/jq/sig/v1.7rc1/jq-1.7rc1.tar.gz.asc +16 -0
  267. package/deps/jq/sig/v1.7rc1/jq-1.7rc1.zip.asc +16 -0
  268. package/deps/jq/sig/v1.7rc1/jq-linux-amd64.asc +16 -0
  269. package/deps/jq/sig/v1.7rc1/jq-linux-arm64.asc +16 -0
  270. package/deps/jq/sig/v1.7rc1/jq-linux-armel.asc +16 -0
  271. package/deps/jq/sig/v1.7rc1/jq-linux-armhf.asc +16 -0
  272. package/deps/jq/sig/v1.7rc1/jq-linux-i386.asc +16 -0
  273. package/deps/jq/sig/v1.7rc1/jq-linux-mips.asc +16 -0
  274. package/deps/jq/sig/v1.7rc1/jq-linux-mips64.asc +16 -0
  275. package/deps/jq/sig/v1.7rc1/jq-linux-mips64el.asc +16 -0
  276. package/deps/jq/sig/v1.7rc1/jq-linux-mips64r6.asc +16 -0
  277. package/deps/jq/sig/v1.7rc1/jq-linux-mips64r6el.asc +16 -0
  278. package/deps/jq/sig/v1.7rc1/jq-linux-mipsel.asc +16 -0
  279. package/deps/jq/sig/v1.7rc1/jq-linux-mipsr6.asc +16 -0
  280. package/deps/jq/sig/v1.7rc1/jq-linux-mipsr6el.asc +16 -0
  281. package/deps/jq/sig/v1.7rc1/jq-linux-powerpc.asc +16 -0
  282. package/deps/jq/sig/v1.7rc1/jq-linux-ppc64el.asc +16 -0
  283. package/deps/jq/sig/v1.7rc1/jq-linux-riscv64.asc +16 -0
  284. package/deps/jq/sig/v1.7rc1/jq-linux-s390x.asc +16 -0
  285. package/deps/jq/sig/v1.7rc1/jq-macos-amd64.asc +16 -0
  286. package/deps/jq/sig/v1.7rc1/jq-macos-arm64.asc +16 -0
  287. package/deps/jq/sig/v1.7rc1/jq-windows-amd64.exe.asc +16 -0
  288. package/deps/jq/sig/v1.7rc1/jq-windows-i386.exe.asc +16 -0
  289. package/deps/jq/sig/v1.7rc1/sha256sum.txt +23 -0
  290. package/deps/jq/sig/v1.7rc2/jq-1.7rc2.tar.gz.asc +16 -0
  291. package/deps/jq/sig/v1.7rc2/jq-1.7rc2.zip.asc +16 -0
  292. package/deps/jq/sig/v1.7rc2/jq-linux-amd64.asc +16 -0
  293. package/deps/jq/sig/v1.7rc2/jq-linux-arm64.asc +16 -0
  294. package/deps/jq/sig/v1.7rc2/jq-linux-armel.asc +16 -0
  295. package/deps/jq/sig/v1.7rc2/jq-linux-armhf.asc +16 -0
  296. package/deps/jq/sig/v1.7rc2/jq-linux-i386.asc +16 -0
  297. package/deps/jq/sig/v1.7rc2/jq-linux-mips.asc +16 -0
  298. package/deps/jq/sig/v1.7rc2/jq-linux-mips64.asc +16 -0
  299. package/deps/jq/sig/v1.7rc2/jq-linux-mips64el.asc +16 -0
  300. package/deps/jq/sig/v1.7rc2/jq-linux-mips64r6.asc +16 -0
  301. package/deps/jq/sig/v1.7rc2/jq-linux-mips64r6el.asc +16 -0
  302. package/deps/jq/sig/v1.7rc2/jq-linux-mipsel.asc +16 -0
  303. package/deps/jq/sig/v1.7rc2/jq-linux-mipsr6.asc +16 -0
  304. package/deps/jq/sig/v1.7rc2/jq-linux-mipsr6el.asc +16 -0
  305. package/deps/jq/sig/v1.7rc2/jq-linux-powerpc.asc +16 -0
  306. package/deps/jq/sig/v1.7rc2/jq-linux-ppc64el.asc +16 -0
  307. package/deps/jq/sig/v1.7rc2/jq-linux-riscv64.asc +16 -0
  308. package/deps/jq/sig/v1.7rc2/jq-linux-s390x.asc +16 -0
  309. package/deps/jq/sig/v1.7rc2/jq-macos-amd64.asc +16 -0
  310. package/deps/jq/sig/v1.7rc2/jq-macos-arm64.asc +16 -0
  311. package/deps/jq/sig/v1.7rc2/jq-windows-amd64.exe.asc +16 -0
  312. package/deps/jq/sig/v1.7rc2/jq-windows-i386.exe.asc +16 -0
  313. package/deps/jq/sig/v1.7rc2/sha256sum.txt +23 -0
  314. package/deps/jq/src/builtin.c +537 -343
  315. package/deps/jq/src/builtin.h +18 -0
  316. package/deps/jq/src/builtin.jq +116 -143
  317. package/deps/jq/src/bytecode.h +8 -4
  318. package/deps/jq/src/compile.c +157 -143
  319. package/deps/jq/src/compile.h +3 -4
  320. package/deps/jq/src/decNumber/ICU-license.html +45 -0
  321. package/deps/jq/src/decNumber/decBasic.c +3908 -0
  322. package/deps/jq/src/decNumber/decCommon.c +1835 -0
  323. package/deps/jq/src/decNumber/decContext.c +437 -0
  324. package/deps/jq/src/decNumber/decContext.h +254 -0
  325. package/deps/jq/src/decNumber/decDPD.h +1185 -0
  326. package/deps/jq/src/decNumber/decDouble.c +140 -0
  327. package/deps/jq/src/decNumber/decDouble.h +155 -0
  328. package/deps/jq/src/decNumber/decNumber.c +8143 -0
  329. package/deps/jq/src/decNumber/decNumber.h +182 -0
  330. package/deps/jq/src/decNumber/decNumberLocal.h +757 -0
  331. package/deps/jq/src/decNumber/decPacked.c +220 -0
  332. package/deps/jq/src/decNumber/decPacked.h +52 -0
  333. package/deps/jq/src/decNumber/decQuad.c +135 -0
  334. package/deps/jq/src/decNumber/decQuad.h +177 -0
  335. package/deps/jq/src/decNumber/decSingle.c +71 -0
  336. package/deps/jq/src/decNumber/decSingle.h +86 -0
  337. package/deps/jq/src/decNumber/decimal128.c +553 -0
  338. package/deps/jq/src/decNumber/decimal128.h +81 -0
  339. package/deps/jq/src/decNumber/decimal32.c +476 -0
  340. package/deps/jq/src/decNumber/decimal32.h +81 -0
  341. package/deps/jq/src/decNumber/decimal64.c +839 -0
  342. package/deps/jq/src/decNumber/decimal64.h +83 -0
  343. package/deps/jq/src/decNumber/decnumber.pdf +0 -0
  344. package/deps/jq/src/decNumber/example1.c +38 -0
  345. package/deps/jq/src/decNumber/example2.c +52 -0
  346. package/deps/jq/src/decNumber/example3.c +64 -0
  347. package/deps/jq/src/decNumber/example4.c +61 -0
  348. package/deps/jq/src/decNumber/example5.c +36 -0
  349. package/deps/jq/src/decNumber/example6.c +61 -0
  350. package/deps/jq/src/decNumber/example7.c +35 -0
  351. package/deps/jq/src/decNumber/example8.c +39 -0
  352. package/deps/jq/src/decNumber/readme.txt +81 -0
  353. package/deps/jq/src/exec_stack.h +5 -3
  354. package/deps/jq/src/execute.c +126 -44
  355. package/deps/jq/src/inject_errors.c +0 -2
  356. package/deps/jq/src/jq.h +10 -1
  357. package/deps/jq/src/jq_test.c +222 -11
  358. package/deps/jq/src/jv.c +807 -176
  359. package/deps/jq/src/jv.h +22 -1
  360. package/deps/jq/src/jv_alloc.c +33 -26
  361. package/deps/jq/src/jv_alloc.h +0 -11
  362. package/deps/jq/src/jv_aux.c +153 -67
  363. package/deps/jq/src/jv_dtoa.c +12 -2
  364. package/deps/jq/src/jv_dtoa_tsd.c +51 -0
  365. package/deps/jq/src/jv_dtoa_tsd.h +4 -0
  366. package/deps/jq/src/jv_parse.c +70 -15
  367. package/deps/jq/src/jv_print.c +56 -60
  368. package/deps/jq/src/jv_private.h +7 -0
  369. package/deps/jq/src/jv_thread.h +76 -0
  370. package/deps/jq/src/jv_unicode.c +18 -0
  371. package/deps/jq/src/jv_unicode.h +2 -0
  372. package/deps/jq/src/lexer.c +782 -543
  373. package/deps/jq/src/lexer.h +438 -64
  374. package/deps/jq/src/lexer.l +10 -3
  375. package/deps/jq/src/libm.h +16 -6
  376. package/deps/jq/src/linker.c +97 -40
  377. package/deps/jq/src/locfile.c +2 -1
  378. package/deps/jq/src/main.c +384 -336
  379. package/deps/jq/src/opcode_list.h +5 -2
  380. package/deps/jq/src/parser.c +2260 -1898
  381. package/deps/jq/src/parser.h +115 -98
  382. package/deps/jq/src/parser.y +124 -89
  383. package/deps/jq/src/util.c +854 -55
  384. package/deps/jq/src/util.h +6 -4
  385. package/deps/jq/tests/jq.test +762 -26
  386. package/deps/jq/tests/jq_fuzz_compile.c +27 -0
  387. package/deps/jq/tests/jq_fuzz_execute.cpp +42 -0
  388. package/deps/jq/tests/jq_fuzz_fixed.cpp +297 -0
  389. package/deps/jq/tests/jq_fuzz_load_file.c +28 -0
  390. package/deps/jq/tests/jq_fuzz_parse.c +21 -0
  391. package/deps/jq/tests/jq_fuzz_parse_extended.c +36 -0
  392. package/deps/jq/tests/jq_fuzz_parse_stream.c +21 -0
  393. package/deps/jq/tests/local.supp +14 -0
  394. package/deps/jq/tests/man.test +979 -0
  395. package/deps/jq/tests/manonig.test +76 -0
  396. package/deps/jq/tests/manonigtest +5 -0
  397. package/deps/jq/tests/mantest +1 -2
  398. package/deps/jq/tests/modules/home2/.jq/g.jq +1 -0
  399. package/deps/jq/tests/modules/shadow1.jq +2 -0
  400. package/deps/jq/tests/modules/shadow2.jq +1 -0
  401. package/deps/jq/tests/modules/test_bind_order0.jq +1 -0
  402. package/deps/jq/tests/modules/test_bind_order1.jq +1 -1
  403. package/deps/jq/tests/modules/test_bind_order2.jq +0 -1
  404. package/deps/jq/tests/no-main-program.jq +1 -0
  405. package/deps/jq/tests/onig.test +77 -2
  406. package/deps/jq/tests/setup +7 -2
  407. package/deps/jq/tests/shtest +478 -59
  408. package/deps/jq/tests/uri.test +38 -0
  409. package/deps/jq/tests/uritest +5 -0
  410. package/deps/jq/tests/yes-main-program.jq +2 -0
  411. package/lib/index.js +3 -0
  412. package/lib/jq.js +15 -1
  413. package/lib/templateAsync.js +137 -0
  414. package/package.json +7 -7
  415. package/src/binding.cc +623 -146
  416. package/src/binding.h +3 -4
  417. package/test/santiy-async.test.js +171 -0
  418. package/test/santiy.test.js +2 -2
  419. package/test/template-async.test.js +182 -0
  420. package/test/template.test.js +3 -3
  421. package/deps/jq/.travis.yml +0 -202
  422. package/deps/jq/NEWS +0 -89
  423. package/deps/jq/appveyor.yml +0 -53
  424. package/deps/jq/docs/Gemfile +0 -7
  425. package/deps/jq/docs/Gemfile.lock +0 -63
  426. package/deps/jq/docs/Rakefile +0 -24
  427. package/deps/jq/docs/Rakefile.manual +0 -49
  428. package/deps/jq/docs/Rakefile.website +0 -76
  429. package/deps/jq/docs/content/1.tutorial/default.yml +0 -327
  430. package/deps/jq/docs/content/2.download/default.yml +0 -193
  431. package/deps/jq/docs/content/index/index.yml +0 -73
  432. package/deps/jq/docs/public/css/base.scss +0 -181
  433. package/deps/jq/docs/public/jq.png +0 -0
  434. package/deps/jq/docs/site.yml +0 -9
  435. package/deps/jq/docs/templates/default.liquid +0 -34
  436. package/deps/jq/docs/templates/index.liquid +0 -73
  437. package/deps/jq/docs/templates/manual.liquid +0 -99
  438. package/deps/jq/docs/templates/shared/_footer.liquid +0 -10
  439. package/deps/jq/docs/templates/shared/_head.liquid +0 -17
  440. package/deps/jq/docs/templates/shared/_navbar.liquid +0 -27
  441. package/deps/jq/modules/oniguruma/README.ja +0 -195
  442. package/deps/jq/modules/oniguruma/cmake/dist.cmake +0 -321
  443. package/deps/jq/modules/oniguruma/contributed/libfuzzer-onig.cpp +0 -31
  444. package/deps/jq/modules/oniguruma/dist.info +0 -10
  445. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold1_key.c +0 -2250
  446. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold2_key.c +0 -203
  447. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold3_key.c +0 -113
  448. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold_data.c +0 -1225
  449. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_property_data.c +0 -24742
  450. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_property_data_posix.c +0 -4846
  451. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_unfold_key.c +0 -2571
  452. /package/deps/jq/sig/{jq-release.key → jq-release-old.key} +0 -0
  453. /package/deps/jq/tests/modules/{.jq → home1/.jq} +0 -0
package/deps/jq/src/jv.c CHANGED
@@ -1,3 +1,35 @@
1
+ /*
2
+ * Portions Copyright (c) 2016 Kungliga Tekniska Högskolan
3
+ * (Royal Institute of Technology, Stockholm, Sweden).
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions
8
+ * are met:
9
+ *
10
+ * 1. Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ *
13
+ * 2. Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ *
30
+ */
31
+
32
+
1
33
  #include <stdint.h>
2
34
  #include <stddef.h>
3
35
  #include <assert.h>
@@ -7,6 +39,7 @@
7
39
  #include <stdarg.h>
8
40
  #include <limits.h>
9
41
  #include <math.h>
42
+ #include <float.h>
10
43
 
11
44
  #include "jv_alloc.h"
12
45
  #include "jv.h"
@@ -37,14 +70,33 @@ static int jvp_refcnt_unshared(jv_refcnt* c) {
37
70
  return c->count == 1;
38
71
  }
39
72
 
40
- /*
41
- * Simple values (true, false, null)
42
- */
73
+ #define KIND_MASK 0xF
74
+ #define PFLAGS_MASK 0xF0
75
+ #define PTYPE_MASK 0x70
76
+
77
+ typedef enum {
78
+ JVP_PAYLOAD_NONE = 0,
79
+ JVP_PAYLOAD_ALLOCATED = 0x80,
80
+ } payload_flags;
81
+
82
+ #define JVP_MAKE_PFLAGS(ptype, allocated) ((((ptype) << 4) & PTYPE_MASK) | ((allocated) ? JVP_PAYLOAD_ALLOCATED : 0))
83
+ #define JVP_MAKE_FLAGS(kind, pflags) ((kind & KIND_MASK) | (pflags & PFLAGS_MASK))
84
+
85
+ #define JVP_FLAGS(j) ((j).kind_flags)
86
+ #define JVP_KIND(j) (JVP_FLAGS(j) & KIND_MASK)
43
87
 
44
- #define KIND_MASK 0xf
88
+ #define JVP_HAS_FLAGS(j, flags) (JVP_FLAGS(j) == flags)
89
+ #define JVP_HAS_KIND(j, kind) (JVP_KIND(j) == kind)
90
+
91
+ #define JVP_IS_ALLOCATED(j) (j.kind_flags & JVP_PAYLOAD_ALLOCATED)
92
+
93
+ #define JVP_FLAGS_NULL JVP_MAKE_FLAGS(JV_KIND_NULL, JVP_PAYLOAD_NONE)
94
+ #define JVP_FLAGS_INVALID JVP_MAKE_FLAGS(JV_KIND_INVALID, JVP_PAYLOAD_NONE)
95
+ #define JVP_FLAGS_FALSE JVP_MAKE_FLAGS(JV_KIND_FALSE, JVP_PAYLOAD_NONE)
96
+ #define JVP_FLAGS_TRUE JVP_MAKE_FLAGS(JV_KIND_TRUE, JVP_PAYLOAD_NONE)
45
97
 
46
98
  jv_kind jv_get_kind(jv x) {
47
- return x.kind_flags & KIND_MASK;
99
+ return JVP_KIND(x);
48
100
  }
49
101
 
50
102
  const char* jv_kind_name(jv_kind k) {
@@ -62,10 +114,10 @@ const char* jv_kind_name(jv_kind k) {
62
114
  return "<unknown>";
63
115
  }
64
116
 
65
- static const jv JV_NULL = {JV_KIND_NULL, 0, 0, 0, {0}};
66
- static const jv JV_INVALID = {JV_KIND_INVALID, 0, 0, 0, {0}};
67
- static const jv JV_FALSE = {JV_KIND_FALSE, 0, 0, 0, {0}};
68
- static const jv JV_TRUE = {JV_KIND_TRUE, 0, 0, 0, {0}};
117
+ const jv JV_NULL = {JVP_FLAGS_NULL, 0, 0, 0, {0}};
118
+ const jv JV_INVALID = {JVP_FLAGS_INVALID, 0, 0, 0, {0}};
119
+ const jv JV_FALSE = {JVP_FLAGS_FALSE, 0, 0, 0, {0}};
120
+ const jv JV_TRUE = {JVP_FLAGS_TRUE, 0, 0, 0, {0}};
69
121
 
70
122
  jv jv_true() {
71
123
  return JV_TRUE;
@@ -87,19 +139,19 @@ jv jv_bool(int x) {
87
139
  * Invalid objects, with optional error messages
88
140
  */
89
141
 
142
+ #define JVP_FLAGS_INVALID_MSG JVP_MAKE_FLAGS(JV_KIND_INVALID, JVP_PAYLOAD_ALLOCATED)
143
+
90
144
  typedef struct {
91
145
  jv_refcnt refcnt;
92
146
  jv errmsg;
93
147
  } jvp_invalid;
94
148
 
95
149
  jv jv_invalid_with_msg(jv err) {
96
- if (jv_get_kind(err) == JV_KIND_NULL)
97
- return JV_INVALID;
98
150
  jvp_invalid* i = jv_mem_alloc(sizeof(jvp_invalid));
99
151
  i->refcnt = JV_REFCNT_INIT;
100
152
  i->errmsg = err;
101
153
 
102
- jv x = {JV_KIND_INVALID, 0, 0, 0, {&i->refcnt}};
154
+ jv x = {JVP_FLAGS_INVALID_MSG, 0, 0, 0, {&i->refcnt}};
103
155
  return x;
104
156
  }
105
157
 
@@ -108,26 +160,30 @@ jv jv_invalid() {
108
160
  }
109
161
 
110
162
  jv jv_invalid_get_msg(jv inv) {
111
- assert(jv_get_kind(inv) == JV_KIND_INVALID);
163
+ assert(JVP_HAS_KIND(inv, JV_KIND_INVALID));
164
+
112
165
  jv x;
113
- if (inv.u.ptr == 0)
114
- x = jv_null();
115
- else
166
+ if (JVP_HAS_FLAGS(inv, JVP_FLAGS_INVALID_MSG)) {
116
167
  x = jv_copy(((jvp_invalid*)inv.u.ptr)->errmsg);
168
+ }
169
+ else {
170
+ x = jv_null();
171
+ }
172
+
117
173
  jv_free(inv);
118
174
  return x;
119
175
  }
120
176
 
121
177
  int jv_invalid_has_msg(jv inv) {
122
- jv msg = jv_invalid_get_msg(inv);
123
- int r = jv_get_kind(msg) != JV_KIND_NULL;
124
- jv_free(msg);
178
+ assert(JVP_HAS_KIND(inv, JV_KIND_INVALID));
179
+ int r = JVP_HAS_FLAGS(inv, JVP_FLAGS_INVALID_MSG);
180
+ jv_free(inv);
125
181
  return r;
126
182
  }
127
183
 
128
184
  static void jvp_invalid_free(jv x) {
129
- assert(jv_get_kind(x) == JV_KIND_INVALID);
130
- if (x.u.ptr != 0 && jvp_refcnt_dec(x.u.ptr)) {
185
+ assert(JVP_HAS_KIND(x, JV_KIND_INVALID));
186
+ if (JVP_HAS_FLAGS(x, JVP_FLAGS_INVALID_MSG) && jvp_refcnt_dec(x.u.ptr)) {
131
187
  jv_free(((jvp_invalid*)x.u.ptr)->errmsg);
132
188
  jv_mem_free(x.u.ptr);
133
189
  }
@@ -137,26 +193,584 @@ static void jvp_invalid_free(jv x) {
137
193
  * Numbers
138
194
  */
139
195
 
196
+ #ifdef USE_DECNUM
197
+ #include "jv_dtoa.h"
198
+ #include "jv_dtoa_tsd.h"
199
+
200
+ // we will manage the space for the struct
201
+ #define DECNUMDIGITS 1
202
+ #include "decNumber/decNumber.h"
203
+
204
+ enum {
205
+ JVP_NUMBER_NATIVE = 0,
206
+ JVP_NUMBER_DECIMAL = 1
207
+ };
208
+
209
+ #define JV_NUMBER_SIZE_INIT (0)
210
+ #define JV_NUMBER_SIZE_CONVERTED (1)
211
+
212
+ #define JVP_FLAGS_NUMBER_NATIVE JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_NATIVE, 0))
213
+ #define JVP_FLAGS_NUMBER_LITERAL JVP_MAKE_FLAGS(JV_KIND_NUMBER, JVP_MAKE_PFLAGS(JVP_NUMBER_DECIMAL, 1))
214
+
215
+ // the decimal precision of binary double
216
+ #define DEC_NUMBER_DOUBLE_PRECISION (17)
217
+ #define DEC_NUMBER_STRING_GUARD (14)
218
+ #define DEC_NUMBER_DOUBLE_EXTRA_UNITS ((DEC_NUMBER_DOUBLE_PRECISION - DECNUMDIGITS + DECDPUN - 1)/DECDPUN)
219
+
220
+ #include "jv_thread.h"
221
+ #ifdef WIN32
222
+ #ifndef __MINGW32__
223
+ /* Copied from Heimdal: thread-specific keys; see lib/base/dll.c in Heimdal */
224
+
225
+ /*
226
+ * This is an implementation of thread-specific storage with
227
+ * destructors. WIN32 doesn't quite have this. Instead it has
228
+ * DllMain(), an entry point in every DLL that gets called to notify the
229
+ * DLL of thread/process "attach"/"detach" events.
230
+ *
231
+ * We use __thread (or __declspec(thread)) for the thread-local itself
232
+ * and DllMain() DLL_THREAD_DETACH events to drive destruction of
233
+ * thread-local values.
234
+ *
235
+ * When building in maintainer mode on non-Windows pthread systems this
236
+ * uses a single pthread key instead to implement multiple keys. This
237
+ * keeps the code from rotting when modified by non-Windows developers.
238
+ */
239
+
240
+ /* Logical array of keys that grows lock-lessly */
241
+ typedef struct tls_keys tls_keys;
242
+ struct tls_keys {
243
+ void (**keys_dtors)(void *); /* array of destructors */
244
+ size_t keys_start_idx; /* index of first destructor */
245
+ size_t keys_num;
246
+ tls_keys *keys_next;
247
+ };
248
+
249
+ /*
250
+ * Well, not quite locklessly. We need synchronization primitives to do
251
+ * this locklessly. An atomic CAS will do.
252
+ */
253
+ static pthread_mutex_t tls_key_defs_lock = PTHREAD_MUTEX_INITIALIZER;
254
+ static tls_keys *tls_key_defs;
255
+
256
+ /* Logical array of values (per-thread; no locking needed here) */
257
+ struct tls_values {
258
+ void **values; /* realloc()ed */
259
+ size_t values_num;
260
+ };
261
+
262
+ #ifdef _MSC_VER
263
+ static __declspec(thread) struct nomem_handler nomem_handler;
264
+ #else
265
+ static __thread struct tls_values values;
266
+ #endif
267
+
268
+ #define DEAD_KEY ((void *)8)
269
+
270
+ static void
271
+ w32_service_thread_detach(void *unused)
272
+ {
273
+ tls_keys *key_defs;
274
+ void (*dtor)(void*);
275
+ size_t i;
276
+
277
+ pthread_mutex_lock(&tls_key_defs_lock);
278
+ key_defs = tls_key_defs;
279
+ pthread_mutex_unlock(&tls_key_defs_lock);
280
+
281
+ if (key_defs == NULL)
282
+ return;
283
+
284
+ for (i = 0; i < values.values_num; i++) {
285
+ assert(i >= key_defs->keys_start_idx);
286
+ if (i >= key_defs->keys_start_idx + key_defs->keys_num) {
287
+ pthread_mutex_lock(&tls_key_defs_lock);
288
+ key_defs = key_defs->keys_next;
289
+ pthread_mutex_unlock(&tls_key_defs_lock);
290
+
291
+ assert(key_defs != NULL);
292
+ assert(i >= key_defs->keys_start_idx);
293
+ assert(i < key_defs->keys_start_idx + key_defs->keys_num);
294
+ }
295
+ dtor = key_defs->keys_dtors[i - key_defs->keys_start_idx];
296
+ if (values.values[i] != NULL && dtor != NULL && dtor != DEAD_KEY)
297
+ dtor(values.values[i]);
298
+ values.values[i] = NULL;
299
+ }
300
+ }
301
+
302
+ extern void jv_tsd_dtoa_ctx_init();
303
+ extern void jv_tsd_dtoa_ctx_fini();
304
+ void jv_tsd_dec_ctx_fini();
305
+ void jv_tsd_dec_ctx_init();
306
+
307
+ BOOL WINAPI DllMain(HINSTANCE hinstDLL,
308
+ DWORD fdwReason,
309
+ LPVOID lpvReserved)
310
+ {
311
+ switch (fdwReason) {
312
+ case DLL_PROCESS_ATTACH:
313
+ /*create_pt_key();*/
314
+ jv_tsd_dtoa_ctx_init();
315
+ jv_tsd_dec_ctx_init();
316
+ return TRUE;
317
+ case DLL_PROCESS_DETACH:
318
+ jv_tsd_dtoa_ctx_fini();
319
+ jv_tsd_dec_ctx_fini();
320
+ return TRUE;
321
+ case DLL_THREAD_ATTACH: return 0;
322
+ case DLL_THREAD_DETACH:
323
+ w32_service_thread_detach(NULL);
324
+ return TRUE;
325
+ default: return TRUE;
326
+ }
327
+ }
328
+
329
+ int
330
+ pthread_key_create(pthread_key_t *key, void (*dtor)(void *))
331
+ {
332
+ tls_keys *key_defs, *new_key_defs;
333
+ size_t i, k;
334
+ int ret = ENOMEM;
335
+
336
+ pthread_mutex_lock(&tls_key_defs_lock);
337
+ if (tls_key_defs == NULL) {
338
+ /* First key */
339
+ new_key_defs = calloc(1, sizeof(*new_key_defs));
340
+ if (new_key_defs == NULL) {
341
+ pthread_mutex_unlock(&tls_key_defs_lock);
342
+ return ENOMEM;
343
+ }
344
+ new_key_defs->keys_num = 8;
345
+ new_key_defs->keys_dtors = calloc(new_key_defs->keys_num,
346
+ sizeof(*new_key_defs->keys_dtors));
347
+ if (new_key_defs->keys_dtors == NULL) {
348
+ pthread_mutex_unlock(&tls_key_defs_lock);
349
+ free(new_key_defs);
350
+ return ENOMEM;
351
+ }
352
+ tls_key_defs = new_key_defs;
353
+ new_key_defs->keys_dtors[0] = dtor;
354
+ for (i = 1; i < new_key_defs->keys_num; i++)
355
+ new_key_defs->keys_dtors[i] = NULL;
356
+ pthread_mutex_unlock(&tls_key_defs_lock);
357
+ return 0;
358
+ }
359
+
360
+ for (key_defs = tls_key_defs;
361
+ key_defs != NULL;
362
+ key_defs = key_defs->keys_next) {
363
+ k = key_defs->keys_start_idx;
364
+ for (i = 0; i < key_defs->keys_num; i++, k++) {
365
+ if (key_defs->keys_dtors[i] == NULL) {
366
+ /* Found free slot; use it */
367
+ key_defs->keys_dtors[i] = dtor;
368
+ *key = k;
369
+ pthread_mutex_unlock(&tls_key_defs_lock);
370
+ return 0;
371
+ }
372
+ }
373
+ if (key_defs->keys_next != NULL)
374
+ continue;
375
+
376
+ /* Grow the registration array */
377
+ /* XXX DRY */
378
+ new_key_defs = calloc(1, sizeof(*new_key_defs));
379
+ if (new_key_defs == NULL)
380
+ break;
381
+
382
+ new_key_defs->keys_dtors =
383
+ calloc(key_defs->keys_num + key_defs->keys_num / 2,
384
+ sizeof(*new_key_defs->keys_dtors));
385
+ if (new_key_defs->keys_dtors == NULL) {
386
+ free(new_key_defs);
387
+ break;
388
+ }
389
+ new_key_defs->keys_start_idx = key_defs->keys_start_idx +
390
+ key_defs->keys_num;
391
+ new_key_defs->keys_num = key_defs->keys_num + key_defs->keys_num / 2;
392
+ new_key_defs->keys_dtors[i] = dtor;
393
+ for (i = 1; i < new_key_defs->keys_num; i++)
394
+ new_key_defs->keys_dtors[i] = NULL;
395
+ key_defs->keys_next = new_key_defs;
396
+ ret = 0;
397
+ break;
398
+ }
399
+ pthread_mutex_unlock(&tls_key_defs_lock);
400
+ return ret;
401
+ }
402
+
403
+ static void
404
+ key_lookup(pthread_key_t key, tls_keys **kd,
405
+ size_t *dtor_idx, void (**dtor)(void *))
406
+ {
407
+ tls_keys *key_defs;
408
+
409
+ if (kd != NULL)
410
+ *kd = NULL;
411
+ if (dtor_idx != NULL)
412
+ *dtor_idx = 0;
413
+ if (dtor != NULL)
414
+ *dtor = NULL;
415
+
416
+ pthread_mutex_lock(&tls_key_defs_lock);
417
+ key_defs = tls_key_defs;
418
+ pthread_mutex_unlock(&tls_key_defs_lock);
419
+
420
+ while (key_defs != NULL) {
421
+ if (key >= key_defs->keys_start_idx &&
422
+ key < key_defs->keys_start_idx + key_defs->keys_num) {
423
+ if (kd != NULL)
424
+ *kd = key_defs;
425
+ if (dtor_idx != NULL)
426
+ *dtor_idx = key - key_defs->keys_start_idx;
427
+ if (dtor != NULL)
428
+ *dtor = key_defs->keys_dtors[key - key_defs->keys_start_idx];
429
+ return;
430
+ }
431
+
432
+ pthread_mutex_lock(&tls_key_defs_lock);
433
+ key_defs = key_defs->keys_next;
434
+ pthread_mutex_unlock(&tls_key_defs_lock);
435
+ assert(key_defs != NULL);
436
+ assert(key >= key_defs->keys_start_idx);
437
+ }
438
+ }
439
+
440
+ int
441
+ pthread_setspecific(pthread_key_t key, void *value)
442
+ {
443
+ void **new_values;
444
+ size_t new_num;
445
+ void (*dtor)(void *);
446
+ size_t i;
447
+
448
+ key_lookup(key, NULL, NULL, &dtor);
449
+ if (dtor == NULL)
450
+ return EINVAL;
451
+
452
+ if (key >= values.values_num) {
453
+ if (values.values_num == 0) {
454
+ values.values = NULL;
455
+ new_num = 8;
456
+ } else {
457
+ new_num = (values.values_num + values.values_num / 2);
458
+ }
459
+ new_values = realloc(values.values, sizeof(void *) * new_num);
460
+ if (new_values == NULL)
461
+ return ENOMEM;
462
+ for (i = values.values_num; i < new_num; i++)
463
+ new_values[i] = NULL;
464
+ values.values = new_values;
465
+ values.values_num = new_num;
466
+ }
467
+
468
+ assert(key < values.values_num);
469
+
470
+ if (values.values[key] != NULL && dtor != NULL && dtor != DEAD_KEY)
471
+ dtor(values.values[key]);
472
+
473
+ values.values[key] = value;
474
+ return 0;
475
+ }
476
+
477
+ void *
478
+ pthread_getspecific(pthread_key_t key)
479
+ {
480
+ if (key >= values.values_num)
481
+ return NULL;
482
+ return values.values[key];
483
+ }
484
+ #else
485
+ #include <pthread.h>
486
+ #endif
487
+ #else
488
+ #include <pthread.h>
489
+ #endif
490
+
491
+ static pthread_key_t dec_ctx_key;
492
+ static pthread_once_t dec_ctx_once = PTHREAD_ONCE_INIT;
493
+
494
+ #define DEC_CONTEXT() tsd_dec_ctx_get(&dec_ctx_key)
495
+
496
+ // atexit finalizer to clean up the tsd dec contexts if main() exits
497
+ // without having called pthread_exit()
498
+ void jv_tsd_dec_ctx_fini() {
499
+ jv_mem_free(pthread_getspecific(dec_ctx_key));
500
+ pthread_setspecific(dec_ctx_key, NULL);
501
+ }
502
+
503
+ void jv_tsd_dec_ctx_init() {
504
+ if (pthread_key_create(&dec_ctx_key, jv_mem_free) != 0) {
505
+ fprintf(stderr, "error: cannot create thread specific key");
506
+ abort();
507
+ }
508
+ atexit(jv_tsd_dec_ctx_fini);
509
+ }
510
+
511
+ static decContext* tsd_dec_ctx_get(pthread_key_t *key) {
512
+ pthread_once(&dec_ctx_once, jv_tsd_dec_ctx_init); // cannot fail
513
+ decContext *ctx = (decContext*)pthread_getspecific(*key);
514
+ if (ctx) {
515
+ return ctx;
516
+ }
517
+
518
+ ctx = malloc(sizeof(decContext));
519
+ if (ctx) {
520
+ if (key == &dec_ctx_key)
521
+ {
522
+ decContextDefault(ctx, DEC_INIT_BASE);
523
+ // make sure (Int)D2U(rhs->exponent-lhs->exponent) does not overflow
524
+ ctx->digits = MIN(DEC_MAX_DIGITS,
525
+ INT32_MAX - (DECDPUN - 1) - (ctx->emax - ctx->emin - 1));
526
+ ctx->traps = 0; /*no errors*/
527
+ }
528
+ if (pthread_setspecific(*key, ctx) != 0) {
529
+ fprintf(stderr, "error: cannot store thread specific data");
530
+ abort();
531
+ }
532
+ }
533
+ return ctx;
534
+ }
535
+
536
+ typedef struct {
537
+ jv_refcnt refcnt;
538
+ double num_double;
539
+ char * literal_data;
540
+ decNumber num_decimal; // must be the last field in the structure for memory management
541
+ } jvp_literal_number;
542
+
543
+ typedef struct {
544
+ decNumber number;
545
+ decNumberUnit units[DEC_NUMBER_DOUBLE_EXTRA_UNITS];
546
+ } decNumberDoublePrecision;
547
+
548
+
549
+ static inline int jvp_number_is_literal(jv n) {
550
+ assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
551
+ return JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL);
552
+ }
553
+
554
+ static jvp_literal_number* jvp_literal_number_ptr(jv j) {
555
+ assert(JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL));
556
+ return (jvp_literal_number*)j.u.ptr;
557
+ }
558
+
559
+ static decNumber* jvp_dec_number_ptr(jv j) {
560
+ assert(JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL));
561
+ return &(((jvp_literal_number*)j.u.ptr)->num_decimal);
562
+ }
563
+
564
+ static jvp_literal_number* jvp_literal_number_alloc(unsigned literal_length) {
565
+
566
+ /* The number of units needed is ceil(DECNUMDIGITS/DECDPUN) */
567
+ int units = ((literal_length+DECDPUN-1)/DECDPUN);
568
+
569
+ jvp_literal_number* n = jv_mem_alloc(
570
+ sizeof(jvp_literal_number)
571
+ + sizeof(decNumberUnit) * units
572
+ );
573
+
574
+ return n;
575
+ }
576
+
577
+ static jv jvp_literal_number_new(const char * literal) {
578
+
579
+ jvp_literal_number * n = jvp_literal_number_alloc(strlen(literal));
580
+
581
+ n->refcnt = JV_REFCNT_INIT;
582
+ n->literal_data = NULL;
583
+ decContext *ctx = DEC_CONTEXT();
584
+ decContextClearStatus(ctx, DEC_Conversion_syntax);
585
+ decNumberFromString(&n->num_decimal, literal, ctx);
586
+ n->num_double = NAN;
587
+
588
+ if (ctx->status & DEC_Conversion_syntax) {
589
+ jv_mem_free(n);
590
+ return JV_INVALID;
591
+ }
592
+
593
+ jv r = {JVP_FLAGS_NUMBER_LITERAL, 0, 0, JV_NUMBER_SIZE_INIT, {&n->refcnt}};
594
+ return r;
595
+ }
596
+
597
+ static double jvp_literal_number_to_double(jv j) {
598
+ assert(JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL));
599
+ decContext dblCtx;
600
+
601
+ // init as decimal64 but change digits to allow conversion to binary64 (double)
602
+ decContextDefault(&dblCtx, DEC_INIT_DECIMAL64);
603
+ dblCtx.digits = DEC_NUMBER_DOUBLE_PRECISION;
604
+
605
+ decNumber *p_dec_number = jvp_dec_number_ptr(j);
606
+ decNumberDoublePrecision dec_double;
607
+ char literal[DEC_NUMBER_DOUBLE_PRECISION + DEC_NUMBER_STRING_GUARD + 1];
608
+
609
+ // reduce the number to the shortest possible form
610
+ // that fits into the 64 bit floating point representation
611
+ decNumberReduce(&dec_double.number, p_dec_number, &dblCtx);
612
+
613
+ decNumberToString(&dec_double.number, literal);
614
+
615
+ char *end;
616
+ return jvp_strtod(tsd_dtoa_context_get(), literal, &end);
617
+ }
618
+
619
+ static const char* jvp_literal_number_literal(jv n) {
620
+ assert(JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL));
621
+ decNumber *pdec = jvp_dec_number_ptr(n);
622
+ jvp_literal_number* plit = jvp_literal_number_ptr(n);
623
+
624
+ if (decNumberIsNaN(pdec)) {
625
+ return "null";
626
+ }
627
+
628
+ if (decNumberIsInfinite(pdec)) {
629
+ // We cannot preserve the literal data of numbers outside the limited
630
+ // range of exponent. Since `decNumberToString` returns "Infinity"
631
+ // (or "-Infinity"), and to reduce stack allocations as possible, we
632
+ // normalize infinities in the callers instead of printing the maximum
633
+ // (or minimum) double here.
634
+ return NULL;
635
+ }
636
+
637
+ if (plit->literal_data == NULL) {
638
+ int len = jvp_dec_number_ptr(n)->digits + 15 /* 14 + NUL */;
639
+ plit->literal_data = jv_mem_alloc(len);
640
+
641
+ // Preserve the actual precision as we have parsed it
642
+ // don't do decNumberTrim(pdec);
643
+
644
+ decNumberToString(pdec, plit->literal_data);
645
+ }
646
+
647
+ return plit->literal_data;
648
+ }
649
+
650
+ int jv_number_has_literal(jv n) {
651
+ assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
652
+ return JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL);
653
+ }
654
+
655
+ const char* jv_number_get_literal(jv n) {
656
+ assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
657
+
658
+ if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) {
659
+ return jvp_literal_number_literal(n);
660
+ } else {
661
+ return NULL;
662
+ }
663
+ }
664
+
665
+ jv jv_number_with_literal(const char * literal) {
666
+ return jvp_literal_number_new(literal);
667
+ }
668
+ #endif /* USE_DECNUM */
669
+
140
670
  jv jv_number(double x) {
141
- jv j = {JV_KIND_NUMBER, 0, 0, 0, {.number = x}};
671
+ jv j = {
672
+ #ifdef USE_DECNUM
673
+ JVP_FLAGS_NUMBER_NATIVE,
674
+ #else
675
+ JV_KIND_NUMBER,
676
+ #endif
677
+ 0, 0, 0, {.number = x}
678
+ };
142
679
  return j;
143
680
  }
144
681
 
682
+ static void jvp_number_free(jv j) {
683
+ assert(JVP_HAS_KIND(j, JV_KIND_NUMBER));
684
+ #ifdef USE_DECNUM
685
+ if (JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL) && jvp_refcnt_dec(j.u.ptr)) {
686
+ jvp_literal_number* n = jvp_literal_number_ptr(j);
687
+ if (n->literal_data) {
688
+ jv_mem_free(n->literal_data);
689
+ }
690
+ jv_mem_free(n);
691
+ }
692
+ #endif
693
+ }
694
+
145
695
  double jv_number_value(jv j) {
146
- assert(jv_get_kind(j) == JV_KIND_NUMBER);
696
+ assert(JVP_HAS_KIND(j, JV_KIND_NUMBER));
697
+ #ifdef USE_DECNUM
698
+ if (JVP_HAS_FLAGS(j, JVP_FLAGS_NUMBER_LITERAL)) {
699
+ jvp_literal_number* n = jvp_literal_number_ptr(j);
700
+
701
+ if (j.size != JV_NUMBER_SIZE_CONVERTED) {
702
+ n->num_double = jvp_literal_number_to_double(j);
703
+ j.size = JV_NUMBER_SIZE_CONVERTED;
704
+ }
705
+
706
+ return n->num_double;
707
+ }
708
+ #endif
147
709
  return j.u.number;
148
710
  }
149
711
 
150
712
  int jv_is_integer(jv j){
151
- if(jv_get_kind(j) != JV_KIND_NUMBER){
713
+ if (!JVP_HAS_KIND(j, JV_KIND_NUMBER)){
152
714
  return 0;
153
715
  }
716
+
154
717
  double x = jv_number_value(j);
155
- if(x != x || x > INT_MAX || x < INT_MIN){
718
+
719
+ double ipart;
720
+ double fpart = modf(x, &ipart);
721
+
722
+ return fabs(fpart) < DBL_EPSILON;
723
+ }
724
+
725
+ int jvp_number_is_nan(jv n) {
726
+ assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
727
+
728
+ #ifdef USE_DECNUM
729
+ if (JVP_HAS_FLAGS(n, JVP_FLAGS_NUMBER_LITERAL)) {
730
+ decNumber *pdec = jvp_dec_number_ptr(n);
731
+ return decNumberIsNaN(pdec);
732
+ }
733
+ #endif
734
+ return n.u.number != n.u.number;
735
+ }
736
+
737
+ int jvp_number_cmp(jv a, jv b) {
738
+ assert(JVP_HAS_KIND(a, JV_KIND_NUMBER));
739
+ assert(JVP_HAS_KIND(b, JV_KIND_NUMBER));
740
+
741
+ #ifdef USE_DECNUM
742
+ if (JVP_HAS_FLAGS(a, JVP_FLAGS_NUMBER_LITERAL) && JVP_HAS_FLAGS(b, JVP_FLAGS_NUMBER_LITERAL)) {
743
+ struct {
744
+ decNumber number;
745
+ decNumberUnit units[1];
746
+ } res;
747
+
748
+ decNumberCompare(&res.number,
749
+ jvp_dec_number_ptr(a),
750
+ jvp_dec_number_ptr(b),
751
+ DEC_CONTEXT()
752
+ );
753
+ if (decNumberIsZero(&res.number)) {
754
+ return 0;
755
+ } else if (decNumberIsNegative(&res.number)) {
756
+ return -1;
757
+ } else {
758
+ return 1;
759
+ }
760
+ }
761
+ #endif
762
+ double da = jv_number_value(a), db = jv_number_value(b);
763
+ if (da < db) {
764
+ return -1;
765
+ } else if (da == db) {
156
766
  return 0;
767
+ } else {
768
+ return 1;
157
769
  }
770
+ }
158
771
 
159
- return x == (int)x;
772
+ static int jvp_number_equal(jv a, jv b) {
773
+ return jvp_number_cmp(a, b) == 0;
160
774
  }
161
775
 
162
776
  /*
@@ -164,6 +778,7 @@ int jv_is_integer(jv j){
164
778
  */
165
779
 
166
780
  #define ARRAY_SIZE_ROUND_UP(n) (((n)*3)/2)
781
+ #define JVP_FLAGS_ARRAY JVP_MAKE_FLAGS(JV_KIND_ARRAY, JVP_PAYLOAD_ALLOCATED)
167
782
 
168
783
  static int imax(int a, int b) {
169
784
  if (a>b) return a;
@@ -178,7 +793,7 @@ typedef struct {
178
793
  } jvp_array;
179
794
 
180
795
  static jvp_array* jvp_array_ptr(jv a) {
181
- assert(jv_get_kind(a) == JV_KIND_ARRAY);
796
+ assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
182
797
  return (jvp_array*)a.u.ptr;
183
798
  }
184
799
 
@@ -191,12 +806,12 @@ static jvp_array* jvp_array_alloc(unsigned size) {
191
806
  }
192
807
 
193
808
  static jv jvp_array_new(unsigned size) {
194
- jv r = {JV_KIND_ARRAY, 0, 0, 0, {&jvp_array_alloc(size)->refcnt}};
809
+ jv r = {JVP_FLAGS_ARRAY, 0, 0, 0, {&jvp_array_alloc(size)->refcnt}};
195
810
  return r;
196
811
  }
197
812
 
198
813
  static void jvp_array_free(jv a) {
199
- assert(jv_get_kind(a) == JV_KIND_ARRAY);
814
+ assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
200
815
  if (jvp_refcnt_dec(a.u.ptr)) {
201
816
  jvp_array* array = jvp_array_ptr(a);
202
817
  for (int i=0; i<array->length; i++) {
@@ -207,17 +822,17 @@ static void jvp_array_free(jv a) {
207
822
  }
208
823
 
209
824
  static int jvp_array_length(jv a) {
210
- assert(jv_get_kind(a) == JV_KIND_ARRAY);
825
+ assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
211
826
  return a.size;
212
827
  }
213
828
 
214
829
  static int jvp_array_offset(jv a) {
215
- assert(jv_get_kind(a) == JV_KIND_ARRAY);
830
+ assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
216
831
  return a.offset;
217
832
  }
218
833
 
219
834
  static jv* jvp_array_read(jv a, int i) {
220
- assert(jv_get_kind(a) == JV_KIND_ARRAY);
835
+ assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
221
836
  if (i >= 0 && i < jvp_array_length(a)) {
222
837
  jvp_array* array = jvp_array_ptr(a);
223
838
  assert(i + jvp_array_offset(a) < array->length);
@@ -254,7 +869,7 @@ static jv* jvp_array_write(jv* a, int i) {
254
869
  }
255
870
  new_array->length = new_length;
256
871
  jvp_array_free(*a);
257
- jv new_jv = {JV_KIND_ARRAY, 0, 0, new_length, {&new_array->refcnt}};
872
+ jv new_jv = {JVP_FLAGS_ARRAY, 0, 0, new_length, {&new_array->refcnt}};
258
873
  *a = new_jv;
259
874
  return &new_array->elements[i];
260
875
  }
@@ -285,8 +900,33 @@ static void jvp_clamp_slice_params(int len, int *pstart, int *pend)
285
900
  if (*pend < *pstart) *pend = *pstart;
286
901
  }
287
902
 
903
+
904
+ static int jvp_array_contains(jv a, jv b) {
905
+ int r = 1;
906
+ jv_array_foreach(b, bi, belem) {
907
+ int ri = 0;
908
+ jv_array_foreach(a, ai, aelem) {
909
+ if (jv_contains(aelem, jv_copy(belem))) {
910
+ ri = 1;
911
+ break;
912
+ }
913
+ }
914
+ jv_free(belem);
915
+ if (!ri) {
916
+ r = 0;
917
+ break;
918
+ }
919
+ }
920
+ return r;
921
+ }
922
+
923
+
924
+ /*
925
+ * Public
926
+ */
927
+
288
928
  static jv jvp_array_slice(jv a, int start, int end) {
289
- assert(jv_get_kind(a) == JV_KIND_ARRAY);
929
+ assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
290
930
  int len = jvp_array_length(a);
291
931
  jvp_clamp_slice_params(len, &start, &end);
292
932
  assert(0 <= start && start <= end && end <= len);
@@ -323,14 +963,14 @@ jv jv_array() {
323
963
  }
324
964
 
325
965
  int jv_array_length(jv j) {
326
- assert(jv_get_kind(j) == JV_KIND_ARRAY);
966
+ assert(JVP_HAS_KIND(j, JV_KIND_ARRAY));
327
967
  int len = jvp_array_length(j);
328
968
  jv_free(j);
329
969
  return len;
330
970
  }
331
971
 
332
972
  jv jv_array_get(jv j, int idx) {
333
- assert(jv_get_kind(j) == JV_KIND_ARRAY);
973
+ assert(JVP_HAS_KIND(j, JV_KIND_ARRAY));
334
974
  jv* slot = jvp_array_read(j, idx);
335
975
  jv val;
336
976
  if (slot) {
@@ -343,7 +983,7 @@ jv jv_array_get(jv j, int idx) {
343
983
  }
344
984
 
345
985
  jv jv_array_set(jv j, int idx, jv val) {
346
- assert(jv_get_kind(j) == JV_KIND_ARRAY);
986
+ assert(JVP_HAS_KIND(j, JV_KIND_ARRAY));
347
987
 
348
988
  if (idx < 0)
349
989
  idx = jvp_array_length(j) + idx;
@@ -365,8 +1005,8 @@ jv jv_array_append(jv j, jv val) {
365
1005
  }
366
1006
 
367
1007
  jv jv_array_concat(jv a, jv b) {
368
- assert(jv_get_kind(a) == JV_KIND_ARRAY);
369
- assert(jv_get_kind(b) == JV_KIND_ARRAY);
1008
+ assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
1009
+ assert(JVP_HAS_KIND(b, JV_KIND_ARRAY));
370
1010
 
371
1011
  // FIXME: could be faster
372
1012
  jv_array_foreach(b, i, elem) {
@@ -377,41 +1017,18 @@ jv jv_array_concat(jv a, jv b) {
377
1017
  }
378
1018
 
379
1019
  jv jv_array_slice(jv a, int start, int end) {
380
- assert(jv_get_kind(a) == JV_KIND_ARRAY);
1020
+ assert(JVP_HAS_KIND(a, JV_KIND_ARRAY));
381
1021
  // copy/free of a coalesced
382
1022
  return jvp_array_slice(a, start, end);
383
1023
  }
384
1024
 
385
- int jv_array_contains(jv a, jv b) {
386
- int r = 1;
387
- jv_array_foreach(b, bi, belem) {
388
- int ri = 0;
389
- jv_array_foreach(a, ai, aelem) {
390
- if (jv_contains(aelem, jv_copy(belem))) {
391
- ri = 1;
392
- break;
393
- }
394
- }
395
- jv_free(belem);
396
- if (!ri) {
397
- r = 0;
398
- break;
399
- }
400
- }
401
- jv_free(a);
402
- jv_free(b);
403
- return r;
404
- }
405
-
406
1025
  jv jv_array_indexes(jv a, jv b) {
407
1026
  jv res = jv_array();
408
1027
  int idx = -1;
409
- jv_array_foreach(a, ai, aelem) {
1028
+ int alen = jv_array_length(jv_copy(a));
1029
+ for (int ai = 0; ai < alen; ++ai) {
410
1030
  jv_array_foreach(b, bi, belem) {
411
- // quieten compiler warnings about aelem not being used... by
412
- // using it
413
- if ((bi == 0 && !jv_equal(jv_copy(aelem), jv_copy(belem))) ||
414
- (bi > 0 && !jv_equal(jv_array_get(jv_copy(a), ai + bi), jv_copy(belem))))
1031
+ if (!jv_equal(jv_array_get(jv_copy(a), ai + bi), belem))
415
1032
  idx = -1;
416
1033
  else if (bi == 0 && idx == -1)
417
1034
  idx = ai;
@@ -425,11 +1042,12 @@ jv jv_array_indexes(jv a, jv b) {
425
1042
  return res;
426
1043
  }
427
1044
 
428
-
429
1045
  /*
430
1046
  * Strings (internal helpers)
431
1047
  */
432
1048
 
1049
+ #define JVP_FLAGS_STRING JVP_MAKE_FLAGS(JV_KIND_STRING, JVP_PAYLOAD_ALLOCATED)
1050
+
433
1051
  typedef struct {
434
1052
  jv_refcnt refcnt;
435
1053
  uint32_t hash;
@@ -441,7 +1059,7 @@ typedef struct {
441
1059
  } jvp_string;
442
1060
 
443
1061
  static jvp_string* jvp_string_ptr(jv a) {
444
- assert(jv_get_kind(a) == JV_KIND_STRING);
1062
+ assert(JVP_HAS_KIND(a, JV_KIND_STRING));
445
1063
  return (jvp_string*)a.u.ptr;
446
1064
  }
447
1065
 
@@ -456,14 +1074,13 @@ static jvp_string* jvp_string_alloc(uint32_t size) {
456
1074
  static jv jvp_string_copy_replace_bad(const char* data, uint32_t length) {
457
1075
  const char* end = data + length;
458
1076
  const char* i = data;
459
- const char* cstart;
460
1077
 
461
1078
  uint32_t maxlength = length * 3 + 1; // worst case: all bad bytes, each becomes a 3-byte U+FFFD
462
1079
  jvp_string* s = jvp_string_alloc(maxlength);
463
1080
  char* out = s->data;
464
1081
  int c = 0;
465
1082
 
466
- while ((i = jvp_utf8_next((cstart = i), end, &c))) {
1083
+ while ((i = jvp_utf8_next(i, end, &c))) {
467
1084
  if (c == -1) {
468
1085
  c = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER
469
1086
  }
@@ -473,7 +1090,7 @@ static jv jvp_string_copy_replace_bad(const char* data, uint32_t length) {
473
1090
  length = out - s->data;
474
1091
  s->data[length] = 0;
475
1092
  s->length_hashed = length << 1;
476
- jv r = {JV_KIND_STRING, 0, 0, 0, {&s->refcnt}};
1093
+ jv r = {JVP_FLAGS_STRING, 0, 0, 0, {&s->refcnt}};
477
1094
  return r;
478
1095
  }
479
1096
 
@@ -484,7 +1101,7 @@ static jv jvp_string_new(const char* data, uint32_t length) {
484
1101
  if (data != NULL)
485
1102
  memcpy(s->data, data, length);
486
1103
  s->data[length] = 0;
487
- jv r = {JV_KIND_STRING, 0, 0, 0, {&s->refcnt}};
1104
+ jv r = {JVP_FLAGS_STRING, 0, 0, 0, {&s->refcnt}};
488
1105
  return r;
489
1106
  }
490
1107
 
@@ -492,7 +1109,7 @@ static jv jvp_string_empty_new(uint32_t length) {
492
1109
  jvp_string* s = jvp_string_alloc(length);
493
1110
  s->length_hashed = 0;
494
1111
  memset(s->data, 0, length);
495
- jv r = {JV_KIND_STRING, 0, 0, 0, {&s->refcnt}};
1112
+ jv r = {JVP_FLAGS_STRING, 0, 0, 0, {&s->refcnt}};
496
1113
  return r;
497
1114
  }
498
1115
 
@@ -535,7 +1152,7 @@ static jv jvp_string_append(jv string, const char* data, uint32_t len) {
535
1152
  memcpy(news->data + currlen, data, len);
536
1153
  news->data[currlen + len] = 0;
537
1154
  jvp_string_free(string);
538
- jv r = {JV_KIND_STRING, 0, 0, 0, {&news->refcnt}};
1155
+ jv r = {JVP_FLAGS_STRING, 0, 0, 0, {&news->refcnt}};
539
1156
  return r;
540
1157
  }
541
1158
  }
@@ -583,7 +1200,9 @@ static uint32_t jvp_string_hash(jv jstr) {
583
1200
 
584
1201
  switch(len & 3) {
585
1202
  case 3: k1 ^= tail[2] << 16;
1203
+ JQ_FALLTHROUGH;
586
1204
  case 2: k1 ^= tail[1] << 8;
1205
+ JQ_FALLTHROUGH;
587
1206
  case 1: k1 ^= tail[0];
588
1207
  k1 *= c1; k1 = rotl32(k1,15); k1 *= c2; h1 ^= k1;
589
1208
  }
@@ -602,9 +1221,10 @@ static uint32_t jvp_string_hash(jv jstr) {
602
1221
  return h1;
603
1222
  }
604
1223
 
1224
+
605
1225
  static int jvp_string_equal(jv a, jv b) {
606
- assert(jv_get_kind(a) == JV_KIND_STRING);
607
- assert(jv_get_kind(b) == JV_KIND_STRING);
1226
+ assert(JVP_HAS_KIND(a, JV_KIND_STRING));
1227
+ assert(JVP_HAS_KIND(b, JV_KIND_STRING));
608
1228
  jvp_string* stra = jvp_string_ptr(a);
609
1229
  jvp_string* strb = jvp_string_ptr(b);
610
1230
  if (jvp_string_length(stra) != jvp_string_length(strb)) return 0;
@@ -631,14 +1251,14 @@ jv jv_string(const char* str) {
631
1251
  }
632
1252
 
633
1253
  int jv_string_length_bytes(jv j) {
634
- assert(jv_get_kind(j) == JV_KIND_STRING);
1254
+ assert(JVP_HAS_KIND(j, JV_KIND_STRING));
635
1255
  int r = jvp_string_length(jvp_string_ptr(j));
636
1256
  jv_free(j);
637
1257
  return r;
638
1258
  }
639
1259
 
640
1260
  int jv_string_length_codepoints(jv j) {
641
- assert(jv_get_kind(j) == JV_KIND_STRING);
1261
+ assert(JVP_HAS_KIND(j, JV_KIND_STRING));
642
1262
  const char* i = jv_string_value(j);
643
1263
  const char* end = i + jv_string_length_bytes(jv_copy(j));
644
1264
  int c = 0, len = 0;
@@ -649,19 +1269,27 @@ int jv_string_length_codepoints(jv j) {
649
1269
 
650
1270
 
651
1271
  jv jv_string_indexes(jv j, jv k) {
652
- assert(jv_get_kind(j) == JV_KIND_STRING);
653
- assert(jv_get_kind(k) == JV_KIND_STRING);
1272
+ assert(JVP_HAS_KIND(j, JV_KIND_STRING));
1273
+ assert(JVP_HAS_KIND(k, JV_KIND_STRING));
654
1274
  const char *jstr = jv_string_value(j);
655
1275
  const char *idxstr = jv_string_value(k);
656
- const char *p;
1276
+ const char *p, *lp;
657
1277
  int jlen = jv_string_length_bytes(jv_copy(j));
658
1278
  int idxlen = jv_string_length_bytes(jv_copy(k));
659
1279
  jv a = jv_array();
660
1280
 
661
- p = jstr;
662
- while ((p = _jq_memmem(p, (jstr + jlen) - p, idxstr, idxlen)) != NULL) {
663
- a = jv_array_append(a, jv_number(p - jstr));
664
- p += idxlen;
1281
+ if (idxlen != 0) {
1282
+ int n = 0;
1283
+ p = lp = jstr;
1284
+ while ((p = _jq_memmem(p, (jstr + jlen) - p, idxstr, idxlen)) != NULL) {
1285
+ while (lp < p) {
1286
+ lp += jvp_utf8_decode_length(*lp);
1287
+ n++;
1288
+ }
1289
+
1290
+ a = jv_array_append(a, jv_number(n));
1291
+ p++;
1292
+ }
665
1293
  }
666
1294
  jv_free(j);
667
1295
  jv_free(k);
@@ -669,8 +1297,8 @@ jv jv_string_indexes(jv j, jv k) {
669
1297
  }
670
1298
 
671
1299
  jv jv_string_split(jv j, jv sep) {
672
- assert(jv_get_kind(j) == JV_KIND_STRING);
673
- assert(jv_get_kind(sep) == JV_KIND_STRING);
1300
+ assert(JVP_HAS_KIND(j, JV_KIND_STRING));
1301
+ assert(JVP_HAS_KIND(sep, JV_KIND_STRING));
674
1302
  const char *jstr = jv_string_value(j);
675
1303
  const char *jend = jstr + jv_string_length_bytes(jv_copy(j));
676
1304
  const char *sepstr = jv_string_value(sep);
@@ -701,7 +1329,7 @@ jv jv_string_split(jv j, jv sep) {
701
1329
  }
702
1330
 
703
1331
  jv jv_string_explode(jv j) {
704
- assert(jv_get_kind(j) == JV_KIND_STRING);
1332
+ assert(JVP_HAS_KIND(j, JV_KIND_STRING));
705
1333
  const char* i = jv_string_value(j);
706
1334
  int len = jv_string_length_bytes(jv_copy(j));
707
1335
  const char* end = i + len;
@@ -714,7 +1342,7 @@ jv jv_string_explode(jv j) {
714
1342
  }
715
1343
 
716
1344
  jv jv_string_implode(jv j) {
717
- assert(jv_get_kind(j) == JV_KIND_ARRAY);
1345
+ assert(JVP_HAS_KIND(j, JV_KIND_ARRAY));
718
1346
  int len = jv_array_length(jv_copy(j));
719
1347
  jv s = jv_string_empty(len);
720
1348
  int i;
@@ -723,9 +1351,11 @@ jv jv_string_implode(jv j) {
723
1351
 
724
1352
  for (i = 0; i < len; i++) {
725
1353
  jv n = jv_array_get(jv_copy(j), i);
726
- assert(jv_get_kind(n) == JV_KIND_NUMBER);
1354
+ assert(JVP_HAS_KIND(n, JV_KIND_NUMBER));
727
1355
  int nv = jv_number_value(n);
728
- if (nv > 0x10FFFF)
1356
+ jv_free(n);
1357
+ // outside codepoint range or in utf16 surrogate pair range
1358
+ if (nv < 0 || nv > 0x10FFFF || (nv >= 0xD800 && nv <= 0xDFFF))
729
1359
  nv = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER
730
1360
  s = jv_string_append_codepoint(s, nv);
731
1361
  }
@@ -735,19 +1365,19 @@ jv jv_string_implode(jv j) {
735
1365
  }
736
1366
 
737
1367
  unsigned long jv_string_hash(jv j) {
738
- assert(jv_get_kind(j) == JV_KIND_STRING);
1368
+ assert(JVP_HAS_KIND(j, JV_KIND_STRING));
739
1369
  uint32_t hash = jvp_string_hash(j);
740
1370
  jv_free(j);
741
1371
  return hash;
742
1372
  }
743
1373
 
744
1374
  const char* jv_string_value(jv j) {
745
- assert(jv_get_kind(j) == JV_KIND_STRING);
1375
+ assert(JVP_HAS_KIND(j, JV_KIND_STRING));
746
1376
  return jvp_string_ptr(j)->data;
747
1377
  }
748
1378
 
749
1379
  jv jv_string_slice(jv j, int start, int end) {
750
- assert(jv_get_kind(j) == JV_KIND_STRING);
1380
+ assert(JVP_HAS_KIND(j, JV_KIND_STRING));
751
1381
  const char *s = jv_string_value(j);
752
1382
  int len = jv_string_length_bytes(jv_copy(j));
753
1383
  int i;
@@ -858,6 +1488,8 @@ jv jv_string_fmt(const char* fmt, ...) {
858
1488
  * Objects (internal helpers)
859
1489
  */
860
1490
 
1491
+ #define JVP_FLAGS_OBJECT JVP_MAKE_FLAGS(JV_KIND_OBJECT, JVP_PAYLOAD_ALLOCATED)
1492
+
861
1493
  struct object_slot {
862
1494
  int next; /* next slot with same hash, for collisions */
863
1495
  uint32_t hash;
@@ -894,22 +1526,22 @@ static jv jvp_object_new(int size) {
894
1526
  for (int i=0; i<size*2; i++) {
895
1527
  hashbuckets[i] = -1;
896
1528
  }
897
- jv r = {JV_KIND_OBJECT, 0, 0, size, {&obj->refcnt}};
1529
+ jv r = {JVP_FLAGS_OBJECT, 0, 0, size, {&obj->refcnt}};
898
1530
  return r;
899
1531
  }
900
1532
 
901
1533
  static jvp_object* jvp_object_ptr(jv o) {
902
- assert(jv_get_kind(o) == JV_KIND_OBJECT);
1534
+ assert(JVP_HAS_KIND(o, JV_KIND_OBJECT));
903
1535
  return (jvp_object*)o.u.ptr;
904
1536
  }
905
1537
 
906
1538
  static uint32_t jvp_object_mask(jv o) {
907
- assert(jv_get_kind(o) == JV_KIND_OBJECT);
1539
+ assert(JVP_HAS_KIND(o, JV_KIND_OBJECT));
908
1540
  return (o.size * 2) - 1;
909
1541
  }
910
1542
 
911
1543
  static int jvp_object_size(jv o) {
912
- assert(jv_get_kind(o) == JV_KIND_OBJECT);
1544
+ assert(JVP_HAS_KIND(o, JV_KIND_OBJECT));
913
1545
  return o.size;
914
1546
  }
915
1547
 
@@ -957,7 +1589,7 @@ static struct object_slot* jvp_object_add_slot(jv object, jv key, int* bucket) {
957
1589
  }
958
1590
 
959
1591
  static jv* jvp_object_read(jv object, jv key) {
960
- assert(jv_get_kind(key) == JV_KIND_STRING);
1592
+ assert(JVP_HAS_KIND(key, JV_KIND_STRING));
961
1593
  int* bucket = jvp_object_find_bucket(object, key);
962
1594
  struct object_slot* slot = jvp_object_find_slot(object, key, bucket);
963
1595
  if (slot == 0) return 0;
@@ -965,7 +1597,7 @@ static jv* jvp_object_read(jv object, jv key) {
965
1597
  }
966
1598
 
967
1599
  static void jvp_object_free(jv o) {
968
- assert(jv_get_kind(o) == JV_KIND_OBJECT);
1600
+ assert(JVP_HAS_KIND(o, JV_KIND_OBJECT));
969
1601
  if (jvp_refcnt_dec(o.u.ptr)) {
970
1602
  for (int i=0; i<jvp_object_size(o); i++) {
971
1603
  struct object_slot* slot = jvp_object_get_slot(o, i);
@@ -979,7 +1611,7 @@ static void jvp_object_free(jv o) {
979
1611
  }
980
1612
 
981
1613
  static jv jvp_object_rehash(jv object) {
982
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1614
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
983
1615
  assert(jvp_refcnt_unshared(object.u.ptr));
984
1616
  int size = jvp_object_size(object);
985
1617
  jv new_object = jvp_object_new(size * 2);
@@ -998,7 +1630,7 @@ static jv jvp_object_rehash(jv object) {
998
1630
  }
999
1631
 
1000
1632
  static jv jvp_object_unshare(jv object) {
1001
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1633
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
1002
1634
  if (jvp_refcnt_unshared(object.u.ptr))
1003
1635
  return object;
1004
1636
 
@@ -1047,7 +1679,7 @@ static jv* jvp_object_write(jv* object, jv key) {
1047
1679
  }
1048
1680
 
1049
1681
  static int jvp_object_delete(jv* object, jv key) {
1050
- assert(jv_get_kind(key) == JV_KIND_STRING);
1682
+ assert(JVP_HAS_KIND(key, JV_KIND_STRING));
1051
1683
  *object = jvp_object_unshare(*object);
1052
1684
  int* bucket = jvp_object_find_bucket(*object, key);
1053
1685
  int* prev_ptr = bucket;
@@ -1091,6 +1723,21 @@ static int jvp_object_equal(jv o1, jv o2) {
1091
1723
  return len1 == len2;
1092
1724
  }
1093
1725
 
1726
+ static int jvp_object_contains(jv a, jv b) {
1727
+ assert(JVP_HAS_KIND(a, JV_KIND_OBJECT));
1728
+ assert(JVP_HAS_KIND(b, JV_KIND_OBJECT));
1729
+ int r = 1;
1730
+
1731
+ jv_object_foreach(b, key, b_val) {
1732
+ jv a_val = jv_object_get(jv_copy(a), key);
1733
+
1734
+ r = jv_contains(a_val, b_val);
1735
+
1736
+ if (!r) break;
1737
+ }
1738
+ return r;
1739
+ }
1740
+
1094
1741
  /*
1095
1742
  * Objects (public interface)
1096
1743
  */
@@ -1100,8 +1747,8 @@ jv jv_object() {
1100
1747
  }
1101
1748
 
1102
1749
  jv jv_object_get(jv object, jv key) {
1103
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1104
- assert(jv_get_kind(key) == JV_KIND_STRING);
1750
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
1751
+ assert(JVP_HAS_KIND(key, JV_KIND_STRING));
1105
1752
  jv* slot = jvp_object_read(object, key);
1106
1753
  jv val;
1107
1754
  if (slot) {
@@ -1115,8 +1762,8 @@ jv jv_object_get(jv object, jv key) {
1115
1762
  }
1116
1763
 
1117
1764
  int jv_object_has(jv object, jv key) {
1118
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1119
- assert(jv_get_kind(key) == JV_KIND_STRING);
1765
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
1766
+ assert(JVP_HAS_KIND(key, JV_KIND_STRING));
1120
1767
  jv* slot = jvp_object_read(object, key);
1121
1768
  int res = slot ? 1 : 0;
1122
1769
  jv_free(object);
@@ -1125,8 +1772,8 @@ int jv_object_has(jv object, jv key) {
1125
1772
  }
1126
1773
 
1127
1774
  jv jv_object_set(jv object, jv key, jv value) {
1128
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1129
- assert(jv_get_kind(key) == JV_KIND_STRING);
1775
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
1776
+ assert(JVP_HAS_KIND(key, JV_KIND_STRING));
1130
1777
  // copy/free of object, key, value coalesced
1131
1778
  jv* slot = jvp_object_write(&object, key);
1132
1779
  jv_free(*slot);
@@ -1135,22 +1782,22 @@ jv jv_object_set(jv object, jv key, jv value) {
1135
1782
  }
1136
1783
 
1137
1784
  jv jv_object_delete(jv object, jv key) {
1138
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1139
- assert(jv_get_kind(key) == JV_KIND_STRING);
1785
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
1786
+ assert(JVP_HAS_KIND(key, JV_KIND_STRING));
1140
1787
  jvp_object_delete(&object, key);
1141
1788
  jv_free(key);
1142
1789
  return object;
1143
1790
  }
1144
1791
 
1145
1792
  int jv_object_length(jv object) {
1146
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1793
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
1147
1794
  int n = jvp_object_length(object);
1148
1795
  jv_free(object);
1149
1796
  return n;
1150
1797
  }
1151
1798
 
1152
1799
  jv jv_object_merge(jv a, jv b) {
1153
- assert(jv_get_kind(a) == JV_KIND_OBJECT);
1800
+ assert(JVP_HAS_KIND(a, JV_KIND_OBJECT));
1154
1801
  jv_object_foreach(b, k, v) {
1155
1802
  a = jv_object_set(a, k, v);
1156
1803
  }
@@ -1159,14 +1806,14 @@ jv jv_object_merge(jv a, jv b) {
1159
1806
  }
1160
1807
 
1161
1808
  jv jv_object_merge_recursive(jv a, jv b) {
1162
- assert(jv_get_kind(a) == JV_KIND_OBJECT);
1163
- assert(jv_get_kind(b) == JV_KIND_OBJECT);
1809
+ assert(JVP_HAS_KIND(a, JV_KIND_OBJECT));
1810
+ assert(JVP_HAS_KIND(b, JV_KIND_OBJECT));
1164
1811
 
1165
1812
  jv_object_foreach(b, k, v) {
1166
1813
  jv elem = jv_object_get(jv_copy(a), jv_copy(k));
1167
1814
  if (jv_is_valid(elem) &&
1168
- jv_get_kind(elem) == JV_KIND_OBJECT &&
1169
- jv_get_kind(v) == JV_KIND_OBJECT) {
1815
+ JVP_HAS_KIND(elem, JV_KIND_OBJECT) &&
1816
+ JVP_HAS_KIND(v, JV_KIND_OBJECT)) {
1170
1817
  a = jv_object_set(a, k, jv_object_merge_recursive(elem, v));
1171
1818
  } else {
1172
1819
  jv_free(elem);
@@ -1177,25 +1824,6 @@ jv jv_object_merge_recursive(jv a, jv b) {
1177
1824
  return a;
1178
1825
  }
1179
1826
 
1180
- int jv_object_contains(jv a, jv b) {
1181
- assert(jv_get_kind(a) == JV_KIND_OBJECT);
1182
- assert(jv_get_kind(b) == JV_KIND_OBJECT);
1183
- int r = 1;
1184
-
1185
- jv_object_foreach(b, key, b_val) {
1186
- jv a_val = jv_object_get(jv_copy(a), jv_copy(key));
1187
-
1188
- r = jv_contains(a_val, b_val);
1189
- jv_free(key);
1190
-
1191
- if (!r) break;
1192
- }
1193
-
1194
- jv_free(a);
1195
- jv_free(b);
1196
- return r;
1197
- }
1198
-
1199
1827
  /*
1200
1828
  * Object iteration (internal helpers)
1201
1829
  */
@@ -1207,12 +1835,12 @@ int jv_object_iter_valid(jv object, int i) {
1207
1835
  }
1208
1836
 
1209
1837
  int jv_object_iter(jv object) {
1210
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1838
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
1211
1839
  return jv_object_iter_next(object, -1);
1212
1840
  }
1213
1841
 
1214
1842
  int jv_object_iter_next(jv object, int iter) {
1215
- assert(jv_get_kind(object) == JV_KIND_OBJECT);
1843
+ assert(JVP_HAS_KIND(object, JV_KIND_OBJECT));
1216
1844
  assert(iter != ITER_FINISHED);
1217
1845
  struct object_slot* slot;
1218
1846
  do {
@@ -1228,7 +1856,7 @@ int jv_object_iter_next(jv object, int iter) {
1228
1856
 
1229
1857
  jv jv_object_iter_key(jv object, int iter) {
1230
1858
  jv s = jvp_object_get_slot(object, iter)->string;
1231
- assert(jv_get_kind(s) == JV_KIND_STRING);
1859
+ assert(JVP_HAS_KIND(s, JV_KIND_STRING));
1232
1860
  return jv_copy(s);
1233
1861
  }
1234
1862
 
@@ -1240,34 +1868,36 @@ jv jv_object_iter_value(jv object, int iter) {
1240
1868
  * Memory management
1241
1869
  */
1242
1870
  jv jv_copy(jv j) {
1243
- if (jv_get_kind(j) == JV_KIND_ARRAY ||
1244
- jv_get_kind(j) == JV_KIND_STRING ||
1245
- jv_get_kind(j) == JV_KIND_OBJECT ||
1246
- (jv_get_kind(j) == JV_KIND_INVALID && j.u.ptr != 0)) {
1871
+ if (JVP_IS_ALLOCATED(j)) {
1247
1872
  jvp_refcnt_inc(j.u.ptr);
1248
1873
  }
1249
1874
  return j;
1250
1875
  }
1251
1876
 
1252
1877
  void jv_free(jv j) {
1253
- if (jv_get_kind(j) == JV_KIND_ARRAY) {
1254
- jvp_array_free(j);
1255
- } else if (jv_get_kind(j) == JV_KIND_STRING) {
1256
- jvp_string_free(j);
1257
- } else if (jv_get_kind(j) == JV_KIND_OBJECT) {
1258
- jvp_object_free(j);
1259
- } else if (jv_get_kind(j) == JV_KIND_INVALID) {
1260
- jvp_invalid_free(j);
1878
+ switch(JVP_KIND(j)) {
1879
+ case JV_KIND_ARRAY:
1880
+ jvp_array_free(j);
1881
+ break;
1882
+ case JV_KIND_STRING:
1883
+ jvp_string_free(j);
1884
+ break;
1885
+ case JV_KIND_OBJECT:
1886
+ jvp_object_free(j);
1887
+ break;
1888
+ case JV_KIND_INVALID:
1889
+ jvp_invalid_free(j);
1890
+ break;
1891
+ case JV_KIND_NUMBER:
1892
+ jvp_number_free(j);
1893
+ break;
1261
1894
  }
1262
1895
  }
1263
1896
 
1264
1897
  int jv_get_refcnt(jv j) {
1265
- switch (jv_get_kind(j)) {
1266
- case JV_KIND_ARRAY:
1267
- case JV_KIND_STRING:
1268
- case JV_KIND_OBJECT:
1898
+ if (JVP_IS_ALLOCATED(j)) {
1269
1899
  return j.u.ptr->count;
1270
- default:
1900
+ } else {
1271
1901
  return 1;
1272
1902
  }
1273
1903
  }
@@ -1280,14 +1910,17 @@ int jv_equal(jv a, jv b) {
1280
1910
  int r;
1281
1911
  if (jv_get_kind(a) != jv_get_kind(b)) {
1282
1912
  r = 0;
1283
- } else if (jv_get_kind(a) == JV_KIND_NUMBER) {
1284
- r = jv_number_value(a) == jv_number_value(b);
1285
- } else if (a.kind_flags == b.kind_flags &&
1913
+ } else if (JVP_IS_ALLOCATED(a) &&
1914
+ JVP_IS_ALLOCATED(b) &&
1915
+ a.kind_flags == b.kind_flags &&
1286
1916
  a.size == b.size &&
1287
1917
  a.u.ptr == b.u.ptr) {
1288
1918
  r = 1;
1289
1919
  } else {
1290
1920
  switch (jv_get_kind(a)) {
1921
+ case JV_KIND_NUMBER:
1922
+ r = jvp_number_equal(a, b);
1923
+ break;
1291
1924
  case JV_KIND_ARRAY:
1292
1925
  r = jvp_array_equal(a, b);
1293
1926
  break;
@@ -1314,18 +1947,10 @@ int jv_identical(jv a, jv b) {
1314
1947
  || a.size != b.size) {
1315
1948
  r = 0;
1316
1949
  } else {
1317
- switch (jv_get_kind(a)) {
1318
- case JV_KIND_ARRAY:
1319
- case JV_KIND_STRING:
1320
- case JV_KIND_OBJECT:
1950
+ if (JVP_IS_ALLOCATED(a) /* b has the same flags */) {
1321
1951
  r = a.u.ptr == b.u.ptr;
1322
- break;
1323
- case JV_KIND_NUMBER:
1324
- r = memcmp(&a.u.number, &b.u.number, sizeof(a.u.number)) == 0;
1325
- break;
1326
- default:
1327
- r = 1;
1328
- break;
1952
+ } else {
1953
+ r = memcmp(&a.u.ptr, &b.u.ptr, sizeof(a.u)) == 0;
1329
1954
  }
1330
1955
  }
1331
1956
  jv_free(a);
@@ -1337,12 +1962,18 @@ int jv_contains(jv a, jv b) {
1337
1962
  int r = 1;
1338
1963
  if (jv_get_kind(a) != jv_get_kind(b)) {
1339
1964
  r = 0;
1340
- } else if (jv_get_kind(a) == JV_KIND_OBJECT) {
1341
- r = jv_object_contains(jv_copy(a), jv_copy(b));
1342
- } else if (jv_get_kind(a) == JV_KIND_ARRAY) {
1343
- r = jv_array_contains(jv_copy(a), jv_copy(b));
1344
- } else if (jv_get_kind(a) == JV_KIND_STRING) {
1345
- r = strstr(jv_string_value(a), jv_string_value(b)) != 0;
1965
+ } else if (JVP_HAS_KIND(a, JV_KIND_OBJECT)) {
1966
+ r = jvp_object_contains(a, b);
1967
+ } else if (JVP_HAS_KIND(a, JV_KIND_ARRAY)) {
1968
+ r = jvp_array_contains(a, b);
1969
+ } else if (JVP_HAS_KIND(a, JV_KIND_STRING)) {
1970
+ int b_len = jv_string_length_bytes(jv_copy(b));
1971
+ if (b_len != 0) {
1972
+ r = _jq_memmem(jv_string_value(a), jv_string_length_bytes(jv_copy(a)),
1973
+ jv_string_value(b), b_len) != 0;
1974
+ } else {
1975
+ r = 1;
1976
+ }
1346
1977
  } else {
1347
1978
  r = jv_equal(jv_copy(a), jv_copy(b));
1348
1979
  }