visaljs 0.0.0-stage → 0.0.2

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 (520) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -2
  3. package/cli.js +8084 -0
  4. package/node/include/js_node.h +46 -0
  5. package/node/prelude/async_hooks.js +88 -0
  6. package/node/prelude/buffer.js +31 -0
  7. package/node/prelude/crypto.js +114 -0
  8. package/node/prelude/events.js +227 -0
  9. package/node/prelude/fs.js +79 -0
  10. package/node/prelude/http.js +536 -0
  11. package/node/prelude/http2.js +30 -0
  12. package/node/prelude/internal/crypto/asym.js +333 -0
  13. package/node/prelude/internal/crypto/cipher.js +205 -0
  14. package/node/prelude/internal/crypto/hash.js +137 -0
  15. package/node/prelude/internal/crypto/kdf.js +182 -0
  16. package/node/prelude/internal/crypto/keys.js +603 -0
  17. package/node/prelude/internal/crypto/random.js +118 -0
  18. package/node/prelude/internal/crypto/util.js +76 -0
  19. package/node/prelude/internal/errors.js +88 -0
  20. package/node/prelude/internal/querystring.js +105 -0
  21. package/node/prelude/module.js +53 -0
  22. package/node/prelude/net.js +51 -0
  23. package/node/prelude/os.js +129 -0
  24. package/node/prelude/path.js +257 -0
  25. package/node/prelude/process.js +21 -0
  26. package/node/prelude/querystring.js +469 -0
  27. package/node/prelude/stream.js +1327 -0
  28. package/node/prelude/stream_promises.js +7 -0
  29. package/node/prelude/stream_web.js +6 -0
  30. package/node/prelude/string_decoder.js +236 -0
  31. package/node/prelude/tty.js +18 -0
  32. package/node/prelude/url.js +1156 -0
  33. package/node/prelude/util.js +64 -0
  34. package/node/prelude/zlib.js +81 -0
  35. package/node/src/host_fs.c +126 -0
  36. package/node/src/host_http.c +486 -0
  37. package/node/src/host_os.c +505 -0
  38. package/node/src/host_sys.c +78 -0
  39. package/node/third_party/libuv/LICENSE +19 -0
  40. package/node/third_party/libuv/include/uv/aix.h +32 -0
  41. package/node/third_party/libuv/include/uv/bsd.h +34 -0
  42. package/node/third_party/libuv/include/uv/darwin.h +61 -0
  43. package/node/third_party/libuv/include/uv/errno.h +483 -0
  44. package/node/third_party/libuv/include/uv/linux.h +34 -0
  45. package/node/third_party/libuv/include/uv/os390.h +33 -0
  46. package/node/third_party/libuv/include/uv/posix.h +31 -0
  47. package/node/third_party/libuv/include/uv/sunos.h +44 -0
  48. package/node/third_party/libuv/include/uv/threadpool.h +37 -0
  49. package/node/third_party/libuv/include/uv/tree.h +521 -0
  50. package/node/third_party/libuv/include/uv/unix.h +512 -0
  51. package/node/third_party/libuv/include/uv/version.h +43 -0
  52. package/node/third_party/libuv/include/uv/win.h +698 -0
  53. package/node/third_party/libuv/include/uv.h +1990 -0
  54. package/node/third_party/libuv/src/fs-poll.c +290 -0
  55. package/node/third_party/libuv/src/heap-inl.h +245 -0
  56. package/node/third_party/libuv/src/idna.c +560 -0
  57. package/node/third_party/libuv/src/idna.h +31 -0
  58. package/node/third_party/libuv/src/inet.c +298 -0
  59. package/node/third_party/libuv/src/queue.h +90 -0
  60. package/node/third_party/libuv/src/random.c +123 -0
  61. package/node/third_party/libuv/src/strscpy.c +38 -0
  62. package/node/third_party/libuv/src/strscpy.h +39 -0
  63. package/node/third_party/libuv/src/strtok.c +52 -0
  64. package/node/third_party/libuv/src/strtok.h +27 -0
  65. package/node/third_party/libuv/src/thread-common.c +175 -0
  66. package/node/third_party/libuv/src/threadpool.c +419 -0
  67. package/node/third_party/libuv/src/timer.c +200 -0
  68. package/node/third_party/libuv/src/unix/async.c +418 -0
  69. package/node/third_party/libuv/src/unix/bsd-ifaddrs.c +164 -0
  70. package/node/third_party/libuv/src/unix/core.c +2104 -0
  71. package/node/third_party/libuv/src/unix/darwin-proctitle.c +176 -0
  72. package/node/third_party/libuv/src/unix/darwin-stub.h +97 -0
  73. package/node/third_party/libuv/src/unix/darwin-syscalls.h +17 -0
  74. package/node/third_party/libuv/src/unix/darwin.c +237 -0
  75. package/node/third_party/libuv/src/unix/dl.c +80 -0
  76. package/node/third_party/libuv/src/unix/fs.c +2303 -0
  77. package/node/third_party/libuv/src/unix/fsevents.c +906 -0
  78. package/node/third_party/libuv/src/unix/getaddrinfo.c +252 -0
  79. package/node/third_party/libuv/src/unix/getnameinfo.c +121 -0
  80. package/node/third_party/libuv/src/unix/internal.h +530 -0
  81. package/node/third_party/libuv/src/unix/kqueue.c +667 -0
  82. package/node/third_party/libuv/src/unix/linux.c +2761 -0
  83. package/node/third_party/libuv/src/unix/loop-watcher.c +68 -0
  84. package/node/third_party/libuv/src/unix/loop.c +240 -0
  85. package/node/third_party/libuv/src/unix/pipe.c +555 -0
  86. package/node/third_party/libuv/src/unix/poll.c +159 -0
  87. package/node/third_party/libuv/src/unix/process.c +1123 -0
  88. package/node/third_party/libuv/src/unix/procfs-exepath.c +45 -0
  89. package/node/third_party/libuv/src/unix/proctitle.c +157 -0
  90. package/node/third_party/libuv/src/unix/random-devurandom.c +93 -0
  91. package/node/third_party/libuv/src/unix/random-getentropy.c +57 -0
  92. package/node/third_party/libuv/src/unix/random-getrandom.c +86 -0
  93. package/node/third_party/libuv/src/unix/random-sysctl-linux.c +99 -0
  94. package/node/third_party/libuv/src/unix/signal.c +581 -0
  95. package/node/third_party/libuv/src/unix/stream.c +1567 -0
  96. package/node/third_party/libuv/src/unix/tcp.c +673 -0
  97. package/node/third_party/libuv/src/unix/thread.c +975 -0
  98. package/node/third_party/libuv/src/unix/tty.c +510 -0
  99. package/node/third_party/libuv/src/unix/udp.c +1434 -0
  100. package/node/third_party/libuv/src/uv-common.c +1051 -0
  101. package/node/third_party/libuv/src/uv-common.h +474 -0
  102. package/node/third_party/libuv/src/uv-data-getter-setters.c +119 -0
  103. package/node/third_party/libuv/src/version.c +45 -0
  104. package/node/third_party/llhttp/LICENSE +22 -0
  105. package/node/third_party/llhttp/api.c +509 -0
  106. package/node/third_party/llhttp/http.c +170 -0
  107. package/node/third_party/llhttp/llhttp.c +10099 -0
  108. package/node/third_party/llhttp/llhttp.h +907 -0
  109. package/package.json +25 -4
  110. package/runtime/include/js_atoms.gen.h +68 -0
  111. package/runtime/include/js_atoms.h +54 -0
  112. package/runtime/include/js_bigint.h +93 -0
  113. package/runtime/include/js_buffer.h +79 -0
  114. package/runtime/include/js_builtins.h +168 -0
  115. package/runtime/include/js_console.h +58 -0
  116. package/runtime/include/js_convert.h +22 -0
  117. package/runtime/include/js_core.def +188 -0
  118. package/runtime/include/js_crypto.h +58 -0
  119. package/runtime/include/js_error.h +37 -0
  120. package/runtime/include/js_exception.h +65 -0
  121. package/runtime/include/js_function.h +167 -0
  122. package/runtime/include/js_gc.h +195 -0
  123. package/runtime/include/js_generator.h +96 -0
  124. package/runtime/include/js_host.h +19 -0
  125. package/runtime/include/js_jobs.h +84 -0
  126. package/runtime/include/js_module.h +16 -0
  127. package/runtime/include/js_object.h +384 -0
  128. package/runtime/include/js_ops.h +111 -0
  129. package/runtime/include/js_promise.h +45 -0
  130. package/runtime/include/js_regexp.h +25 -0
  131. package/runtime/include/js_runtime.h +30 -0
  132. package/runtime/include/js_symbol.h +62 -0
  133. package/runtime/include/js_web.h +110 -0
  134. package/runtime/include/jscell.h +48 -0
  135. package/runtime/include/jscontext.h +240 -0
  136. package/runtime/include/jsnum.h +42 -0
  137. package/runtime/include/jsstring.h +161 -0
  138. package/runtime/include/jsvalue.h +142 -0
  139. package/runtime/src/arguments.c +115 -0
  140. package/runtime/src/array.c +1145 -0
  141. package/runtime/src/arraybuffer.c +608 -0
  142. package/runtime/src/async_iter.c +479 -0
  143. package/runtime/src/atoms.c +157 -0
  144. package/runtime/src/base64.c +107 -0
  145. package/runtime/src/bigint.c +1189 -0
  146. package/runtime/src/blob.c +371 -0
  147. package/runtime/src/buffer.c +1357 -0
  148. package/runtime/src/builtin_table.c +100 -0
  149. package/runtime/src/builtins.c +987 -0
  150. package/runtime/src/builtins_util.h +53 -0
  151. package/runtime/src/collections.c +912 -0
  152. package/runtime/src/components.c +28 -0
  153. package/runtime/src/console.c +637 -0
  154. package/runtime/src/convert.c +82 -0
  155. package/runtime/src/core_all.c +21 -0
  156. package/runtime/src/crypto.c +116 -0
  157. package/runtime/src/crypto_asym.c +644 -0
  158. package/runtime/src/crypto_cipher.c +671 -0
  159. package/runtime/src/crypto_hash.c +260 -0
  160. package/runtime/src/crypto_host.c +414 -0
  161. package/runtime/src/crypto_internal.h +304 -0
  162. package/runtime/src/crypto_kdf.c +143 -0
  163. package/runtime/src/crypto_key.c +171 -0
  164. package/runtime/src/crypto_pkey.c +794 -0
  165. package/runtime/src/crypto_subtle.c +1675 -0
  166. package/runtime/src/date.c +940 -0
  167. package/runtime/src/domexception.c +169 -0
  168. package/runtime/src/elements.c +312 -0
  169. package/runtime/src/elements.h +45 -0
  170. package/runtime/src/encoding.c +485 -0
  171. package/runtime/src/error.c +297 -0
  172. package/runtime/src/events.c +793 -0
  173. package/runtime/src/exception.c +56 -0
  174. package/runtime/src/fetch.c +772 -0
  175. package/runtime/src/function.c +530 -0
  176. package/runtime/src/gc.c +803 -0
  177. package/runtime/src/generator.c +218 -0
  178. package/runtime/src/global.c +119 -0
  179. package/runtime/src/headers.c +557 -0
  180. package/runtime/src/inspect.c +1792 -0
  181. package/runtime/src/internal.h +80 -0
  182. package/runtime/src/iterate.c +94 -0
  183. package/runtime/src/iterator.c +409 -0
  184. package/runtime/src/jobs.c +337 -0
  185. package/runtime/src/jsnum.c +353 -0
  186. package/runtime/src/json.c +1028 -0
  187. package/runtime/src/math.c +243 -0
  188. package/runtime/src/module.c +336 -0
  189. package/runtime/src/number.c +176 -0
  190. package/runtime/src/object.c +1265 -0
  191. package/runtime/src/ops.c +322 -0
  192. package/runtime/src/os.c +196 -0
  193. package/runtime/src/os.h +29 -0
  194. package/runtime/src/process.c +432 -0
  195. package/runtime/src/promise.c +721 -0
  196. package/runtime/src/proxy.c +570 -0
  197. package/runtime/src/reflect.c +194 -0
  198. package/runtime/src/regexp.c +1141 -0
  199. package/runtime/src/regexp_anchor.h +34 -0
  200. package/runtime/src/regexp_message.h +32 -0
  201. package/runtime/src/shape.c +294 -0
  202. package/runtime/src/shape.h +46 -0
  203. package/runtime/src/streams.c +1046 -0
  204. package/runtime/src/streams.h +47 -0
  205. package/runtime/src/string.c +364 -0
  206. package/runtime/src/string_builtins.c +837 -0
  207. package/runtime/src/symbol.c +143 -0
  208. package/runtime/src/test_host.c +59 -0
  209. package/runtime/src/typedarray.c +1330 -0
  210. package/runtime/src/tznames.gen.h +712 -0
  211. package/runtime/src/uri.c +169 -0
  212. package/runtime/src/url.c +2116 -0
  213. package/runtime/src/weak.c +486 -0
  214. package/runtime/src/web.c +214 -0
  215. package/runtime/src/wrapper.c +59 -0
  216. package/runtime/src/writable.c +1486 -0
  217. package/runtime/third_party/ada-idna/LICENSE-MIT +18 -0
  218. package/runtime/third_party/ada-idna/README.md +27 -0
  219. package/runtime/third_party/ada-idna/convert.mjs +83 -0
  220. package/runtime/third_party/ada-idna/idna.c +416 -0
  221. package/runtime/third_party/ada-idna/idna.h +15 -0
  222. package/runtime/third_party/ada-idna/idna_tables.h +2657 -0
  223. package/runtime/third_party/bearssl/LICENSE.txt +21 -0
  224. package/runtime/third_party/bearssl/README.txt +136 -0
  225. package/runtime/third_party/bearssl/VERSION +1 -0
  226. package/runtime/third_party/bearssl/inc/bearssl.h +183 -0
  227. package/runtime/third_party/bearssl/inc/bearssl_aead.h +1059 -0
  228. package/runtime/third_party/bearssl/inc/bearssl_block.h +2618 -0
  229. package/runtime/third_party/bearssl/inc/bearssl_ec.h +967 -0
  230. package/runtime/third_party/bearssl/inc/bearssl_hash.h +1346 -0
  231. package/runtime/third_party/bearssl/inc/bearssl_hmac.h +241 -0
  232. package/runtime/third_party/bearssl/inc/bearssl_kdf.h +284 -0
  233. package/runtime/third_party/bearssl/inc/bearssl_pem.h +294 -0
  234. package/runtime/third_party/bearssl/inc/bearssl_prf.h +150 -0
  235. package/runtime/third_party/bearssl/inc/bearssl_rand.h +397 -0
  236. package/runtime/third_party/bearssl/inc/bearssl_rsa.h +1655 -0
  237. package/runtime/third_party/bearssl/inc/bearssl_ssl.h +4296 -0
  238. package/runtime/third_party/bearssl/inc/bearssl_x509.h +1474 -0
  239. package/runtime/third_party/bearssl/src/aead/ccm.c +346 -0
  240. package/runtime/third_party/bearssl/src/aead/eax.c +525 -0
  241. package/runtime/third_party/bearssl/src/aead/gcm.c +318 -0
  242. package/runtime/third_party/bearssl/src/codec/ccopy.c +44 -0
  243. package/runtime/third_party/bearssl/src/codec/dec16be.c +38 -0
  244. package/runtime/third_party/bearssl/src/codec/dec16le.c +38 -0
  245. package/runtime/third_party/bearssl/src/codec/dec32be.c +38 -0
  246. package/runtime/third_party/bearssl/src/codec/dec32le.c +38 -0
  247. package/runtime/third_party/bearssl/src/codec/dec64be.c +38 -0
  248. package/runtime/third_party/bearssl/src/codec/dec64le.c +38 -0
  249. package/runtime/third_party/bearssl/src/codec/enc16be.c +38 -0
  250. package/runtime/third_party/bearssl/src/codec/enc16le.c +38 -0
  251. package/runtime/third_party/bearssl/src/codec/enc32be.c +38 -0
  252. package/runtime/third_party/bearssl/src/codec/enc32le.c +38 -0
  253. package/runtime/third_party/bearssl/src/codec/enc64be.c +38 -0
  254. package/runtime/third_party/bearssl/src/codec/enc64le.c +38 -0
  255. package/runtime/third_party/bearssl/src/codec/pemdec.c +526 -0
  256. package/runtime/third_party/bearssl/src/codec/pemdec.t0 +314 -0
  257. package/runtime/third_party/bearssl/src/codec/pemenc.c +173 -0
  258. package/runtime/third_party/bearssl/src/config.h +247 -0
  259. package/runtime/third_party/bearssl/src/ec/ec_all_m15.c +121 -0
  260. package/runtime/third_party/bearssl/src/ec/ec_all_m31.c +171 -0
  261. package/runtime/third_party/bearssl/src/ec/ec_c25519_i15.c +398 -0
  262. package/runtime/third_party/bearssl/src/ec/ec_c25519_i31.c +390 -0
  263. package/runtime/third_party/bearssl/src/ec/ec_c25519_m15.c +1478 -0
  264. package/runtime/third_party/bearssl/src/ec/ec_c25519_m31.c +800 -0
  265. package/runtime/third_party/bearssl/src/ec/ec_c25519_m62.c +605 -0
  266. package/runtime/third_party/bearssl/src/ec/ec_c25519_m64.c +831 -0
  267. package/runtime/third_party/bearssl/src/ec/ec_curve25519.c +46 -0
  268. package/runtime/third_party/bearssl/src/ec/ec_default.c +36 -0
  269. package/runtime/third_party/bearssl/src/ec/ec_keygen.c +86 -0
  270. package/runtime/third_party/bearssl/src/ec/ec_p256_m15.c +2124 -0
  271. package/runtime/third_party/bearssl/src/ec/ec_p256_m31.c +1469 -0
  272. package/runtime/third_party/bearssl/src/ec/ec_p256_m62.c +1765 -0
  273. package/runtime/third_party/bearssl/src/ec/ec_p256_m64.c +1781 -0
  274. package/runtime/third_party/bearssl/src/ec/ec_prime_i15.c +824 -0
  275. package/runtime/third_party/bearssl/src/ec/ec_prime_i31.c +826 -0
  276. package/runtime/third_party/bearssl/src/ec/ec_pubkey.c +85 -0
  277. package/runtime/third_party/bearssl/src/ec/ec_secp256r1.c +51 -0
  278. package/runtime/third_party/bearssl/src/ec/ec_secp384r1.c +57 -0
  279. package/runtime/third_party/bearssl/src/ec/ec_secp521r1.c +64 -0
  280. package/runtime/third_party/bearssl/src/ec/ecdsa_atr.c +134 -0
  281. package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_asn1.c +36 -0
  282. package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_raw.c +36 -0
  283. package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_asn1.c +36 -0
  284. package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_raw.c +36 -0
  285. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_bits.c +47 -0
  286. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_asn1.c +45 -0
  287. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_raw.c +174 -0
  288. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_asn1.c +48 -0
  289. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_raw.c +166 -0
  290. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_bits.c +47 -0
  291. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_asn1.c +45 -0
  292. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_raw.c +173 -0
  293. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_asn1.c +48 -0
  294. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_raw.c +165 -0
  295. package/runtime/third_party/bearssl/src/ec/ecdsa_rta.c +121 -0
  296. package/runtime/third_party/bearssl/src/hash/dig_oid.c +84 -0
  297. package/runtime/third_party/bearssl/src/hash/dig_size.c +50 -0
  298. package/runtime/third_party/bearssl/src/hash/ghash_ctmul.c +345 -0
  299. package/runtime/third_party/bearssl/src/hash/ghash_ctmul32.c +251 -0
  300. package/runtime/third_party/bearssl/src/hash/ghash_ctmul64.c +154 -0
  301. package/runtime/third_party/bearssl/src/hash/ghash_pclmul.c +389 -0
  302. package/runtime/third_party/bearssl/src/hash/ghash_pwr8.c +411 -0
  303. package/runtime/third_party/bearssl/src/hash/md5.c +208 -0
  304. package/runtime/third_party/bearssl/src/hash/md5sha1.c +141 -0
  305. package/runtime/third_party/bearssl/src/hash/mgf1.c +56 -0
  306. package/runtime/third_party/bearssl/src/hash/multihash.c +166 -0
  307. package/runtime/third_party/bearssl/src/hash/sha1.c +191 -0
  308. package/runtime/third_party/bearssl/src/hash/sha2big.c +285 -0
  309. package/runtime/third_party/bearssl/src/hash/sha2small.c +341 -0
  310. package/runtime/third_party/bearssl/src/inner.h +2577 -0
  311. package/runtime/third_party/bearssl/src/int/i15_add.c +46 -0
  312. package/runtime/third_party/bearssl/src/int/i15_bitlen.c +44 -0
  313. package/runtime/third_party/bearssl/src/int/i15_decmod.c +124 -0
  314. package/runtime/third_party/bearssl/src/int/i15_decode.c +56 -0
  315. package/runtime/third_party/bearssl/src/int/i15_decred.c +100 -0
  316. package/runtime/third_party/bearssl/src/int/i15_encode.c +56 -0
  317. package/runtime/third_party/bearssl/src/int/i15_fmont.c +59 -0
  318. package/runtime/third_party/bearssl/src/int/i15_iszero.c +39 -0
  319. package/runtime/third_party/bearssl/src/int/i15_moddiv.c +465 -0
  320. package/runtime/third_party/bearssl/src/int/i15_modpow.c +50 -0
  321. package/runtime/third_party/bearssl/src/int/i15_modpow2.c +160 -0
  322. package/runtime/third_party/bearssl/src/int/i15_montmul.c +184 -0
  323. package/runtime/third_party/bearssl/src/int/i15_mulacc.c +61 -0
  324. package/runtime/third_party/bearssl/src/int/i15_muladd.c +173 -0
  325. package/runtime/third_party/bearssl/src/int/i15_ninv15.c +38 -0
  326. package/runtime/third_party/bearssl/src/int/i15_reduce.c +66 -0
  327. package/runtime/third_party/bearssl/src/int/i15_rshift.c +47 -0
  328. package/runtime/third_party/bearssl/src/int/i15_sub.c +46 -0
  329. package/runtime/third_party/bearssl/src/int/i15_tmont.c +36 -0
  330. package/runtime/third_party/bearssl/src/int/i31_add.c +46 -0
  331. package/runtime/third_party/bearssl/src/int/i31_bitlen.c +44 -0
  332. package/runtime/third_party/bearssl/src/int/i31_decmod.c +124 -0
  333. package/runtime/third_party/bearssl/src/int/i31_decode.c +57 -0
  334. package/runtime/third_party/bearssl/src/int/i31_decred.c +103 -0
  335. package/runtime/third_party/bearssl/src/int/i31_encode.c +79 -0
  336. package/runtime/third_party/bearssl/src/int/i31_fmont.c +60 -0
  337. package/runtime/third_party/bearssl/src/int/i31_iszero.c +39 -0
  338. package/runtime/third_party/bearssl/src/int/i31_moddiv.c +488 -0
  339. package/runtime/third_party/bearssl/src/int/i31_modpow.c +65 -0
  340. package/runtime/third_party/bearssl/src/int/i31_modpow2.c +160 -0
  341. package/runtime/third_party/bearssl/src/int/i31_montmul.c +127 -0
  342. package/runtime/third_party/bearssl/src/int/i31_mulacc.c +74 -0
  343. package/runtime/third_party/bearssl/src/int/i31_muladd.c +157 -0
  344. package/runtime/third_party/bearssl/src/int/i31_ninv31.c +39 -0
  345. package/runtime/third_party/bearssl/src/int/i31_reduce.c +66 -0
  346. package/runtime/third_party/bearssl/src/int/i31_rshift.c +47 -0
  347. package/runtime/third_party/bearssl/src/int/i31_sub.c +46 -0
  348. package/runtime/third_party/bearssl/src/int/i31_tmont.c +36 -0
  349. package/runtime/third_party/bearssl/src/int/i32_add.c +51 -0
  350. package/runtime/third_party/bearssl/src/int/i32_bitlen.c +44 -0
  351. package/runtime/third_party/bearssl/src/int/i32_decmod.c +77 -0
  352. package/runtime/third_party/bearssl/src/int/i32_decode.c +63 -0
  353. package/runtime/third_party/bearssl/src/int/i32_decred.c +107 -0
  354. package/runtime/third_party/bearssl/src/int/i32_div32.c +56 -0
  355. package/runtime/third_party/bearssl/src/int/i32_encode.c +72 -0
  356. package/runtime/third_party/bearssl/src/int/i32_fmont.c +60 -0
  357. package/runtime/third_party/bearssl/src/int/i32_iszero.c +39 -0
  358. package/runtime/third_party/bearssl/src/int/i32_modpow.c +65 -0
  359. package/runtime/third_party/bearssl/src/int/i32_montmul.c +69 -0
  360. package/runtime/third_party/bearssl/src/int/i32_mulacc.c +56 -0
  361. package/runtime/third_party/bearssl/src/int/i32_muladd.c +138 -0
  362. package/runtime/third_party/bearssl/src/int/i32_ninv32.c +39 -0
  363. package/runtime/third_party/bearssl/src/int/i32_reduce.c +66 -0
  364. package/runtime/third_party/bearssl/src/int/i32_sub.c +51 -0
  365. package/runtime/third_party/bearssl/src/int/i32_tmont.c +36 -0
  366. package/runtime/third_party/bearssl/src/int/i62_modpow2.c +493 -0
  367. package/runtime/third_party/bearssl/src/kdf/hkdf.c +107 -0
  368. package/runtime/third_party/bearssl/src/kdf/shake.c +590 -0
  369. package/runtime/third_party/bearssl/src/mac/hmac.c +122 -0
  370. package/runtime/third_party/bearssl/src/mac/hmac_ct.c +193 -0
  371. package/runtime/third_party/bearssl/src/rand/aesctr_drbg.c +206 -0
  372. package/runtime/third_party/bearssl/src/rand/hmac_drbg.c +157 -0
  373. package/runtime/third_party/bearssl/src/rand/sysrng.c +252 -0
  374. package/runtime/third_party/bearssl/src/rsa/rsa_default_keygen.c +38 -0
  375. package/runtime/third_party/bearssl/src/rsa/rsa_default_modulus.c +36 -0
  376. package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_decrypt.c +38 -0
  377. package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_encrypt.c +38 -0
  378. package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_sign.c +38 -0
  379. package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_vrfy.c +38 -0
  380. package/runtime/third_party/bearssl/src/rsa/rsa_default_priv.c +38 -0
  381. package/runtime/third_party/bearssl/src/rsa/rsa_default_privexp.c +36 -0
  382. package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_sign.c +38 -0
  383. package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_vrfy.c +38 -0
  384. package/runtime/third_party/bearssl/src/rsa/rsa_default_pub.c +38 -0
  385. package/runtime/third_party/bearssl/src/rsa/rsa_default_pubexp.c +36 -0
  386. package/runtime/third_party/bearssl/src/rsa/rsa_i15_keygen.c +583 -0
  387. package/runtime/third_party/bearssl/src/rsa/rsa_i15_modulus.c +99 -0
  388. package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_decrypt.c +41 -0
  389. package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_encrypt.c +44 -0
  390. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_sign.c +37 -0
  391. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_vrfy.c +43 -0
  392. package/runtime/third_party/bearssl/src/rsa/rsa_i15_priv.c +209 -0
  393. package/runtime/third_party/bearssl/src/rsa/rsa_i15_privexp.c +320 -0
  394. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_sign.c +40 -0
  395. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_vrfy.c +44 -0
  396. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pub.c +113 -0
  397. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pubexp.c +152 -0
  398. package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen.c +37 -0
  399. package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen_inner.c +608 -0
  400. package/runtime/third_party/bearssl/src/rsa/rsa_i31_modulus.c +99 -0
  401. package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_decrypt.c +41 -0
  402. package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_encrypt.c +44 -0
  403. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_sign.c +37 -0
  404. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_vrfy.c +43 -0
  405. package/runtime/third_party/bearssl/src/rsa/rsa_i31_priv.c +203 -0
  406. package/runtime/third_party/bearssl/src/rsa/rsa_i31_privexp.c +318 -0
  407. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_sign.c +40 -0
  408. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_vrfy.c +44 -0
  409. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pub.c +106 -0
  410. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pubexp.c +152 -0
  411. package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_decrypt.c +41 -0
  412. package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_encrypt.c +44 -0
  413. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_sign.c +37 -0
  414. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_vrfy.c +43 -0
  415. package/runtime/third_party/bearssl/src/rsa/rsa_i32_priv.c +160 -0
  416. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_sign.c +40 -0
  417. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_vrfy.c +44 -0
  418. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pub.c +77 -0
  419. package/runtime/third_party/bearssl/src/rsa/rsa_i62_keygen.c +57 -0
  420. package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_decrypt.c +61 -0
  421. package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_encrypt.c +64 -0
  422. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_sign.c +57 -0
  423. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_vrfy.c +63 -0
  424. package/runtime/third_party/bearssl/src/rsa/rsa_i62_priv.c +223 -0
  425. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_sign.c +60 -0
  426. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_vrfy.c +64 -0
  427. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pub.c +125 -0
  428. package/runtime/third_party/bearssl/src/rsa/rsa_oaep_pad.c +112 -0
  429. package/runtime/third_party/bearssl/src/rsa/rsa_oaep_unpad.c +145 -0
  430. package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +100 -0
  431. package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_unpad.c +121 -0
  432. package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_pad.c +106 -0
  433. package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_unpad.c +121 -0
  434. package/runtime/third_party/bearssl/src/rsa/rsa_ssl_decrypt.c +52 -0
  435. package/runtime/third_party/bearssl/src/settings.c +306 -0
  436. package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcdec.c +69 -0
  437. package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcenc.c +67 -0
  438. package/runtime/third_party/bearssl/src/symcipher/aes_big_ctr.c +84 -0
  439. package/runtime/third_party/bearssl/src/symcipher/aes_big_ctrcbc.c +142 -0
  440. package/runtime/third_party/bearssl/src/symcipher/aes_big_dec.c +254 -0
  441. package/runtime/third_party/bearssl/src/symcipher/aes_big_enc.c +157 -0
  442. package/runtime/third_party/bearssl/src/symcipher/aes_common.c +112 -0
  443. package/runtime/third_party/bearssl/src/symcipher/aes_ct.c +328 -0
  444. package/runtime/third_party/bearssl/src/symcipher/aes_ct64.c +398 -0
  445. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcdec.c +104 -0
  446. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcenc.c +81 -0
  447. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctr.c +114 -0
  448. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctrcbc.c +433 -0
  449. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_dec.c +159 -0
  450. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_enc.c +115 -0
  451. package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcdec.c +111 -0
  452. package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcenc.c +91 -0
  453. package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctr.c +116 -0
  454. package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctrcbc.c +422 -0
  455. package/runtime/third_party/bearssl/src/symcipher/aes_ct_dec.c +170 -0
  456. package/runtime/third_party/bearssl/src/symcipher/aes_ct_enc.c +112 -0
  457. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8.c +445 -0
  458. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcdec.c +670 -0
  459. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcenc.c +417 -0
  460. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctr.c +717 -0
  461. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctrcbc.c +946 -0
  462. package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcdec.c +69 -0
  463. package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcenc.c +67 -0
  464. package/runtime/third_party/bearssl/src/symcipher/aes_small_ctr.c +84 -0
  465. package/runtime/third_party/bearssl/src/symcipher/aes_small_ctrcbc.c +142 -0
  466. package/runtime/third_party/bearssl/src/symcipher/aes_small_dec.c +176 -0
  467. package/runtime/third_party/bearssl/src/symcipher/aes_small_enc.c +129 -0
  468. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni.c +240 -0
  469. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcdec.c +223 -0
  470. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcenc.c +122 -0
  471. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctr.c +211 -0
  472. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctrcbc.c +596 -0
  473. package/runtime/third_party/bearssl/src/symcipher/chacha20_ct.c +106 -0
  474. package/runtime/third_party/bearssl/src/symcipher/chacha20_sse2.c +237 -0
  475. package/runtime/third_party/bearssl/src/symcipher/des_ct.c +411 -0
  476. package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcdec.c +87 -0
  477. package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcenc.c +69 -0
  478. package/runtime/third_party/bearssl/src/symcipher/des_support.c +166 -0
  479. package/runtime/third_party/bearssl/src/symcipher/des_tab.c +310 -0
  480. package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcdec.c +85 -0
  481. package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcenc.c +67 -0
  482. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul.c +260 -0
  483. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul32.c +297 -0
  484. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmulq.c +475 -0
  485. package/runtime/third_party/bearssl/src/symcipher/poly1305_i15.c +221 -0
  486. package/runtime/third_party/bearssl/src/x509/asn1.t0 +757 -0
  487. package/runtime/third_party/bearssl/src/x509/asn1enc.c +93 -0
  488. package/runtime/third_party/bearssl/src/x509/encode_ec_pk8der.c +110 -0
  489. package/runtime/third_party/bearssl/src/x509/encode_ec_rawder.c +161 -0
  490. package/runtime/third_party/bearssl/src/x509/encode_rsa_pk8der.c +97 -0
  491. package/runtime/third_party/bearssl/src/x509/encode_rsa_rawder.c +96 -0
  492. package/runtime/third_party/bearssl/src/x509/skey_decoder.c +653 -0
  493. package/runtime/third_party/bearssl/src/x509/skey_decoder.t0 +376 -0
  494. package/runtime/third_party/bearssl/src/x509/x509_decoder.c +776 -0
  495. package/runtime/third_party/bearssl/src/x509/x509_decoder.t0 +324 -0
  496. package/runtime/third_party/bearssl/src/x509/x509_knownkey.c +105 -0
  497. package/runtime/third_party/bearssl/src/x509/x509_minimal.c +1722 -0
  498. package/runtime/third_party/bearssl/src/x509/x509_minimal.t0 +1526 -0
  499. package/runtime/third_party/bearssl/src/x509/x509_minimal_full.c +59 -0
  500. package/runtime/third_party/quickjs-dtoa/LICENSE +22 -0
  501. package/runtime/third_party/quickjs-dtoa/README.md +23 -0
  502. package/runtime/third_party/quickjs-dtoa/dtoa.c +1640 -0
  503. package/runtime/third_party/quickjs-dtoa/dtoa.h +83 -0
  504. package/runtime/third_party/quickjs-dtoa/dtoa_compat.h +89 -0
  505. package/runtime/third_party/quickjs-regexp/LICENSE +22 -0
  506. package/runtime/third_party/quickjs-regexp/README.md +22 -0
  507. package/runtime/third_party/quickjs-regexp/cutils.c +641 -0
  508. package/runtime/third_party/quickjs-regexp/cutils.h +457 -0
  509. package/runtime/third_party/quickjs-regexp/libregexp-opcode.h +73 -0
  510. package/runtime/third_party/quickjs-regexp/libregexp.c +3448 -0
  511. package/runtime/third_party/quickjs-regexp/libregexp.h +65 -0
  512. package/runtime/third_party/quickjs-regexp/libunicode-table.h +5206 -0
  513. package/runtime/third_party/quickjs-regexp/libunicode.c +2124 -0
  514. package/runtime/third_party/quickjs-regexp/libunicode.h +196 -0
  515. package/runtime/third_party/v8-ieee754/LICENSE +61 -0
  516. package/runtime/third_party/v8-ieee754/README.md +22 -0
  517. package/runtime/third_party/v8-ieee754/convert.py +84 -0
  518. package/runtime/third_party/v8-ieee754/ieee754.c +3030 -0
  519. package/runtime/third_party/v8-ieee754/ieee754.h +27 -0
  520. package/runtime/tools/regexp_compile.c +90 -0
@@ -0,0 +1,1357 @@
1
+ /* Buffer, the buffer component (ADR 0012, layer 3): Node's global Buffer, in C. As in Node, a
2
+ * Buffer is a Uint8Array whose prototype is Buffer.prototype (which inherits from
3
+ * Uint8Array.prototype), so typed array methods work on it and make Buffers (Buffer is their
4
+ * species constructor). Encodings: utf8 (WHATWG decoding, U+FFFD for each maximal invalid
5
+ * subpart), utf16le/ucs2, latin1/binary, ascii, base64, base64url and hex, with Node's lenient
6
+ * decoding (hex stops at the first invalid pair; base64 skips characters outside both alphabets
7
+ * and stops at '='). The API is Node's, with its errors and its inspection (`<Buffer 68 69>`). */
8
+ #include <math.h>
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+
13
+ #include "builtins_util.h"
14
+ #include "internal.h"
15
+ #include "js_atoms.h"
16
+ #include "js_bigint.h"
17
+ #include "js_buffer.h"
18
+ #include "js_console.h"
19
+ #include "js_convert.h"
20
+ #include "js_exception.h"
21
+ #include "js_ops.h"
22
+ #include "js_web.h"
23
+ #include "jscontext.h"
24
+ #include "jsstring.h"
25
+
26
+ /* A failure's -1, after the call that threw (the throwers' results must be used). */
27
+ static int fail(JSValue thrown) {
28
+ (void)thrown;
29
+ return -1;
30
+ }
31
+
32
+ static JSValue throw_bounds(JSContext *ctx);
33
+
34
+ /* ---- Encodings ------------------------------------------------------------------------------ */
35
+
36
+ typedef enum { ENC_UTF8, ENC_UCS2, ENC_LATIN1, ENC_ASCII, ENC_BASE64, ENC_BASE64URL, ENC_HEX, ENC_INVALID } Encoding;
37
+
38
+ static const struct { const char *name; Encoding enc; } ENCODINGS[] = {
39
+ { "utf8", ENC_UTF8 }, { "utf-8", ENC_UTF8 }, { "ucs2", ENC_UCS2 }, { "ucs-2", ENC_UCS2 },
40
+ { "utf16le", ENC_UCS2 }, { "utf-16le", ENC_UCS2 }, { "latin1", ENC_LATIN1 }, { "binary", ENC_LATIN1 },
41
+ { "ascii", ENC_ASCII }, { "base64", ENC_BASE64 }, { "base64url", ENC_BASE64URL }, { "hex", ENC_HEX },
42
+ };
43
+
44
+ /* An encoding name, ASCII case-insensitively; ENC_INVALID for a non-string or an unknown name. */
45
+ static Encoding encoding_of(JSContext *ctx, JSValue v) {
46
+ if (!js_is_string(v)) return ENC_INVALID;
47
+ JSStrView s = js_string_view(ctx, v);
48
+ for (size_t i = 0; i < JS_COUNTOF(ENCODINGS); i++) {
49
+ size_t n = strlen(ENCODINGS[i].name);
50
+ if (s.length != n) continue;
51
+ size_t k = 0;
52
+ for (; k < n; k++) {
53
+ uint32_t c = js_view_at(s, (uint32_t)k);
54
+ if (c >= 'A' && c <= 'Z') c += 32;
55
+ if (c != (uint8_t)ENCODINGS[i].name[k]) break;
56
+ }
57
+ if (k == n) return ENCODINGS[i].enc;
58
+ }
59
+ return ENC_INVALID;
60
+ }
61
+
62
+ static JSValue throw_unknown_encoding(JSContext *ctx, JSValue v) {
63
+ char s[128] = "";
64
+ JSValue str = js_is_symbol(v) ? JS_UNDEFINED : js_to_string(ctx, v);
65
+ if (js_is_exception(str)) return str;
66
+ if (js_is_string(str)) s[js_view_to_utf8(js_string_view(ctx, str), s, sizeof s - 1)] = '\0';
67
+ return js_throw_node_error(ctx, JS_TYPE_ERROR, "ERR_UNKNOWN_ENCODING", "Unknown encoding: %s", s);
68
+ }
69
+
70
+ /* An optional encoding argument: utf8 when undefined (or null). 0, or -1 with ERR_UNKNOWN_ENCODING. */
71
+ static int encoding_arg(JSContext *ctx, JSValue v, Encoding *out) {
72
+ if (js_is_nullish(v)) {
73
+ *out = ENC_UTF8;
74
+ return 0;
75
+ }
76
+ *out = encoding_of(ctx, v);
77
+ if (*out != ENC_INVALID) return 0;
78
+ return fail(throw_unknown_encoding(ctx, v));
79
+ }
80
+
81
+ typedef struct { /* bytes being built (malloc'd) */
82
+ uint8_t *p;
83
+ size_t n, cap;
84
+ } Bytes;
85
+
86
+ static void bytes_reserve(Bytes *b, size_t more) {
87
+ if (b->n + more <= b->cap) return;
88
+ size_t cap = b->cap ? b->cap : 64;
89
+ while (cap < b->n + more) cap *= 2;
90
+ uint8_t *p = realloc(b->p, cap);
91
+ if (!p) js_fatal("out of memory encoding a Buffer");
92
+ b->p = p;
93
+ b->cap = cap;
94
+ }
95
+
96
+ static void bytes_push(Bytes *b, uint8_t c) {
97
+ bytes_reserve(b, 1);
98
+ b->p[b->n++] = c;
99
+ }
100
+
101
+ static int hex_digit(uint32_t c) {
102
+ if (c >= '0' && c <= '9') return (int)(c - '0');
103
+ if ((c | 32) >= 'a' && (c | 32) <= 'f') return (int)((c | 32) - 'a' + 10);
104
+ return -1;
105
+ }
106
+
107
+ static int base64_value(uint32_t c) {
108
+ if (c >= 'A' && c <= 'Z') return (int)(c - 'A');
109
+ if (c >= 'a' && c <= 'z') return (int)(c - 'a' + 26);
110
+ if (c >= '0' && c <= '9') return (int)(c - '0' + 52);
111
+ if (c == '+' || c == '-') return 62;
112
+ if (c == '/' || c == '_') return 63;
113
+ return -1;
114
+ }
115
+
116
+ /* A string's bytes in an encoding (Node's StringBytes::Write). */
117
+ static void encode_string(JSContext *ctx, JSValue s, Encoding enc, Bytes *out) {
118
+ JSStrView v = js_string_view(ctx, s);
119
+ switch (enc) {
120
+ case ENC_UTF8: {
121
+ size_t n = js_view_to_utf8(v, NULL, 0);
122
+ bytes_reserve(out, n);
123
+ out->n += js_view_to_utf8(v, (char *)out->p + out->n, n);
124
+ break;
125
+ }
126
+ case ENC_UCS2:
127
+ bytes_reserve(out, (size_t)v.length * 2);
128
+ for (uint32_t i = 0; i < v.length; i++) {
129
+ uint32_t c = js_view_at(v, i);
130
+ out->p[out->n++] = (uint8_t)c;
131
+ out->p[out->n++] = (uint8_t)(c >> 8);
132
+ }
133
+ break;
134
+ case ENC_LATIN1:
135
+ case ENC_ASCII:
136
+ bytes_reserve(out, v.length);
137
+ for (uint32_t i = 0; i < v.length; i++) out->p[out->n++] = (uint8_t)js_view_at(v, i);
138
+ break;
139
+ case ENC_HEX:
140
+ bytes_reserve(out, v.length / 2);
141
+ for (uint32_t i = 0; i + 1 < v.length; i += 2) {
142
+ int hi = hex_digit(js_view_at(v, i)), lo = hex_digit(js_view_at(v, i + 1));
143
+ if (hi < 0 || lo < 0) break;
144
+ out->p[out->n++] = (uint8_t)(hi << 4 | lo);
145
+ }
146
+ break;
147
+ case ENC_BASE64:
148
+ case ENC_BASE64URL: {
149
+ bytes_reserve(out, (size_t)v.length * 3 / 4 + 3);
150
+ uint32_t acc = 0;
151
+ int bits = 0;
152
+ for (uint32_t i = 0; i < v.length; i++) {
153
+ uint32_t c = js_view_at(v, i);
154
+ if (c == '=') break;
155
+ int d = base64_value(c);
156
+ if (d < 0) continue;
157
+ acc = acc << 6 | (uint32_t)d;
158
+ bits += 6;
159
+ if (bits >= 8) {
160
+ bits -= 8;
161
+ out->p[out->n++] = (uint8_t)(acc >> bits);
162
+ }
163
+ }
164
+ break;
165
+ }
166
+ case ENC_INVALID:
167
+ break;
168
+ }
169
+ }
170
+
171
+ /* Buffer.byteLength's count, without encoding: base64's is Node's estimate from the length. */
172
+ static size_t encoded_length(JSContext *ctx, JSValue s, Encoding enc) {
173
+ JSStrView v = js_string_view(ctx, s);
174
+ switch (enc) {
175
+ case ENC_UTF8: return js_view_to_utf8(v, NULL, 0);
176
+ case ENC_UCS2: return (size_t)v.length * 2;
177
+ case ENC_HEX: return v.length >> 1;
178
+ case ENC_BASE64:
179
+ case ENC_BASE64URL: {
180
+ size_t n = v.length;
181
+ if (n && js_view_at(v, (uint32_t)n - 1) == '=') n--;
182
+ if (n && js_view_at(v, (uint32_t)n - 1) == '=') n--;
183
+ return n * 3 >> 2;
184
+ }
185
+ default: return v.length;
186
+ }
187
+ }
188
+
189
+ static const char HEX[] = "0123456789abcdef";
190
+ static const char B64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
191
+ static const char B64URL[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
192
+
193
+ /* Bytes to a string in an encoding (Node's StringBytes::Encode). */
194
+ static JSValue decode_bytes(JSContext *ctx, const uint8_t *p, size_t n, Encoding enc) {
195
+ if (n > (size_t)JS_STRING_MAX_LENGTH) return js_throw_node_error(ctx, JS_ERROR, "ERR_STRING_TOO_LONG", "Cannot create a string longer than 0x1fffffe8 characters");
196
+ switch (enc) {
197
+ case ENC_UTF8: return js_decode_utf8_bytes(ctx, p, n);
198
+ case ENC_LATIN1: return js_new_string_latin1(ctx, p, (uint32_t)n);
199
+ case ENC_ASCII: {
200
+ uint8_t *s = malloc(n ? n : 1);
201
+ if (!s) js_fatal("out of memory decoding a Buffer");
202
+ for (size_t i = 0; i < n; i++) s[i] = p[i] & 0x7F;
203
+ JSValue r = js_new_string_latin1(ctx, s, (uint32_t)n);
204
+ free(s);
205
+ return r;
206
+ }
207
+ case ENC_UCS2: {
208
+ size_t units = n / 2;
209
+ uint16_t *s = malloc((units ? units : 1) * sizeof *s);
210
+ if (!s) js_fatal("out of memory decoding a Buffer");
211
+ for (size_t i = 0; i < units; i++) s[i] = (uint16_t)(p[2 * i] | p[2 * i + 1] << 8);
212
+ JSValue r = js_new_string_utf16(ctx, s, (uint32_t)units);
213
+ free(s);
214
+ return r;
215
+ }
216
+ case ENC_HEX: {
217
+ uint8_t *s = malloc(n * 2 + 1);
218
+ if (!s) js_fatal("out of memory decoding a Buffer");
219
+ for (size_t i = 0; i < n; i++) s[2 * i] = (uint8_t)HEX[p[i] >> 4], s[2 * i + 1] = (uint8_t)HEX[p[i] & 15];
220
+ JSValue r = js_new_string_latin1(ctx, s, (uint32_t)(n * 2));
221
+ free(s);
222
+ return r;
223
+ }
224
+ case ENC_BASE64:
225
+ case ENC_BASE64URL: {
226
+ const char *alphabet = enc == ENC_BASE64 ? B64 : B64URL;
227
+ uint8_t *s = malloc((n + 2) / 3 * 4 + 1);
228
+ if (!s) js_fatal("out of memory decoding a Buffer");
229
+ size_t o = 0, i = 0;
230
+ for (; i + 2 < n; i += 3) {
231
+ uint32_t v = (uint32_t)p[i] << 16 | (uint32_t)p[i + 1] << 8 | p[i + 2];
232
+ s[o++] = (uint8_t)alphabet[v >> 18], s[o++] = (uint8_t)alphabet[(v >> 12) & 63];
233
+ s[o++] = (uint8_t)alphabet[(v >> 6) & 63], s[o++] = (uint8_t)alphabet[v & 63];
234
+ }
235
+ if (i < n) {
236
+ uint32_t v = (uint32_t)p[i] << 16 | (i + 1 < n ? (uint32_t)p[i + 1] << 8 : 0);
237
+ s[o++] = (uint8_t)alphabet[v >> 18], s[o++] = (uint8_t)alphabet[(v >> 12) & 63];
238
+ if (i + 1 < n) s[o++] = (uint8_t)alphabet[(v >> 6) & 63];
239
+ else if (enc == ENC_BASE64) s[o++] = '=';
240
+ if (enc == ENC_BASE64) s[o++] = '=';
241
+ }
242
+ JSValue r = js_new_string_latin1(ctx, s, (uint32_t)o);
243
+ free(s);
244
+ return r;
245
+ }
246
+ case ENC_INVALID: break;
247
+ }
248
+ return js_empty_string();
249
+ }
250
+
251
+ /* ---- Buffers -------------------------------------------------------------------------------- */
252
+
253
+ static JSValue buffer_ctor_fn(JSContext *ctx) { return ctx->intrinsics[JS_INTRINSIC_BUFFER]; }
254
+ static JSValue uint8_array_ctor(JSContext *ctx) { return ctx->intrinsics[JS_INTRINSIC_TYPED_ARRAY_CTORS + JS_TA_UINT8]; }
255
+
256
+ /* A new zeroed Buffer of n bytes. */
257
+ static JSValue new_buffer(JSContext *ctx, size_t n) {
258
+ JSValue arg = js_number((double)n);
259
+ return js_construct(ctx, uint8_array_ctor(ctx), 1, &arg, buffer_ctor_fn(ctx), "Buffer");
260
+ }
261
+
262
+ /* A Buffer over an ArrayBuffer's bytes (shared). */
263
+ static JSValue new_view(JSContext *ctx, JSValue array_buffer, size_t offset, size_t length) {
264
+ JSValue args[3] = { array_buffer, js_number((double)offset), js_number((double)length) };
265
+ return js_construct(ctx, uint8_array_ctor(ctx), 3, args, buffer_ctor_fn(ctx), "Buffer");
266
+ }
267
+
268
+ /* A new Buffer holding a copy of the bytes. */
269
+ static JSValue buffer_of_bytes(JSContext *ctx, const uint8_t *p, size_t n) {
270
+ JSValue b = new_buffer(ctx, n);
271
+ if (js_is_exception(b)) return b;
272
+ uint8_t *data;
273
+ size_t len;
274
+ js_buffer_source_bytes(b, &data, &len);
275
+ if (n) memcpy(data, p, n);
276
+ return b;
277
+ }
278
+
279
+ static bool is_typed_array(JSValue v) {
280
+ return js_is_object(v) && strcmp(js_as_object(v)->shape->cls->name, "TypedArray") == 0;
281
+ }
282
+
283
+ /* A Uint8Array (a Buffer included): its bytes. */
284
+ static bool u8_bytes(JSValue v, uint8_t **p, size_t *n) {
285
+ if (!js_is_uint8_array(v)) return false;
286
+ js_buffer_source_bytes(v, p, n);
287
+ return true;
288
+ }
289
+
290
+ static JSTypedArray *as_ta(JSValue v) { return (JSTypedArray *)js_as_object(v); }
291
+
292
+ static JSValue throw_not_u8(JSContext *ctx, const char *name, JSValue v) {
293
+ return js_throw_invalid_arg_type(ctx, name, "an instance of Buffer or Uint8Array", v);
294
+ }
295
+
296
+ /* The receiver as a Uint8Array: Node's methods work on any. */
297
+ #define THIS_BYTES() \
298
+ uint8_t *data; \
299
+ size_t len; \
300
+ if (!u8_bytes(this_val, &data, &len)) \
301
+ return js_throw_type_error(ctx, "argument must be a buffer")
302
+
303
+ static JSValue buffer_from_string(JSContext *ctx, JSValue s, JSValue encoding) {
304
+ Encoding enc;
305
+ if (encoding_arg(ctx, encoding, &enc) < 0) return JS_EXCEPTION;
306
+ Bytes b = { 0 };
307
+ encode_string(ctx, s, enc, &b);
308
+ JSValue r = buffer_of_bytes(ctx, b.p, b.n);
309
+ free(b.p);
310
+ return r;
311
+ }
312
+
313
+ /* An array-like's elements, each ToNumber'd and taken modulo 256 (Uint8Array's conversion). */
314
+ static JSValue buffer_from_array_like(JSContext *ctx, JSValue o) {
315
+ JSValue lv = js_get_value(ctx, o, JS_ATOM(length));
316
+ if (js_is_exception(lv)) return lv;
317
+ double n;
318
+ if (js_to_number(ctx, &n, lv) < 0) return JS_EXCEPTION;
319
+ n = isnan(n) || n < 0 ? 0 : floor(n);
320
+ JSValue b = new_buffer(ctx, (size_t)n);
321
+ if (js_is_exception(b)) return b;
322
+ for (size_t i = 0; i < (size_t)n; i++) {
323
+ JSValue v = js_get_elem(ctx, o, js_number((double)i));
324
+ if (js_is_exception(v)) return v;
325
+ double d;
326
+ if (js_to_number(ctx, &d, v) < 0) return JS_EXCEPTION;
327
+ uint8_t *data;
328
+ size_t len;
329
+ js_buffer_source_bytes(b, &data, &len);
330
+ if (i < len) data[i] = (uint8_t)(isfinite(d) ? (int64_t)fmod(trunc(d), 256.0) : 0);
331
+ }
332
+ return b;
333
+ }
334
+
335
+ static JSValue from_value(JSContext *ctx, JSValue value, JSValue enc_or_offset, JSValue length);
336
+
337
+ static JSValue throw_from_type(JSContext *ctx, JSValue v) {
338
+ char received[256];
339
+ js_node_received(ctx, v, received, sizeof received);
340
+ return js_throw_node_error(ctx, JS_TYPE_ERROR, "ERR_INVALID_ARG_TYPE",
341
+ "The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object.%s", received);
342
+ }
343
+
344
+ /* Buffer.from(arrayBuffer, byteOffset, length): a view, as Node checks it. */
345
+ static JSValue from_array_buffer(JSContext *ctx, JSValue ab, JSValue offset_arg, JSValue length_arg) {
346
+ size_t max = js_as_array_buffer(ab)->byte_length;
347
+ double offset = 0;
348
+ if (!js_is_undefined(offset_arg)) {
349
+ if (js_to_number(ctx, &offset, offset_arg) < 0) return JS_EXCEPTION;
350
+ offset = isnan(offset) ? 0 : trunc(offset);
351
+ if (offset < 0 || offset > (double)max)
352
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_BUFFER_OUT_OF_BOUNDS", "\"offset\" is outside of buffer bounds");
353
+ }
354
+ double length = (double)max - offset;
355
+ if (!js_is_undefined(length_arg)) {
356
+ if (js_to_number(ctx, &length, length_arg) < 0) return JS_EXCEPTION;
357
+ length = isnan(length) || length < 0 ? 0 : trunc(length);
358
+ if (length > (double)max - offset)
359
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_BUFFER_OUT_OF_BOUNDS", "\"length\" is outside of buffer bounds");
360
+ }
361
+ return new_view(ctx, ab, (size_t)offset, (size_t)length);
362
+ }
363
+
364
+ static JSValue from_value(JSContext *ctx, JSValue value, JSValue enc_or_offset, JSValue length) {
365
+ if (js_is_string(value)) return buffer_from_string(ctx, value, enc_or_offset);
366
+ if (!js_is_object(value)) return throw_from_type(ctx, value);
367
+ if (js_is_array_buffer(value) || strcmp(js_as_object(value)->shape->cls->name, "SharedArrayBuffer") == 0)
368
+ return from_array_buffer(ctx, value, enc_or_offset, length);
369
+ uint8_t *p;
370
+ size_t n;
371
+ if (u8_bytes(value, &p, &n)) return buffer_of_bytes(ctx, p, n);
372
+ if (is_typed_array(value)) return buffer_from_array_like(ctx, value);
373
+ /* an object whose valueOf gives something else: that (Node's `new String("x")`, say) */
374
+ JSValue value_of = js_get_value(ctx, value, JS_ATOM(valueOf));
375
+ if (js_is_exception(value_of)) return value_of;
376
+ if (js_is_callable(value_of)) {
377
+ JSValue prim = js_call(ctx, value_of, value, 0, NULL);
378
+ if (js_is_exception(prim)) return prim;
379
+ if (!js_is_nullish(prim) && !js_strict_equals(ctx, prim, value)) return from_value(ctx, prim, enc_or_offset, length);
380
+ }
381
+ JSValue lv = js_get_value(ctx, value, JS_ATOM(length));
382
+ if (js_is_exception(lv)) return lv;
383
+ if (!js_is_undefined(lv)) return buffer_from_array_like(ctx, value);
384
+ /* { type: 'Buffer', data: [...] }, what toJSON makes */
385
+ JSValue type = js_get_value(ctx, value, js_atom_from_cstr(ctx, "type"));
386
+ if (js_is_exception(type)) return type;
387
+ if (js_is_string(type) && js_string_equals(ctx, type, js_new_string_cstr(ctx, "Buffer"))) {
388
+ JSValue data = js_get_value(ctx, value, js_atom_from_cstr(ctx, "data"));
389
+ if (js_is_exception(data)) return data;
390
+ if (js_is_array(data)) return buffer_from_array_like(ctx, data);
391
+ }
392
+ JSValue prim_key = JS_SYMBOL(toPrimitive);
393
+ JSValue to_prim = js_get_value(ctx, value, prim_key);
394
+ if (js_is_exception(to_prim)) return to_prim;
395
+ if (js_is_callable(to_prim)) {
396
+ JSValue hint = js_new_string_cstr(ctx, "string");
397
+ JSValue prim = js_call(ctx, to_prim, value, 1, &hint);
398
+ if (js_is_exception(prim)) return prim;
399
+ if (js_is_string(prim)) return buffer_from_string(ctx, prim, enc_or_offset);
400
+ }
401
+ return throw_from_type(ctx, value);
402
+ }
403
+
404
+ /* ---- Statics -------------------------------------------------------------------------------- */
405
+
406
+ /* Buffer(arg, encodingOrOffset, length), with or without new (deprecated in Node, still works) */
407
+ BUILTIN(buffer_ctor) {
408
+ (void)callee, (void)this_val, (void)new_target;
409
+ if (js_is_number(ARG(0))) {
410
+ double n = js_as_number(ARG(0));
411
+ if (!(n >= 0 && n <= JS_MAX_SAFE_INTEGER)) {
412
+ char received[64];
413
+ js_describe_value(ctx, ARG(0), received, sizeof received);
414
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE",
415
+ "The value of \"size\" is out of range. It must be >= 0 && <= 9007199254740991. Received %s", received);
416
+ }
417
+ return new_buffer(ctx, (size_t)n);
418
+ }
419
+ return from_value(ctx, ARG(0), ARG(1), ARG(2));
420
+ }
421
+
422
+ BUILTIN(buffer_from) {
423
+ UNUSED_ARGS;
424
+ return from_value(ctx, ARG(0), ARG(1), ARG(2));
425
+ }
426
+
427
+ /* Node's size check for alloc and allocUnsafe. 0, or -1. */
428
+ static int size_arg(JSContext *ctx, JSValue v, size_t *out) {
429
+ if (!js_is_number(v)) return fail(js_throw_invalid_arg_type(ctx, "size", "of type number", v));
430
+ double n = js_as_number(v);
431
+ if (!(n >= 0 && n <= JS_MAX_SAFE_INTEGER)) {
432
+ char received[64];
433
+ js_describe_value(ctx, v, received, sizeof received);
434
+ return fail(js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE",
435
+ "The value of \"size\" is out of range. It must be >= 0 && <= 9007199254740991. Received %s", received));
436
+ }
437
+ *out = (size_t)n;
438
+ return 0;
439
+ }
440
+
441
+ static int fill_bytes(JSContext *ctx, uint8_t *data, size_t start, size_t end, JSValue value, JSValue encoding);
442
+
443
+ BUILTIN(buffer_alloc) {
444
+ UNUSED_ARGS;
445
+ size_t n;
446
+ if (size_arg(ctx, ARG(0), &n) < 0) return JS_EXCEPTION;
447
+ JSValue b = new_buffer(ctx, n);
448
+ if (js_is_exception(b) || js_is_undefined(ARG(1)) || (js_is_number(ARG(1)) && js_as_number(ARG(1)) == 0)) return b;
449
+ uint8_t *data;
450
+ size_t len;
451
+ js_buffer_source_bytes(b, &data, &len);
452
+ return fill_bytes(ctx, data, 0, len, ARG(1), ARG(2)) < 0 ? JS_EXCEPTION : b;
453
+ }
454
+
455
+ BUILTIN(buffer_alloc_unsafe) {
456
+ UNUSED_ARGS;
457
+ size_t n;
458
+ if (size_arg(ctx, ARG(0), &n) < 0) return JS_EXCEPTION;
459
+ return new_buffer(ctx, n);
460
+ }
461
+
462
+ BUILTIN(buffer_is_buffer) {
463
+ UNUSED_ARGS;
464
+ if (!js_is_object(ARG(0))) return JS_FALSE;
465
+ JSValue r = js_instanceof(ctx, ARG(0), buffer_ctor_fn(ctx));
466
+ return js_is_exception(r) ? r : r;
467
+ }
468
+
469
+ BUILTIN(buffer_is_encoding) {
470
+ UNUSED_ARGS;
471
+ return js_bool(encoding_of(ctx, ARG(0)) != ENC_INVALID);
472
+ }
473
+
474
+ BUILTIN(buffer_byte_length) {
475
+ UNUSED_ARGS;
476
+ JSValue s = ARG(0);
477
+ if (!js_is_string(s)) {
478
+ uint8_t *p;
479
+ size_t n;
480
+ if (js_buffer_source_bytes(s, &p, &n) || (js_is_object(s) && strcmp(js_as_object(s)->shape->cls->name, "SharedArrayBuffer") == 0))
481
+ return js_number((double)n);
482
+ return js_throw_invalid_arg_type(ctx, "string", "of type string or an instance of Buffer or ArrayBuffer", s);
483
+ }
484
+ Encoding enc = js_is_nullish(ARG(1)) ? ENC_UTF8 : encoding_of(ctx, ARG(1));
485
+ if (enc == ENC_INVALID) enc = ENC_UTF8; /* Node: an unknown encoding counts as utf8 */
486
+ return js_number((double)encoded_length(ctx, s, enc));
487
+ }
488
+
489
+ static int compare_bytes(const uint8_t *a, size_t an, const uint8_t *b, size_t bn) {
490
+ size_t n = an < bn ? an : bn;
491
+ int c = n ? memcmp(a, b, n) : 0;
492
+ if (c) return c < 0 ? -1 : 1;
493
+ return an < bn ? -1 : an > bn ? 1 : 0;
494
+ }
495
+
496
+ BUILTIN(buffer_compare_static) {
497
+ UNUSED_ARGS;
498
+ uint8_t *a, *b;
499
+ size_t an, bn;
500
+ if (!u8_bytes(ARG(0), &a, &an)) return throw_not_u8(ctx, "buf1", ARG(0));
501
+ if (!u8_bytes(ARG(1), &b, &bn)) return throw_not_u8(ctx, "buf2", ARG(1));
502
+ return js_int32(compare_bytes(a, an, b, bn));
503
+ }
504
+
505
+ BUILTIN(buffer_concat) {
506
+ UNUSED_ARGS;
507
+ JSValue list = ARG(0);
508
+ if (!js_is_array(list)) return js_throw_invalid_arg_type(ctx, "list", "an instance of Array", list);
509
+ uint32_t count = js_array_length(js_as_object(list));
510
+ double total = 0;
511
+ for (uint32_t i = 0; i < count; i++) {
512
+ JSValue item = js_get_elem(ctx, list, js_int32((int32_t)i));
513
+ if (js_is_exception(item)) return item;
514
+ uint8_t *p;
515
+ size_t n;
516
+ if (!u8_bytes(item, &p, &n)) {
517
+ char name[32];
518
+ snprintf(name, sizeof name, "list[%u]", i);
519
+ return throw_not_u8(ctx, name, item);
520
+ }
521
+ total += (double)n;
522
+ }
523
+ if (!js_is_undefined(ARG(1))) {
524
+ if (!js_is_number(ARG(1))) return js_throw_invalid_arg_type(ctx, "length", "of type number", ARG(1));
525
+ double t = js_as_number(ARG(1));
526
+ total = isnan(t) || t < 0 ? 0 : trunc(t);
527
+ }
528
+ JSValue result = new_buffer(ctx, (size_t)total);
529
+ if (js_is_exception(result)) return result;
530
+ uint8_t *out;
531
+ size_t cap, at = 0;
532
+ js_buffer_source_bytes(result, &out, &cap);
533
+ for (uint32_t i = 0; i < count && at < cap; i++) {
534
+ JSValue item = js_get_elem(ctx, list, js_int32((int32_t)i));
535
+ if (js_is_exception(item)) return item;
536
+ uint8_t *p;
537
+ size_t n;
538
+ if (!u8_bytes(item, &p, &n)) continue;
539
+ if (n > cap - at) n = cap - at;
540
+ if (n) memcpy(out + at, p, n);
541
+ at += n;
542
+ }
543
+ return result;
544
+ }
545
+
546
+ BUILTIN(buffer_of) {
547
+ UNUSED_ARGS;
548
+ JSValue b = new_buffer(ctx, argc);
549
+ if (js_is_exception(b)) return b;
550
+ for (uint32_t i = 0; i < argc; i++) {
551
+ double d;
552
+ if (js_to_number(ctx, &d, argv[i]) < 0) return JS_EXCEPTION;
553
+ uint8_t *data;
554
+ size_t len;
555
+ js_buffer_source_bytes(b, &data, &len);
556
+ data[i] = (uint8_t)(isfinite(d) ? (int64_t)fmod(trunc(d), 256.0) : 0);
557
+ }
558
+ return b;
559
+ }
560
+
561
+ /* Buffer.copyBytesFrom(view, offset, length): a copy of a typed array's elements' bytes */
562
+ BUILTIN(buffer_copy_bytes_from) {
563
+ UNUSED_ARGS;
564
+ JSValue view = ARG(0);
565
+ if (!is_typed_array(view)) return js_throw_invalid_arg_type(ctx, "view", "an instance of TypedArray", view);
566
+ uint8_t *p;
567
+ size_t n;
568
+ js_buffer_source_bytes(view, &p, &n);
569
+ size_t count = as_ta(view)->length, size = count ? n / count : 1;
570
+ double offset = 0, length = (double)count;
571
+ if (!js_is_undefined(ARG(1)) && js_to_number(ctx, &offset, ARG(1)) < 0) return JS_EXCEPTION;
572
+ if (!js_is_undefined(ARG(2)) && js_to_number(ctx, &length, ARG(2)) < 0) return JS_EXCEPTION;
573
+ offset = isnan(offset) || offset < 0 ? 0 : trunc(offset);
574
+ if (offset >= (double)count) return new_buffer(ctx, 0);
575
+ length = isnan(length) || length < 0 ? 0 : trunc(length);
576
+ if (length > (double)count - offset) length = (double)count - offset;
577
+ return buffer_of_bytes(ctx, p + (size_t)offset * size, (size_t)length * size);
578
+ }
579
+
580
+ /* ---- Prototype ------------------------------------------------------------------------------ */
581
+
582
+ /* A relative position like Node's slice start/end (negative counts from the end), clamped to [0, len]. */
583
+ static int position(JSContext *ctx, JSValue v, size_t len, size_t dflt, size_t *out) {
584
+ if (js_is_undefined(v)) {
585
+ *out = dflt;
586
+ return 0;
587
+ }
588
+ double d;
589
+ if (js_to_number(ctx, &d, v) < 0) return -1;
590
+ d = isnan(d) ? 0 : trunc(d);
591
+ if (d < 0) d += (double)len;
592
+ *out = d < 0 ? 0 : d > (double)len ? len : (size_t)d;
593
+ return 0;
594
+ }
595
+
596
+ /* toString(encoding = 'utf8', start = 0, end = length) */
597
+ BUILTIN(buffer_to_string) {
598
+ UNUSED_ARGS;
599
+ THIS_BYTES();
600
+ if (argc == 0) return js_decode_utf8_bytes(ctx, data, len);
601
+ double start = 0, end = (double)len;
602
+ if (!js_is_undefined(ARG(1))) {
603
+ if (js_to_number(ctx, &start, ARG(1)) < 0) return JS_EXCEPTION;
604
+ start = isnan(start) || start <= 0 ? 0 : trunc(start);
605
+ if (start >= (double)len) return js_empty_string();
606
+ }
607
+ if (!js_is_undefined(ARG(2))) {
608
+ if (js_to_number(ctx, &end, ARG(2)) < 0) return JS_EXCEPTION;
609
+ end = isnan(end) ? 0 : end > (double)len ? (double)len : trunc(end);
610
+ }
611
+ if (end <= start) return js_empty_string();
612
+ Encoding enc = ENC_UTF8;
613
+ if (!js_is_undefined(ARG(0))) {
614
+ enc = encoding_of(ctx, ARG(0));
615
+ if (enc == ENC_INVALID) return throw_unknown_encoding(ctx, ARG(0));
616
+ }
617
+ u8_bytes(this_val, &data, &len); /* ToNumber ran user code */
618
+ if ((size_t)end > len) end = (double)len;
619
+ if ((size_t)start >= (size_t)end) return js_empty_string();
620
+ return decode_bytes(ctx, data + (size_t)start, (size_t)end - (size_t)start, enc);
621
+ }
622
+
623
+ /* the encoding-specific slices: buf.utf8Slice(start, end), … */
624
+ static JSValue slice_as(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, Encoding enc) {
625
+ THIS_BYTES();
626
+ size_t start, end;
627
+ if (position(ctx, ARG(0), len, 0, &start) < 0 || position(ctx, ARG(1), len, len, &end) < 0) return JS_EXCEPTION;
628
+ u8_bytes(this_val, &data, &len);
629
+ if (end > len) end = len;
630
+ return start >= end ? js_empty_string() : decode_bytes(ctx, data + start, end - start, enc);
631
+ }
632
+
633
+ #define SLICE(fn, enc) \
634
+ BUILTIN(fn) { \
635
+ (void)callee, (void)new_target; \
636
+ return slice_as(ctx, this_val, argc, argv, enc); \
637
+ }
638
+ SLICE(buffer_utf8_slice, ENC_UTF8)
639
+ SLICE(buffer_ucs2_slice, ENC_UCS2)
640
+ SLICE(buffer_latin1_slice, ENC_LATIN1)
641
+ SLICE(buffer_ascii_slice, ENC_ASCII)
642
+ SLICE(buffer_base64_slice, ENC_BASE64)
643
+ SLICE(buffer_base64url_slice, ENC_BASE64URL)
644
+ SLICE(buffer_hex_slice, ENC_HEX)
645
+
646
+ BUILTIN(buffer_equals) {
647
+ UNUSED_ARGS;
648
+ THIS_BYTES();
649
+ uint8_t *p;
650
+ size_t n;
651
+ if (!u8_bytes(ARG(0), &p, &n)) return throw_not_u8(ctx, "otherBuffer", ARG(0));
652
+ return js_bool(n == len && (n == 0 || memcmp(p, data, n) == 0));
653
+ }
654
+
655
+ /* An offset argument of compare and copy: an integer in [0, max], else ERR_OUT_OF_RANGE. */
656
+ static int range_arg(JSContext *ctx, JSValue v, const char *name, size_t dflt, size_t max, size_t *out) {
657
+ if (js_is_undefined(v)) {
658
+ *out = dflt;
659
+ return 0;
660
+ }
661
+ if (!js_is_number(v)) return fail(js_throw_invalid_arg_type(ctx, name, "of type number", v));
662
+ double d = js_as_number(v);
663
+ if (!(d >= 0 && d <= (double)max) || d != trunc(d)) {
664
+ char received[64];
665
+ js_describe_value(ctx, v, received, sizeof received);
666
+ JSValue e = d != trunc(d) && isfinite(d)
667
+ ? js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE", "The value of \"%s\" is out of range. It must be an integer. Received %s", name, received)
668
+ : js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE", "The value of \"%s\" is out of range. It must be >= 0 and <= %zu. Received %s", name, max, received);
669
+ return fail(e);
670
+ }
671
+ *out = (size_t)d;
672
+ return 0;
673
+ }
674
+
675
+ /* compare(target, targetStart, targetEnd, sourceStart, sourceEnd) */
676
+ BUILTIN(buffer_compare) {
677
+ UNUSED_ARGS;
678
+ THIS_BYTES();
679
+ uint8_t *p;
680
+ size_t n;
681
+ if (!u8_bytes(ARG(0), &p, &n)) return throw_not_u8(ctx, "target", ARG(0));
682
+ size_t ts, te, ss, se;
683
+ if (range_arg(ctx, ARG(1), "targetStart", 0, n, &ts) < 0 || range_arg(ctx, ARG(2), "targetEnd", n, n, &te) < 0 ||
684
+ range_arg(ctx, ARG(3), "sourceStart", 0, len, &ss) < 0 || range_arg(ctx, ARG(4), "sourceEnd", len, len, &se) < 0)
685
+ return JS_EXCEPTION;
686
+ if (ss >= se) return js_int32(ts >= te ? 0 : -1);
687
+ if (ts >= te) return js_int32(1);
688
+ return js_int32(compare_bytes(data + ss, se - ss, p + ts, te - ts));
689
+ }
690
+
691
+ /* copy(target, targetStart = 0, sourceStart = 0, sourceEnd = length): the bytes copied */
692
+ BUILTIN(buffer_copy) {
693
+ UNUSED_ARGS;
694
+ THIS_BYTES();
695
+ uint8_t *p;
696
+ size_t n;
697
+ if (!u8_bytes(ARG(0), &p, &n) && !is_typed_array(ARG(0)))
698
+ return js_throw_invalid_arg_type(ctx, "target", "an instance of Buffer or Uint8Array", ARG(0));
699
+ if (!js_is_uint8_array(ARG(0))) js_buffer_source_bytes(ARG(0), &p, &n);
700
+ double ts = 0, ss = 0, se = (double)len;
701
+ if (!js_is_undefined(ARG(1)) && js_to_number(ctx, &ts, ARG(1)) < 0) return JS_EXCEPTION;
702
+ if (!js_is_undefined(ARG(2)) && js_to_number(ctx, &ss, ARG(2)) < 0) return JS_EXCEPTION;
703
+ if (!js_is_undefined(ARG(3)) && js_to_number(ctx, &se, ARG(3)) < 0) return JS_EXCEPTION;
704
+ ts = isnan(ts) ? 0 : trunc(ts), ss = isnan(ss) ? 0 : trunc(ss), se = isnan(se) ? 0 : trunc(se);
705
+ if (ts < 0) return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE", "The value of \"targetStart\" is out of range. It must be >= 0. Received %g", ts);
706
+ if (ss < 0 || ss > (double)len)
707
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE", "The value of \"sourceStart\" is out of range. It must be >= 0 && <= %zu. Received %g", len, ss);
708
+ if (se < 0) return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE", "The value of \"sourceEnd\" is out of range. It must be >= 0. Received %g", se);
709
+ if (se > (double)len) se = (double)len;
710
+ if (ts >= (double)n || ss >= se) return js_int32(0);
711
+ size_t count = (size_t)(se - ss);
712
+ if (count > n - (size_t)ts) count = n - (size_t)ts;
713
+ memmove(p + (size_t)ts, data + (size_t)ss, count);
714
+ return js_number((double)count);
715
+ }
716
+
717
+ /* How many bytes of a UTF-8 encoding fit in `room` without splitting a character. */
718
+ static size_t utf8_fit(const uint8_t *p, size_t n, size_t room) {
719
+ if (n <= room) return n;
720
+ size_t k = room;
721
+ while (k > 0 && (p[k] & 0xC0) == 0x80) k--;
722
+ return k;
723
+ }
724
+
725
+ /* Writes a string's bytes at offset; at most `max` of them, whole UTF-8/UCS-2 characters only. */
726
+ static size_t write_string(JSContext *ctx, uint8_t *data, size_t room, JSValue s, Encoding enc) {
727
+ Bytes b = { 0 };
728
+ encode_string(ctx, s, enc, &b);
729
+ size_t n = b.n;
730
+ if (enc == ENC_UTF8) n = utf8_fit(b.p, b.n, room);
731
+ else if (n > room) n = enc == ENC_UCS2 ? room & ~(size_t)1 : room;
732
+ if (n) memcpy(data, b.p, n);
733
+ free(b.p);
734
+ return n;
735
+ }
736
+
737
+ /* write(string, offset = 0, length = buffer.length - offset, encoding = 'utf8'), with Node's
738
+ * overloads: write(string, encoding), write(string, offset, encoding) */
739
+ BUILTIN(buffer_write) {
740
+ UNUSED_ARGS;
741
+ THIS_BYTES();
742
+ if (!js_is_string(ARG(0))) return js_throw_node_error(ctx, JS_TYPE_ERROR, "ERR_INVALID_ARG_TYPE", "argument must be a string");
743
+ JSValue offset_arg = ARG(1), length_arg = ARG(2), enc_arg = ARG(3);
744
+ if (js_is_string(offset_arg)) enc_arg = offset_arg, offset_arg = JS_UNDEFINED, length_arg = JS_UNDEFINED;
745
+ else if (js_is_string(length_arg)) enc_arg = length_arg, length_arg = JS_UNDEFINED;
746
+ size_t offset, length;
747
+ if (range_arg(ctx, offset_arg, "offset", 0, len, &offset) < 0) return JS_EXCEPTION;
748
+ if (range_arg(ctx, length_arg, "length", len - offset, len, &length) < 0) return JS_EXCEPTION;
749
+ if (length > len - offset) length = len - offset;
750
+ Encoding enc;
751
+ if (encoding_arg(ctx, enc_arg, &enc) < 0) return JS_EXCEPTION;
752
+ return js_number((double)write_string(ctx, data + offset, length, ARG(0), enc));
753
+ }
754
+
755
+ static JSValue write_as(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, Encoding enc) {
756
+ THIS_BYTES();
757
+ if (!js_is_string(ARG(0))) return js_throw_node_error(ctx, JS_TYPE_ERROR, "ERR_INVALID_ARG_TYPE", "argument must be a string");
758
+ size_t offset, length;
759
+ if (range_arg(ctx, ARG(1), "offset", 0, len, &offset) < 0) return JS_EXCEPTION;
760
+ if (range_arg(ctx, ARG(2), "length", len - offset, len, &length) < 0) return JS_EXCEPTION;
761
+ if (length > len - offset) length = len - offset;
762
+ return js_number((double)write_string(ctx, data + offset, length, ARG(0), enc));
763
+ }
764
+
765
+ #define WRITE(fn, enc) \
766
+ BUILTIN(fn) { \
767
+ (void)callee, (void)new_target; \
768
+ return write_as(ctx, this_val, argc, argv, enc); \
769
+ }
770
+ WRITE(buffer_utf8_write, ENC_UTF8)
771
+ WRITE(buffer_ucs2_write, ENC_UCS2)
772
+ WRITE(buffer_latin1_write, ENC_LATIN1)
773
+ WRITE(buffer_ascii_write, ENC_ASCII)
774
+ WRITE(buffer_base64_write, ENC_BASE64)
775
+ WRITE(buffer_base64url_write, ENC_BASE64URL)
776
+ WRITE(buffer_hex_write, ENC_HEX)
777
+
778
+ /* Fills data[start, end) with a value repeated: a string (encoded), a number (& 255), bytes. */
779
+ static int fill_bytes(JSContext *ctx, uint8_t *data, size_t start, size_t end, JSValue value, JSValue encoding) {
780
+ if (start >= end) return 0;
781
+ if (js_is_string(value)) {
782
+ Encoding enc;
783
+ if (encoding_arg(ctx, encoding, &enc) < 0) return -1;
784
+ Bytes b = { 0 };
785
+ encode_string(ctx, value, enc, &b);
786
+ if (b.n == 0) {
787
+ free(b.p);
788
+ if (js_string_length(value) == 0) {
789
+ memset(data + start, 0, end - start);
790
+ return 0;
791
+ }
792
+ return fail(js_throw_node_error(ctx, JS_TYPE_ERROR, "ERR_INVALID_ARG_VALUE",
793
+ "The argument 'value' is invalid. Received '%s'", "…"));
794
+ }
795
+ for (size_t i = start; i < end; i++) data[i] = b.p[(i - start) % b.n];
796
+ free(b.p);
797
+ return 0;
798
+ }
799
+ uint8_t *p;
800
+ size_t n;
801
+ if (u8_bytes(value, &p, &n)) {
802
+ if (n == 0) return fail(js_throw_node_error(ctx, JS_TYPE_ERROR, "ERR_INVALID_ARG_VALUE", "The argument 'value' is invalid. Received Uint8Array(0) []"));
803
+ uint8_t *copy = malloc(n);
804
+ if (!copy) js_fatal("out of memory filling a Buffer");
805
+ memcpy(copy, p, n);
806
+ for (size_t i = start; i < end; i++) data[i] = copy[(i - start) % n];
807
+ free(copy);
808
+ return 0;
809
+ }
810
+ double d = 0;
811
+ if (js_is_bool(value)) d = js_truthy(value);
812
+ else if (js_to_number(ctx, &d, value) < 0) return -1;
813
+ memset(data + start, isfinite(d) ? (int)((int64_t)trunc(d) & 255) : 0, end - start);
814
+ return 0;
815
+ }
816
+
817
+ /* fill(value, offset = 0, end = length, encoding), with fill(value, encoding) */
818
+ BUILTIN(buffer_fill) {
819
+ UNUSED_ARGS;
820
+ THIS_BYTES();
821
+ JSValue offset_arg = ARG(1), end_arg = ARG(2), enc_arg = ARG(3);
822
+ if (js_is_string(offset_arg)) enc_arg = offset_arg, offset_arg = JS_UNDEFINED, end_arg = JS_UNDEFINED;
823
+ else if (js_is_string(end_arg)) enc_arg = end_arg, end_arg = JS_UNDEFINED;
824
+ size_t start, end;
825
+ if (range_arg(ctx, offset_arg, "offset", 0, len, &start) < 0 || range_arg(ctx, end_arg, "end", len, len, &end) < 0)
826
+ return JS_EXCEPTION;
827
+ return fill_bytes(ctx, data, start, end, ARG(0), enc_arg) < 0 ? JS_EXCEPTION : this_val;
828
+ }
829
+
830
+ /* indexOf / lastIndexOf / includes: a string (encoded), a number (a byte) or bytes */
831
+ static JSValue search(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, int kind) {
832
+ THIS_BYTES();
833
+ JSValue value = ARG(0), offset_arg = ARG(1), enc_arg = ARG(2);
834
+ if (js_is_string(offset_arg)) enc_arg = offset_arg, offset_arg = JS_UNDEFINED;
835
+ bool last = kind == 1;
836
+ double offset = last ? (double)len : 0;
837
+ if (!js_is_undefined(offset_arg)) {
838
+ if (js_to_number(ctx, &offset, offset_arg) < 0) return JS_EXCEPTION;
839
+ if (isnan(offset)) offset = last ? (double)len : 0; /* Node: NaN searches the whole buffer */
840
+ offset = trunc(offset);
841
+ }
842
+ if (offset < 0) offset += (double)len;
843
+ Bytes needle = { 0 };
844
+ if (js_is_string(value)) {
845
+ Encoding enc;
846
+ if (encoding_arg(ctx, enc_arg, &enc) < 0) return JS_EXCEPTION;
847
+ encode_string(ctx, value, enc, &needle);
848
+ } else if (js_is_number(value)) {
849
+ double d = js_as_number(value);
850
+ bytes_push(&needle, (uint8_t)(isfinite(d) ? (int64_t)trunc(d) & 255 : 0));
851
+ } else {
852
+ uint8_t *p;
853
+ size_t n;
854
+ if (!u8_bytes(value, &p, &n))
855
+ return js_throw_invalid_arg_type(ctx, "value", "one of type number or string or an instance of Buffer or Uint8Array", value);
856
+ bytes_reserve(&needle, n);
857
+ if (n) memcpy(needle.p, p, n);
858
+ needle.n = n;
859
+ }
860
+ u8_bytes(this_val, &data, &len);
861
+ double found = -1;
862
+ if (!last) {
863
+ if (offset < 0) offset = 0;
864
+ if (needle.n == 0) found = offset < (double)len ? offset : (double)len;
865
+ else
866
+ for (size_t i = (size_t)offset; offset < (double)len && i + needle.n <= len; i++)
867
+ if (memcmp(data + i, needle.p, needle.n) == 0) {
868
+ found = (double)i;
869
+ break;
870
+ }
871
+ } else if (offset >= 0) {
872
+ if (needle.n == 0) found = offset < (double)len ? offset : (double)len;
873
+ else if (needle.n <= len) {
874
+ size_t i = offset > (double)(len - needle.n) ? len - needle.n : (size_t)offset;
875
+ for (;; i--) {
876
+ if (memcmp(data + i, needle.p, needle.n) == 0) {
877
+ found = (double)i;
878
+ break;
879
+ }
880
+ if (i == 0) break;
881
+ }
882
+ }
883
+ }
884
+ free(needle.p);
885
+ return kind == 2 ? js_bool(found >= 0) : js_number(found);
886
+ }
887
+
888
+ BUILTIN(buffer_index_of) {
889
+ (void)callee, (void)new_target;
890
+ return search(ctx, this_val, argc, argv, 0);
891
+ }
892
+ BUILTIN(buffer_last_index_of) {
893
+ (void)callee, (void)new_target;
894
+ return search(ctx, this_val, argc, argv, 1);
895
+ }
896
+ BUILTIN(buffer_includes) {
897
+ (void)callee, (void)new_target;
898
+ return search(ctx, this_val, argc, argv, 2);
899
+ }
900
+
901
+ BUILTIN(buffer_to_json) {
902
+ UNUSED_ARGS;
903
+ THIS_BYTES();
904
+ JSValue arr = js_new_array(ctx, (uint32_t)len);
905
+ for (size_t i = 0; i < len; i++)
906
+ if (js_array_push(ctx, js_as_object(arr), js_int32(data[i])) < 0) return JS_EXCEPTION;
907
+ JSValue o = js_new_object(ctx);
908
+ js_define_data(ctx, js_as_object(o), js_atom_from_cstr(ctx, "type"), js_new_string_cstr(ctx, "Buffer"), JS_PROP_DEFAULT);
909
+ js_define_data(ctx, js_as_object(o), js_atom_from_cstr(ctx, "data"), arr, JS_PROP_DEFAULT);
910
+ return o;
911
+ }
912
+
913
+ /* subarray(start, end) and slice(start, end): Buffers sharing the memory */
914
+ BUILTIN(buffer_subarray) {
915
+ UNUSED_ARGS;
916
+ THIS_BYTES();
917
+ size_t start, end;
918
+ if (position(ctx, ARG(0), len, 0, &start) < 0 || position(ctx, ARG(1), len, len, &end) < 0) return JS_EXCEPTION;
919
+ if (end < start) end = start;
920
+ JSTypedArray *ta = as_ta(this_val);
921
+ return new_view(ctx, ta->buffer, ta->byte_offset + start, end - start);
922
+ }
923
+
924
+ static JSValue swap(JSContext *ctx, JSValue this_val, size_t width) {
925
+ THIS_BYTES();
926
+ if (len % width) return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_INVALID_BUFFER_SIZE", "Buffer size must be a multiple of %zu-bits", width * 8);
927
+ for (size_t i = 0; i < len; i += width)
928
+ for (size_t a = 0, b = width - 1; a < b; a++, b--) {
929
+ uint8_t t = data[i + a];
930
+ data[i + a] = data[i + b];
931
+ data[i + b] = t;
932
+ }
933
+ return this_val;
934
+ }
935
+
936
+ BUILTIN(buffer_swap16) {
937
+ UNUSED_ARGS;
938
+ return swap(ctx, this_val, 2);
939
+ }
940
+ BUILTIN(buffer_swap32) {
941
+ UNUSED_ARGS;
942
+ return swap(ctx, this_val, 4);
943
+ }
944
+ BUILTIN(buffer_swap64) {
945
+ UNUSED_ARGS;
946
+ return swap(ctx, this_val, 8);
947
+ }
948
+
949
+ BUILTIN(buffer_parent) {
950
+ UNUSED_ARGS;
951
+ return is_typed_array(this_val) ? as_ta(this_val)->buffer : JS_UNDEFINED;
952
+ }
953
+
954
+ BUILTIN(buffer_offset) {
955
+ UNUSED_ARGS;
956
+ return is_typed_array(this_val) ? js_number((double)as_ta(this_val)->byte_offset) : JS_UNDEFINED;
957
+ }
958
+
959
+ /* ---- Numbers: the reads and writes ------------------------------------------------------------------ */
960
+
961
+ static JSValue throw_bounds(JSContext *ctx) {
962
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_BUFFER_OUT_OF_BOUNDS", "Attempt to access memory outside buffer bounds");
963
+ }
964
+
965
+ /* The offset of a read or write of `size` bytes (Node's validateNumber/boundsError). 0, or -1. */
966
+ static int access_offset(JSContext *ctx, JSValue v, size_t len, size_t size, size_t *out) {
967
+ if (js_is_undefined(v)) v = js_int32(0);
968
+ if (!js_is_number(v)) return fail(js_throw_invalid_arg_type(ctx, "offset", "of type number", v));
969
+ double d = js_as_number(v);
970
+ if (d != trunc(d) || isnan(d)) {
971
+ char received[64];
972
+ js_describe_value(ctx, v, received, sizeof received);
973
+ return fail(js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE",
974
+ "The value of \"offset\" is out of range. It must be an integer. Received %s", received));
975
+ }
976
+ if (len < size) return fail(throw_bounds(ctx));
977
+ if (d < 0 || d > (double)(len - size)) {
978
+ char received[64];
979
+ js_describe_value(ctx, v, received, sizeof received);
980
+ return fail(js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE",
981
+ "The value of \"offset\" is out of range. It must be >= 0 and <= %zu. Received %s", len - size, received));
982
+ }
983
+ *out = (size_t)d;
984
+ return 0;
985
+ }
986
+
987
+ enum { INT_LE = 0, INT_BE = 1 };
988
+
989
+ static uint64_t load_uint(const uint8_t *p, size_t size, int order) {
990
+ uint64_t v = 0;
991
+ for (size_t i = 0; i < size; i++) v |= (uint64_t)p[order == INT_LE ? i : size - 1 - i] << (8 * i);
992
+ return v;
993
+ }
994
+
995
+ static void store_uint(uint8_t *p, size_t size, int order, uint64_t v) {
996
+ for (size_t i = 0; i < size; i++) p[order == INT_LE ? i : size - 1 - i] = (uint8_t)(v >> (8 * i));
997
+ }
998
+
999
+ /* the read: size bytes (1-6), order, signedness; `variable`: the size is argument 1 (readUIntLE) */
1000
+ static JSValue read_int(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, size_t size, int order, bool is_signed, bool variable) {
1001
+ THIS_BYTES();
1002
+ if (variable) {
1003
+ if (!js_is_number(ARG(1))) return js_throw_invalid_arg_type(ctx, "byteLength", "of type number", ARG(1));
1004
+ double b = js_as_number(ARG(1));
1005
+ if (!(b >= 1 && b <= 6) || b != trunc(b)) {
1006
+ char received[64];
1007
+ js_describe_value(ctx, ARG(1), received, sizeof received);
1008
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE",
1009
+ "The value of \"byteLength\" is out of range. It must be >= 1 and <= 6. Received %s", received);
1010
+ }
1011
+ size = (size_t)b;
1012
+ }
1013
+ size_t offset;
1014
+ if (access_offset(ctx, ARG(0), len, size, &offset) < 0) return JS_EXCEPTION;
1015
+ uint64_t v = load_uint(data + offset, size, order);
1016
+ if (is_signed && size < 8 && (v >> (8 * size - 1)) & 1) return js_number((double)(int64_t)(v | ~((UINT64_C(1) << (8 * size)) - 1)));
1017
+ return js_number((double)v);
1018
+ }
1019
+
1020
+ /* the write: value checked against the type's range, as Node checks it */
1021
+ static JSValue write_int(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, size_t size, int order, bool is_signed, bool variable) {
1022
+ THIS_BYTES();
1023
+ if (variable) {
1024
+ if (!js_is_number(ARG(2))) return js_throw_invalid_arg_type(ctx, "byteLength", "of type number", ARG(2));
1025
+ double b = js_as_number(ARG(2));
1026
+ if (!(b >= 1 && b <= 6) || b != trunc(b)) {
1027
+ char received[64];
1028
+ js_describe_value(ctx, ARG(2), received, sizeof received);
1029
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE",
1030
+ "The value of \"byteLength\" is out of range. It must be >= 1 and <= 6. Received %s", received);
1031
+ }
1032
+ size = (size_t)b;
1033
+ }
1034
+ double v;
1035
+ if (js_to_number(ctx, &v, ARG(0)) < 0) return JS_EXCEPTION;
1036
+ double min = is_signed ? -ldexp(1, (int)(8 * size - 1)) : 0;
1037
+ double max = is_signed ? ldexp(1, (int)(8 * size - 1)) - 1 : ldexp(1, (int)(8 * size)) - 1;
1038
+ size_t offset;
1039
+ if (access_offset(ctx, ARG(1), len, size, &offset) < 0) return JS_EXCEPTION;
1040
+ if (!(v >= min && v <= max)) {
1041
+ char range[160], received[64];
1042
+ if (size > 4) {
1043
+ if (is_signed) snprintf(range, sizeof range, ">= -(2 ** %zu) and < 2 ** %zu", 8 * size - 1, 8 * size - 1);
1044
+ else snprintf(range, sizeof range, ">= 0 and < 2 ** %zu", 8 * size);
1045
+ } else {
1046
+ snprintf(range, sizeof range, ">= %.0f and <= %.0f", min, max);
1047
+ }
1048
+ js_describe_value(ctx, js_number(v), received, sizeof received);
1049
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE", "The value of \"value\" is out of range. It must be %s. Received %s", range, received);
1050
+ }
1051
+ u8_bytes(this_val, &data, &len);
1052
+ store_uint(data + offset, size, order, (uint64_t)(int64_t)trunc(v));
1053
+ return js_number((double)(offset + size));
1054
+ }
1055
+
1056
+ #define READ(fn, size, order, sign, variable) \
1057
+ BUILTIN(fn) { \
1058
+ (void)callee, (void)new_target; \
1059
+ return read_int(ctx, this_val, argc, argv, size, order, sign, variable); \
1060
+ }
1061
+ #define WRITE_INT(fn, size, order, sign, variable) \
1062
+ BUILTIN(fn) { \
1063
+ (void)callee, (void)new_target; \
1064
+ return write_int(ctx, this_val, argc, argv, size, order, sign, variable); \
1065
+ }
1066
+ READ(read_uint8, 1, INT_LE, false, false)
1067
+ READ(read_uint16le, 2, INT_LE, false, false)
1068
+ READ(read_uint16be, 2, INT_BE, false, false)
1069
+ READ(read_uint32le, 4, INT_LE, false, false)
1070
+ READ(read_uint32be, 4, INT_BE, false, false)
1071
+ READ(read_uintle, 0, INT_LE, false, true)
1072
+ READ(read_uintbe, 0, INT_BE, false, true)
1073
+ READ(read_int8, 1, INT_LE, true, false)
1074
+ READ(read_int16le, 2, INT_LE, true, false)
1075
+ READ(read_int16be, 2, INT_BE, true, false)
1076
+ READ(read_int32le, 4, INT_LE, true, false)
1077
+ READ(read_int32be, 4, INT_BE, true, false)
1078
+ READ(read_intle, 0, INT_LE, true, true)
1079
+ READ(read_intbe, 0, INT_BE, true, true)
1080
+ WRITE_INT(write_uint8, 1, INT_LE, false, false)
1081
+ WRITE_INT(write_uint16le, 2, INT_LE, false, false)
1082
+ WRITE_INT(write_uint16be, 2, INT_BE, false, false)
1083
+ WRITE_INT(write_uint32le, 4, INT_LE, false, false)
1084
+ WRITE_INT(write_uint32be, 4, INT_BE, false, false)
1085
+ WRITE_INT(write_uintle, 0, INT_LE, false, true)
1086
+ WRITE_INT(write_uintbe, 0, INT_BE, false, true)
1087
+ WRITE_INT(write_int8, 1, INT_LE, true, false)
1088
+ WRITE_INT(write_int16le, 2, INT_LE, true, false)
1089
+ WRITE_INT(write_int16be, 2, INT_BE, true, false)
1090
+ WRITE_INT(write_int32le, 4, INT_LE, true, false)
1091
+ WRITE_INT(write_int32be, 4, INT_BE, true, false)
1092
+ WRITE_INT(write_intle, 0, INT_LE, true, true)
1093
+ WRITE_INT(write_intbe, 0, INT_BE, true, true)
1094
+
1095
+ /* floats and doubles */
1096
+ static JSValue read_float(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, size_t size, int order) {
1097
+ THIS_BYTES();
1098
+ size_t offset;
1099
+ if (access_offset(ctx, ARG(0), len, size, &offset) < 0) return JS_EXCEPTION;
1100
+ uint64_t bits = load_uint(data + offset, size, order);
1101
+ if (size == 4) {
1102
+ uint32_t b32 = (uint32_t)bits;
1103
+ float f;
1104
+ memcpy(&f, &b32, 4);
1105
+ return js_number((double)f);
1106
+ }
1107
+ double d;
1108
+ memcpy(&d, &bits, 8);
1109
+ return js_number(d);
1110
+ }
1111
+
1112
+ static JSValue write_float(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, size_t size, int order) {
1113
+ THIS_BYTES();
1114
+ double v;
1115
+ if (js_to_number(ctx, &v, ARG(0)) < 0) return JS_EXCEPTION;
1116
+ size_t offset;
1117
+ if (access_offset(ctx, ARG(1), len, size, &offset) < 0) return JS_EXCEPTION;
1118
+ uint64_t bits;
1119
+ if (size == 4) {
1120
+ float f = (float)v;
1121
+ uint32_t b32;
1122
+ memcpy(&b32, &f, 4);
1123
+ bits = b32;
1124
+ } else {
1125
+ memcpy(&bits, &v, 8);
1126
+ }
1127
+ u8_bytes(this_val, &data, &len);
1128
+ store_uint(data + offset, size, order, bits);
1129
+ return js_number((double)(offset + size));
1130
+ }
1131
+
1132
+ #define FLOAT(fn, wfn, size, order) \
1133
+ BUILTIN(fn) { \
1134
+ (void)callee, (void)new_target; \
1135
+ return read_float(ctx, this_val, argc, argv, size, order); \
1136
+ } \
1137
+ BUILTIN(wfn) { \
1138
+ (void)callee, (void)new_target; \
1139
+ return write_float(ctx, this_val, argc, argv, size, order); \
1140
+ }
1141
+ FLOAT(read_floatle, write_floatle, 4, INT_LE)
1142
+ FLOAT(read_floatbe, write_floatbe, 4, INT_BE)
1143
+ FLOAT(read_doublele, write_doublele, 8, INT_LE)
1144
+ FLOAT(read_doublebe, write_doublebe, 8, INT_BE)
1145
+
1146
+ /* the BigInt reads and writes: the bigint component is installed when a program names them */
1147
+ static JSValue read_big(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, int order, bool is_signed) {
1148
+ THIS_BYTES();
1149
+ if (!ctx->rt->bigint) return js_throw_type_error(ctx, "BigInt is not available");
1150
+ size_t offset;
1151
+ if (access_offset(ctx, ARG(0), len, 8, &offset) < 0) return JS_EXCEPTION;
1152
+ uint64_t v = load_uint(data + offset, 8, order);
1153
+ return is_signed ? ctx->rt->bigint->from_int64(ctx, (int64_t)v) : ctx->rt->bigint->from_uint64(ctx, v);
1154
+ }
1155
+
1156
+ static JSValue write_big(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, int order, bool is_signed) {
1157
+ THIS_BYTES();
1158
+ if (!ctx->rt->bigint) return js_throw_type_error(ctx, "BigInt is not available");
1159
+ JSValue v = ARG(0);
1160
+ if (!js_is_bigint(v)) return js_throw_invalid_arg_type(ctx, "value", "of type bigint", v);
1161
+ JSValue lo = is_signed ? ctx->rt->bigint->from_int64(ctx, INT64_MIN) : ctx->rt->bigint->from_uint64(ctx, 0);
1162
+ JSValue hi = is_signed ? ctx->rt->bigint->from_int64(ctx, INT64_MAX) : ctx->rt->bigint->from_uint64(ctx, UINT64_MAX);
1163
+ if (ctx->rt->bigint->compare(ctx, v, lo) < 0 || ctx->rt->bigint->compare(ctx, v, hi) > 0) {
1164
+ JSValue s = ctx->rt->bigint->to_string(ctx, v, 10);
1165
+ char received[96] = "";
1166
+ if (js_is_string(s)) received[js_view_to_utf8(js_string_view(ctx, s), received, sizeof received - 1)] = '\0';
1167
+ return js_throw_node_error(ctx, JS_RANGE_ERROR, "ERR_OUT_OF_RANGE", "The value of \"value\" is out of range. It must be %s. Received %sn",
1168
+ is_signed ? ">= -(2n ** 63n) and < 2n ** 63n" : ">= 0n and < 2n ** 64n", received);
1169
+ }
1170
+ size_t offset;
1171
+ if (access_offset(ctx, ARG(1), len, 8, &offset) < 0) return JS_EXCEPTION;
1172
+ store_uint(data + offset, 8, order, ctx->rt->bigint->to_uint64(v));
1173
+ return js_number((double)(offset + 8));
1174
+ }
1175
+
1176
+ #define BIG(fn, wfn, order, sign) \
1177
+ BUILTIN(fn) { \
1178
+ (void)callee, (void)new_target; \
1179
+ return read_big(ctx, this_val, argc, argv, order, sign); \
1180
+ } \
1181
+ BUILTIN(wfn) { \
1182
+ (void)callee, (void)new_target; \
1183
+ return write_big(ctx, this_val, argc, argv, order, sign); \
1184
+ }
1185
+ BIG(read_big_uint64le, write_big_uint64le, INT_LE, false)
1186
+ BIG(read_big_uint64be, write_big_uint64be, INT_BE, false)
1187
+ BIG(read_big_int64le, write_big_int64le, INT_LE, true)
1188
+ BIG(read_big_int64be, write_big_int64be, INT_BE, true)
1189
+
1190
+ /* ---- Inspection ----------------------------------------------------------------------------- */
1191
+
1192
+ /* `<Buffer 68 69>`: at most 50 bytes, then ` ... n more bytes`, then the own enumerable
1193
+ * non-index properties (`<Buffer 61, foo: 1>`) */
1194
+ BUILTIN(buffer_inspect) {
1195
+ UNUSED_ARGS;
1196
+ THIS_BYTES();
1197
+ char name[128] = "Buffer";
1198
+ JSValue c = js_get_value(ctx, this_val, JS_ATOM(constructor));
1199
+ if (js_is_exception(c)) return c;
1200
+ if (js_is_object(c)) {
1201
+ JSValue n = js_get_value(ctx, c, JS_ATOM(name));
1202
+ if (js_is_exception(n)) return n;
1203
+ if (js_is_string(n)) name[js_view_to_utf8(js_string_view(ctx, n), name, sizeof name - 1)] = '\0';
1204
+ }
1205
+ size_t shown = len < 50 ? len : 50;
1206
+ char *s = malloc(strlen(name) + shown * 3 + 64);
1207
+ if (!s) js_fatal("out of memory inspecting a Buffer");
1208
+ size_t o = (size_t)sprintf(s, "<%s ", name);
1209
+ for (size_t i = 0; i < shown; i++) {
1210
+ if (i) s[o++] = ' ';
1211
+ s[o++] = HEX[data[i] >> 4];
1212
+ s[o++] = HEX[data[i] & 15];
1213
+ }
1214
+ if (len > 50) o += (size_t)sprintf(s + o, " ... %zu more byte%s", len - 50, len - 50 > 1 ? "s" : "");
1215
+ s[o] = '\0';
1216
+ JSValue r = js_new_string_cstr(ctx, s);
1217
+ free(s);
1218
+ if (js_is_exception(r)) return r;
1219
+ /* the extras: inspected as a null-prototype object, without its braces */
1220
+ JSValue keys = js_get_own_enumerable_string_keys(ctx, this_val);
1221
+ if (js_is_exception(keys)) return keys;
1222
+ JSValue extras = js_new_object_proto(ctx, JS_NULL, 4);
1223
+ bool any = false;
1224
+ for (uint32_t i = 0; i < js_array_length(js_as_object(keys)); i++) {
1225
+ JSValue k = js_get_elem(ctx, keys, js_int32((int32_t)i));
1226
+ if (js_is_exception(k)) return k;
1227
+ JSStrView kv = js_string_view(ctx, k);
1228
+ bool index = kv.length > 0;
1229
+ for (uint32_t j = 0; j < kv.length && index; j++) index = js_view_at(kv, j) >= '0' && js_view_at(kv, j) <= '9';
1230
+ if (index) continue;
1231
+ JSValue v = js_get_value(ctx, this_val, js_to_property_key(ctx, k));
1232
+ if (js_is_exception(v)) return v;
1233
+ js_define_data(ctx, js_as_object(extras), js_to_property_key(ctx, k), v, JS_PROP_DEFAULT);
1234
+ any = true;
1235
+ }
1236
+ if (any) {
1237
+ JSInspectOptions opts = js_inspect_defaults;
1238
+ if (js_is_object(ARG(1)) && js_inspect_options_from(ctx, ARG(1), &opts) < 0) return JS_EXCEPTION;
1239
+ opts.break_length = INFINITY;
1240
+ opts.compact = -1;
1241
+ JSValue e = js_inspect_with(ctx, extras, &opts);
1242
+ if (js_is_exception(e)) return e;
1243
+ uint32_t el = js_string_length(e);
1244
+ if (el > 29) {
1245
+ JSValue sep = js_new_string_cstr(ctx, len ? ", " : "");
1246
+ r = js_concat(ctx, js_concat(ctx, r, sep), js_substring(ctx, e, 27, el - 2));
1247
+ if (js_is_exception(r)) return r;
1248
+ }
1249
+ }
1250
+ return js_concat(ctx, r, js_new_string_cstr(ctx, ">"));
1251
+ }
1252
+
1253
+ /* ---- C callers ------------------------------------------------------------------------------ */
1254
+
1255
+ JSValue js_new_buffer_from_bytes(JSContext *ctx, const uint8_t *p, size_t n) { return buffer_of_bytes(ctx, p, n); }
1256
+
1257
+ /* ---- Realm ---------------------------------------------------------------------------------- */
1258
+
1259
+ #define FN(name, fn, length) JS_BUILTIN_FN(name, fn, length)
1260
+
1261
+ /* Node assigns them, so they're enumerable (safer-buffer copies them with for-in) */
1262
+ #define STATIC(name, fn, length) \
1263
+ { (name), NULL, JS_BUILTIN_KIND_FN, JS_BUILTIN_METHOD_ATTRS | JS_PROP_ENUMERABLE, (length), (fn), NULL, 0, NULL }
1264
+
1265
+ static const JSBuiltin buffer_statics[] = {
1266
+ JS_BUILTIN_NUMBER("poolSize", 8192, JS_PROP_DEFAULT),
1267
+ STATIC("from", buffer_from, 3),
1268
+ STATIC("copyBytesFrom", buffer_copy_bytes_from, 3),
1269
+ STATIC("of", buffer_of, 0),
1270
+ STATIC("alloc", buffer_alloc, 3),
1271
+ STATIC("allocUnsafe", buffer_alloc_unsafe, 1),
1272
+ STATIC("allocUnsafeSlow", buffer_alloc_unsafe, 1),
1273
+ STATIC("isBuffer", buffer_is_buffer, 1),
1274
+ STATIC("compare", buffer_compare_static, 2),
1275
+ STATIC("isEncoding", buffer_is_encoding, 1),
1276
+ STATIC("concat", buffer_concat, 2),
1277
+ STATIC("byteLength", buffer_byte_length, 2),
1278
+ };
1279
+
1280
+ static const JSBuiltin buffer_proto[] = {
1281
+ FN("readBigUInt64LE", read_big_uint64le, 0), FN("readBigUInt64BE", read_big_uint64be, 0),
1282
+ JS_BUILTIN_ALIAS("readBigUint64LE", "readBigUInt64LE"), JS_BUILTIN_ALIAS("readBigUint64BE", "readBigUInt64BE"),
1283
+ FN("readBigInt64LE", read_big_int64le, 0), FN("readBigInt64BE", read_big_int64be, 0),
1284
+ FN("writeBigUInt64LE", write_big_uint64le, 0), FN("writeBigUInt64BE", write_big_uint64be, 0),
1285
+ JS_BUILTIN_ALIAS("writeBigUint64LE", "writeBigUInt64LE"), JS_BUILTIN_ALIAS("writeBigUint64BE", "writeBigUInt64BE"),
1286
+ FN("writeBigInt64LE", write_big_int64le, 0), FN("writeBigInt64BE", write_big_int64be, 0),
1287
+ FN("readUIntLE", read_uintle, 2), FN("readUInt32LE", read_uint32le, 0), FN("readUInt16LE", read_uint16le, 0),
1288
+ FN("readUInt8", read_uint8, 0), FN("readUIntBE", read_uintbe, 2), FN("readUInt32BE", read_uint32be, 0),
1289
+ FN("readUInt16BE", read_uint16be, 0),
1290
+ JS_BUILTIN_ALIAS("readUintLE", "readUIntLE"), JS_BUILTIN_ALIAS("readUint32LE", "readUInt32LE"),
1291
+ JS_BUILTIN_ALIAS("readUint16LE", "readUInt16LE"), JS_BUILTIN_ALIAS("readUint8", "readUInt8"),
1292
+ JS_BUILTIN_ALIAS("readUintBE", "readUIntBE"), JS_BUILTIN_ALIAS("readUint32BE", "readUInt32BE"),
1293
+ JS_BUILTIN_ALIAS("readUint16BE", "readUInt16BE"),
1294
+ FN("readIntLE", read_intle, 2), FN("readInt32LE", read_int32le, 0), FN("readInt16LE", read_int16le, 0),
1295
+ FN("readInt8", read_int8, 0), FN("readIntBE", read_intbe, 2), FN("readInt32BE", read_int32be, 0),
1296
+ FN("readInt16BE", read_int16be, 0),
1297
+ FN("writeUIntLE", write_uintle, 3), FN("writeUInt32LE", write_uint32le, 0), FN("writeUInt16LE", write_uint16le, 0),
1298
+ FN("writeUInt8", write_uint8, 0), FN("writeUIntBE", write_uintbe, 3), FN("writeUInt32BE", write_uint32be, 0),
1299
+ FN("writeUInt16BE", write_uint16be, 0),
1300
+ JS_BUILTIN_ALIAS("writeUintLE", "writeUIntLE"), JS_BUILTIN_ALIAS("writeUint32LE", "writeUInt32LE"),
1301
+ JS_BUILTIN_ALIAS("writeUint16LE", "writeUInt16LE"), JS_BUILTIN_ALIAS("writeUint8", "writeUInt8"),
1302
+ JS_BUILTIN_ALIAS("writeUintBE", "writeUIntBE"), JS_BUILTIN_ALIAS("writeUint32BE", "writeUInt32BE"),
1303
+ JS_BUILTIN_ALIAS("writeUint16BE", "writeUInt16BE"),
1304
+ FN("writeIntLE", write_intle, 3), FN("writeInt32LE", write_int32le, 0), FN("writeInt16LE", write_int16le, 0),
1305
+ FN("writeInt8", write_int8, 0), FN("writeIntBE", write_intbe, 3), FN("writeInt32BE", write_int32be, 0),
1306
+ FN("writeInt16BE", write_int16be, 0),
1307
+ FN("readFloatLE", read_floatle, 0), FN("readFloatBE", read_floatbe, 0),
1308
+ FN("readDoubleLE", read_doublele, 0), FN("readDoubleBE", read_doublebe, 0),
1309
+ FN("writeFloatLE", write_floatle, 0), FN("writeFloatBE", write_floatbe, 0),
1310
+ FN("writeDoubleLE", write_doublele, 0), FN("writeDoubleBE", write_doublebe, 0),
1311
+ FN("asciiSlice", buffer_ascii_slice, 2), FN("base64Slice", buffer_base64_slice, 2),
1312
+ FN("base64urlSlice", buffer_base64url_slice, 2), FN("latin1Slice", buffer_latin1_slice, 2),
1313
+ FN("hexSlice", buffer_hex_slice, 2), FN("ucs2Slice", buffer_ucs2_slice, 2), FN("utf8Slice", buffer_utf8_slice, 2),
1314
+ FN("asciiWrite", buffer_ascii_write, 3), FN("base64Write", buffer_base64_write, 3),
1315
+ FN("base64urlWrite", buffer_base64url_write, 3), FN("latin1Write", buffer_latin1_write, 3),
1316
+ FN("hexWrite", buffer_hex_write, 3), FN("ucs2Write", buffer_ucs2_write, 3), FN("utf8Write", buffer_utf8_write, 3),
1317
+ JS_BUILTIN_GETTER("parent", buffer_parent),
1318
+ JS_BUILTIN_GETTER("offset", buffer_offset),
1319
+ FN("copy", buffer_copy, 4),
1320
+ FN("toString", buffer_to_string, 3),
1321
+ FN("equals", buffer_equals, 1),
1322
+ FN("inspect", buffer_inspect, 2),
1323
+ FN("compare", buffer_compare, 5),
1324
+ FN("indexOf", buffer_index_of, 3),
1325
+ FN("lastIndexOf", buffer_last_index_of, 3),
1326
+ FN("includes", buffer_includes, 3),
1327
+ FN("fill", buffer_fill, 4),
1328
+ FN("write", buffer_write, 4),
1329
+ FN("toJSON", buffer_to_json, 0),
1330
+ FN("subarray", buffer_subarray, 2),
1331
+ FN("slice", buffer_subarray, 2),
1332
+ FN("swap16", buffer_swap16, 0),
1333
+ FN("swap32", buffer_swap32, 0),
1334
+ FN("swap64", buffer_swap64, 0),
1335
+ JS_BUILTIN_ALIAS("toLocaleString", "toString"),
1336
+ };
1337
+
1338
+ static void install_buffer(JSContext *ctx, JSObject *global) {
1339
+ JSValue u8 = uint8_array_ctor(ctx);
1340
+ JSValue u8_proto = ctx->intrinsics[JS_INTRINSIC_TYPED_ARRAY_PROTOS + JS_TA_UINT8];
1341
+ JSValue proto = js_new_object_proto(ctx, u8_proto, 128);
1342
+ ctx->intrinsics[JS_INTRINSIC_BUFFER_PROTOTYPE] = proto;
1343
+ JSValue key = js_atom_from_cstr(ctx, "Buffer");
1344
+ JSValue c = js_new_native(ctx, buffer_ctor, key, 3, JS_FN_CONSTRUCTOR);
1345
+ ctx->intrinsics[JS_INTRINSIC_BUFFER] = c;
1346
+ if (js_set_prototype_of(ctx, js_as_object(c), u8) < 0) js_discard(js_take_exception(ctx));
1347
+ js_define_data(ctx, js_as_object(c), JS_ATOM(prototype), proto, 0);
1348
+ js_define_builtins(ctx, js_as_object(c), buffer_statics, JS_COUNTOF(buffer_statics));
1349
+ js_define_data(ctx, js_as_object(proto), JS_ATOM(constructor), c, JS_BUILTIN_METHOD_ATTRS);
1350
+ js_define_builtins(ctx, js_as_object(proto), buffer_proto, JS_COUNTOF(buffer_proto));
1351
+ JSValue custom = js_symbol_for(ctx, js_new_string_cstr(ctx, "nodejs.util.inspect.custom"));
1352
+ JSValue inspect = js_get_value(ctx, proto, js_atom_from_cstr(ctx, "inspect"));
1353
+ js_define_data(ctx, js_as_object(proto), custom, inspect, JS_BUILTIN_METHOD_ATTRS);
1354
+ js_define_data(ctx, global, key, c, JS_BUILTIN_METHOD_ATTRS);
1355
+ }
1356
+
1357
+ const JSComponent js_component_buffer = { "buffer", install_buffer };