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,940 @@
1
+ /* Date (ECMAScript §21.4), the date component (ADR 0014).
2
+ *
3
+ * A Date holds a time value: milliseconds since the epoch, UTC, or NaN. Local time comes from the
4
+ * C library's time zone (localtime_r: TZ, else /etc/localtime), and the zone's English names,
5
+ * which Date.prototype.toString shows as Node does ("Western European Summer Time"), from a table
6
+ * generated from Node's ICU data (tznames.gen.h). Date.parse is V8's parser: the ISO format,
7
+ * then its legacy one. toLocaleString and friends format as en-US, whatever locale is asked. */
8
+ #include <math.h>
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+
13
+ #include "internal.h"
14
+ #include "builtins_util.h"
15
+ #include "js_atoms.h"
16
+ #include "js_convert.h"
17
+ #include "js_error.h"
18
+ #include "js_function.h"
19
+ #include "js_ops.h"
20
+ #include "js_symbol.h"
21
+ #include "jscontext.h"
22
+ #include "jsstring.h"
23
+ #include "os.h"
24
+
25
+ #include "tznames.gen.h"
26
+
27
+ #define MS_PER_DAY 86400000.0
28
+ #define MAX_TIME 8.64e15
29
+
30
+ typedef struct DateObject {
31
+ JSObject obj;
32
+ double time; /* the [[DateValue]]: a time value, or NaN */
33
+ } DateObject;
34
+
35
+ static const JSClass date_class = { "Date", sizeof(DateObject), NULL, NULL, NULL, NULL, NULL, NULL, NULL };
36
+
37
+ static bool is_date(JSValue v) { return js_is_object(v) && js_as_object(v)->shape->cls == &date_class; }
38
+
39
+ /* ---- Time values (§21.4.1) ------------------------------------------------------------------ */
40
+
41
+ static double day_of(double t) { return floor(t / MS_PER_DAY); }
42
+
43
+ static double time_within_day(double t) {
44
+ double r = fmod(t, MS_PER_DAY);
45
+ return r < 0 ? r + MS_PER_DAY : r + 0.0; /* never -0 */
46
+ }
47
+
48
+ static double day_from_year(double y) {
49
+ return 365 * (y - 1970) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
50
+ }
51
+
52
+ static bool leap(double y) { return fmod(y, 4) == 0 && (fmod(y, 100) != 0 || fmod(y, 400) == 0); }
53
+
54
+ static double year_from_time(double t) {
55
+ double y = floor(t / (MS_PER_DAY * 365.2425)) + 1970;
56
+ while (day_from_year(y) * MS_PER_DAY > t) y--;
57
+ while (day_from_year(y + 1) * MS_PER_DAY <= t) y++;
58
+ return y;
59
+ }
60
+
61
+ static const int month_start[2][13] = {
62
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
63
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 },
64
+ };
65
+
66
+ /* The calendar fields of a time value. */
67
+ typedef struct Fields {
68
+ double year, month, date, hours, minutes, seconds, ms, weekday;
69
+ } Fields;
70
+
71
+ static Fields fields_of(double t) {
72
+ Fields f;
73
+ f.year = year_from_time(t);
74
+ int day_in_year = (int)(day_of(t) - day_from_year(f.year));
75
+ const int *starts = month_start[leap(f.year)];
76
+ int m = 0;
77
+ while (day_in_year >= starts[m + 1]) m++;
78
+ f.month = m;
79
+ f.date = day_in_year - starts[m] + 1;
80
+ double w = fmod(day_of(t) + 4, 7);
81
+ f.weekday = w < 0 ? w + 7 : w;
82
+ double ms = time_within_day(t);
83
+ f.hours = floor(ms / 3600000);
84
+ f.minutes = fmod(floor(ms / 60000), 60);
85
+ f.seconds = fmod(floor(ms / 1000), 60);
86
+ f.ms = fmod(ms, 1000);
87
+ return f;
88
+ }
89
+
90
+ static double to_integer(double d) { return trunc(d) + 0.0; }
91
+
92
+ /* MakeTime (§21.4.1.27) */
93
+ static double make_time(double h, double m, double s, double ms) {
94
+ if (!isfinite(h) || !isfinite(m) || !isfinite(s) || !isfinite(ms)) return NAN;
95
+ return to_integer(h) * 3600000.0 + to_integer(m) * 60000.0 + to_integer(s) * 1000.0 + to_integer(ms);
96
+ }
97
+
98
+ /* MakeDay (§21.4.1.28) */
99
+ static double make_day(double year, double month, double date) {
100
+ if (!isfinite(year) || !isfinite(month) || !isfinite(date)) return NAN;
101
+ double y = to_integer(year), m = to_integer(month), dt = to_integer(date);
102
+ double ym = y + floor(m / 12);
103
+ if (fabs(ym) > 400000) return NAN; /* far outside the time value range */
104
+ double mn = fmod(m, 12);
105
+ if (mn < 0) mn += 12;
106
+ double day = day_from_year(ym) + month_start[leap(ym)][(int)mn];
107
+ return day + dt - 1;
108
+ }
109
+
110
+ /* MakeDate (§21.4.1.29) */
111
+ static double make_date(double day, double time) {
112
+ double tv = day * MS_PER_DAY + time;
113
+ return isfinite(tv) ? tv : NAN;
114
+ }
115
+
116
+ /* TimeClip (§21.4.1.31) */
117
+ static double time_clip(double t) {
118
+ if (!isfinite(t) || fabs(t) > MAX_TIME) return NAN;
119
+ return to_integer(t);
120
+ }
121
+
122
+ /* ---- Local time (§21.4.1.20–25) ------------------------------------------------------------- */
123
+
124
+ static double offset_at(double t, bool *dst) {
125
+ bool d;
126
+ double off = js_os_local_offset((int64_t)floor(t / 1000), &d) * 1000.0;
127
+ if (dst) *dst = d;
128
+ return off;
129
+ }
130
+
131
+ static double local_time(double t) { return t + offset_at(t, NULL); }
132
+
133
+ /* UTC(t) (§21.4.1.26): a local time to a time value. In a repeated hour, the earlier instant;
134
+ * in a skipped one, the offset from before the transition. */
135
+ static double utc_of(double tl) {
136
+ if (!isfinite(tl)) return NAN;
137
+ double before = offset_at(tl - MS_PER_DAY, NULL), after = offset_at(tl + MS_PER_DAY, NULL);
138
+ if (before == after) return tl - before;
139
+ double ub = tl - before, ua = tl - after;
140
+ bool vb = offset_at(ub, NULL) == before, va = offset_at(ua, NULL) == after;
141
+ if (vb && va) return ub < ua ? ub : ua;
142
+ if (vb) return ub;
143
+ if (va) return ua;
144
+ return ub;
145
+ }
146
+
147
+ /* ---- Formatting ----------------------------------------------------------------------------- */
148
+
149
+ static const char *const day_names[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
150
+ static const char *const month_names[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
151
+
152
+ /* A year as toString shows it: 4 digits at least, with a sign if negative. */
153
+ static void put_year(char *buf, size_t cap, double y) {
154
+ snprintf(buf, cap, y < 0 ? "-%04.0f" : "%04.0f", fabs(y));
155
+ }
156
+
157
+ static int compare_zone(const void *key, const void *entry) {
158
+ return strcmp((const char *)key, ((const struct TzZone *)entry)->id);
159
+ }
160
+
161
+ /* "GMT+0100 (Western European Standard Time)" for the time value t. */
162
+ static void put_zone(char *buf, size_t cap, double t) {
163
+ bool dst;
164
+ double off = offset_at(t, &dst);
165
+ double minutes = trunc(off / 60000);
166
+ char sign = minutes < 0 ? '-' : '+';
167
+ minutes = fabs(minutes);
168
+ const struct TzZone *z = bsearch(js_os_timezone_id(), tz_zones, JS_COUNTOF(tz_zones), sizeof *tz_zones, compare_zone);
169
+ char fallback[32];
170
+ if (!z) { /* ICU's own fallback: "GMT+01:00", or "GMT" at zero */
171
+ if (minutes == 0) snprintf(fallback, sizeof fallback, "GMT");
172
+ else snprintf(fallback, sizeof fallback, "GMT%c%02.0f:%02.0f", sign, floor(minutes / 60), fmod(minutes, 60));
173
+ }
174
+ snprintf(buf, cap, "GMT%c%02.0f%02.0f (%s)", sign, floor(minutes / 60), fmod(minutes, 60),
175
+ z ? tz_names[dst ? z->dst : z->std] : fallback);
176
+ }
177
+
178
+ enum { FMT_STRING, FMT_DATE, FMT_TIME, FMT_UTC, FMT_ISO, FMT_LOCALE, FMT_LOCALE_DATE, FMT_LOCALE_TIME };
179
+
180
+ /* The string forms of a valid time value. */
181
+ static void format(char *buf, size_t cap, double t, int kind) {
182
+ char year[24], zone[96];
183
+ Fields f = fields_of(kind == FMT_UTC || kind == FMT_ISO ? t : local_time(t));
184
+ switch (kind) {
185
+ case FMT_STRING:
186
+ put_year(year, sizeof year, f.year);
187
+ put_zone(zone, sizeof zone, t);
188
+ snprintf(buf, cap, "%s %s %02.0f %s %02.0f:%02.0f:%02.0f %s", day_names[(int)f.weekday], month_names[(int)f.month], f.date,
189
+ year, f.hours, f.minutes, f.seconds, zone);
190
+ break;
191
+ case FMT_DATE:
192
+ put_year(year, sizeof year, f.year);
193
+ snprintf(buf, cap, "%s %s %02.0f %s", day_names[(int)f.weekday], month_names[(int)f.month], f.date, year);
194
+ break;
195
+ case FMT_TIME:
196
+ put_zone(zone, sizeof zone, t);
197
+ snprintf(buf, cap, "%02.0f:%02.0f:%02.0f %s", f.hours, f.minutes, f.seconds, zone);
198
+ break;
199
+ case FMT_UTC:
200
+ put_year(year, sizeof year, f.year);
201
+ snprintf(buf, cap, "%s, %02.0f %s %s %02.0f:%02.0f:%02.0f GMT", day_names[(int)f.weekday], f.date, month_names[(int)f.month],
202
+ year, f.hours, f.minutes, f.seconds);
203
+ break;
204
+ case FMT_ISO:
205
+ if (f.year >= 0 && f.year <= 9999) snprintf(year, sizeof year, "%04.0f", f.year);
206
+ else snprintf(year, sizeof year, "%c%06.0f", f.year < 0 ? '-' : '+', fabs(f.year));
207
+ snprintf(buf, cap, "%s-%02.0f-%02.0fT%02.0f:%02.0f:%02.0f.%03.0fZ", year, f.month + 1, f.date, f.hours, f.minutes, f.seconds, f.ms);
208
+ break;
209
+ default: { /* en-US: "1/1/1970, 1:00:00 AM"; years before 1 count back from 1 BC */
210
+ double y = f.year <= 0 ? 1 - f.year : f.year;
211
+ double h12 = fmod(f.hours, 12) == 0 ? 12 : fmod(f.hours, 12);
212
+ const char *ampm = f.hours < 12 ? "AM" : "PM";
213
+ if (kind == FMT_LOCALE)
214
+ snprintf(buf, cap, "%.0f/%.0f/%.0f, %.0f:%02.0f:%02.0f %s", f.month + 1, f.date, y, h12, f.minutes, f.seconds, ampm);
215
+ else if (kind == FMT_LOCALE_DATE)
216
+ snprintf(buf, cap, "%.0f/%.0f/%.0f", f.month + 1, f.date, y);
217
+ else
218
+ snprintf(buf, cap, "%.0f:%02.0f:%02.0f %s", h12, f.minutes, f.seconds, ampm);
219
+ }
220
+ }
221
+ }
222
+
223
+ static JSValue format_value(JSContext *ctx, double t, int kind) {
224
+ if (isnan(t)) return js_new_string_cstr(ctx, "Invalid Date");
225
+ char buf[160];
226
+ format(buf, sizeof buf, t, kind);
227
+ return js_new_string_cstr(ctx, buf);
228
+ }
229
+
230
+ /* ---- Date.parse: V8's date parser ----------------------------------------------------------- */
231
+
232
+ enum { TK_END, TK_NUMBER, TK_SYMBOL, TK_SPACE, TK_KEYWORD, TK_UNKNOWN, TK_INVALID };
233
+ enum { KW_NONE, KW_MONTH, KW_AM_PM, KW_ZONE, KW_T };
234
+
235
+ typedef struct Token {
236
+ int type;
237
+ int value; /* a number's value (saturated), a symbol's character, a keyword's value */
238
+ int length; /* a number's digits, a keyword's letters */
239
+ int keyword; /* KW_* */
240
+ } Token;
241
+
242
+ typedef struct Scanner {
243
+ const uint16_t *s;
244
+ uint32_t len, pos;
245
+ Token next;
246
+ } Scanner;
247
+
248
+ static uint32_t peek_char(Scanner *sc) { return sc->pos < sc->len ? sc->s[sc->pos] : 0; }
249
+
250
+ static bool is_space(uint32_t c) {
251
+ return c == ' ' || (c >= 9 && c <= 13) || c == 0xA0 || c == 0xFEFF || c == 0x1680 || (c >= 0x2000 && c <= 0x200A) ||
252
+ c == 0x2028 || c == 0x2029 || c == 0x202F || c == 0x205F || c == 0x3000;
253
+ }
254
+
255
+ static const struct { char word[4]; int keyword, value; } keywords[] = {
256
+ { "jan", KW_MONTH, 1 }, { "feb", KW_MONTH, 2 }, { "mar", KW_MONTH, 3 }, { "apr", KW_MONTH, 4 },
257
+ { "may", KW_MONTH, 5 }, { "jun", KW_MONTH, 6 }, { "jul", KW_MONTH, 7 }, { "aug", KW_MONTH, 8 },
258
+ { "sep", KW_MONTH, 9 }, { "oct", KW_MONTH, 10 }, { "nov", KW_MONTH, 11 }, { "dec", KW_MONTH, 12 },
259
+ { "am", KW_AM_PM, 0 }, { "pm", KW_AM_PM, 12 },
260
+ { "ut", KW_ZONE, 0 }, { "utc", KW_ZONE, 0 }, { "z", KW_ZONE, 0 }, { "gmt", KW_ZONE, 0 },
261
+ { "cdt", KW_ZONE, -5 }, { "cst", KW_ZONE, -6 }, { "edt", KW_ZONE, -4 }, { "est", KW_ZONE, -5 },
262
+ { "mdt", KW_ZONE, -6 }, { "mst", KW_ZONE, -7 }, { "pdt", KW_ZONE, -7 }, { "pst", KW_ZONE, -8 },
263
+ { "t", KW_T, 0 },
264
+ };
265
+
266
+ static Token scan(Scanner *sc) {
267
+ Token t = { TK_END, 0, 0, KW_NONE };
268
+ if (sc->pos >= sc->len) return t;
269
+ uint32_t c = peek_char(sc);
270
+ if (c >= '0' && c <= '9') {
271
+ int n = 0, len = 0;
272
+ while ((c = peek_char(sc)) >= '0' && c <= '9' && sc->pos < sc->len) {
273
+ if (n < 214748364 - 10) n = n * 10 + (int)(c - '0');
274
+ sc->pos++;
275
+ len++;
276
+ }
277
+ return (Token){ TK_NUMBER, n, len, KW_NONE };
278
+ }
279
+ if (c == ':' || c == '-' || c == '+' || c == '.' || c == ')') {
280
+ sc->pos++;
281
+ return (Token){ TK_SYMBOL, (int)c, 1, KW_NONE };
282
+ }
283
+ if (c >= 'A' && !is_space(c)) { /* a word: its first three letters, lowercased, pick a keyword */
284
+ char pre[4] = { 0, 0, 0, 0 };
285
+ int len = 0;
286
+ while (sc->pos < sc->len && (c = peek_char(sc)) >= 'A' && !is_space(c)) {
287
+ if (len < 3) pre[len] = (char)(c < 128 ? (c >= 'A' && c <= 'Z' ? c | 0x20 : c) : 1);
288
+ sc->pos++;
289
+ len++;
290
+ }
291
+ for (size_t i = 0; i < JS_COUNTOF(keywords); i++) {
292
+ if (strncmp(pre, keywords[i].word, 3) != 0) continue;
293
+ if (len <= 3 || keywords[i].keyword == KW_MONTH) return (Token){ TK_KEYWORD, keywords[i].value, len, keywords[i].keyword };
294
+ }
295
+ return (Token){ TK_KEYWORD, 0, len, KW_NONE };
296
+ }
297
+ if (is_space(c)) {
298
+ while (sc->pos < sc->len && is_space(peek_char(sc))) sc->pos++;
299
+ return (Token){ TK_SPACE, 0, 0, KW_NONE };
300
+ }
301
+ if (c == '(') { /* a comment, nested parentheses included */
302
+ int depth = 0;
303
+ do {
304
+ c = peek_char(sc);
305
+ if (c == '(') depth++;
306
+ else if (c == ')') depth--;
307
+ sc->pos++;
308
+ } while (depth > 0 && sc->pos < sc->len);
309
+ return (Token){ TK_UNKNOWN, 0, 0, KW_NONE };
310
+ }
311
+ sc->pos++;
312
+ return (Token){ TK_UNKNOWN, 0, 0, KW_NONE };
313
+ }
314
+
315
+ static Token next_token(Scanner *sc) {
316
+ Token t = sc->next;
317
+ sc->next = scan(sc);
318
+ return t;
319
+ }
320
+
321
+ static bool skip_symbol(Scanner *sc, int c) {
322
+ if (sc->next.type != TK_SYMBOL || sc->next.value != c) return false;
323
+ next_token(sc);
324
+ return true;
325
+ }
326
+
327
+ static bool is_fixed_number(Token t, int length) { return t.type == TK_NUMBER && t.length == length; }
328
+ static bool is_sign(Token t) { return t.type == TK_SYMBOL && (t.value == '+' || t.value == '-'); }
329
+ static bool is_keyword_z(Token t) { return t.type == TK_KEYWORD && t.keyword == KW_ZONE && t.length == 1 && t.value == 0; }
330
+ static bool between(int x, int lo, int hi) { return x >= lo && x <= hi; }
331
+
332
+ #define NONE (-1000000)
333
+
334
+ typedef struct DayComposer {
335
+ int comp[3], index, named_month;
336
+ bool iso;
337
+ } DayComposer;
338
+
339
+ typedef struct TimeComposer {
340
+ int comp[4], index, hour_offset;
341
+ } TimeComposer;
342
+
343
+ typedef struct ZoneComposer {
344
+ int sign, hour, minute;
345
+ } ZoneComposer;
346
+
347
+ static bool day_add(DayComposer *d, int n) {
348
+ if (d->index >= 3) return false;
349
+ d->comp[d->index++] = n;
350
+ return true;
351
+ }
352
+
353
+ static bool time_add(TimeComposer *t, int n) {
354
+ if (t->index >= 4) return false;
355
+ t->comp[t->index++] = n;
356
+ return true;
357
+ }
358
+
359
+ static bool time_add_final(TimeComposer *t, int n) {
360
+ if (!time_add(t, n)) return false;
361
+ while (t->index < 4) t->comp[t->index++] = 0;
362
+ return true;
363
+ }
364
+
365
+ static bool time_expecting(const TimeComposer *t, int n) {
366
+ return (t->index == 1 && between(n, 0, 59)) || (t->index == 2 && between(n, 0, 59)) || (t->index == 3 && between(n, 0, 999));
367
+ }
368
+
369
+ static void zone_set(ZoneComposer *z, int hours) {
370
+ z->sign = hours < 0 ? -1 : 1;
371
+ z->hour = hours < 0 ? -hours : hours;
372
+ z->minute = 0;
373
+ }
374
+
375
+ static bool zone_expecting(const ZoneComposer *z, int n) { return z->hour != NONE && z->minute == NONE && between(n, 0, 59); }
376
+ static bool zone_is_utc(const ZoneComposer *z) { return z->hour == 0 && z->minute == 0; }
377
+
378
+ /* Milliseconds from a fraction's digits: the first three, scaled. */
379
+ static int read_ms(Token t) {
380
+ int n = t.value, len = t.length;
381
+ if (len == 1) return n * 100;
382
+ if (len == 2) return n * 10;
383
+ if (len > 3) {
384
+ if (len > 9) len = 9;
385
+ int factor = 1;
386
+ do {
387
+ factor *= 10;
388
+ len--;
389
+ } while (len > 3);
390
+ n /= factor;
391
+ }
392
+ return n;
393
+ }
394
+
395
+ /* The ES5 date-time format (§21.4.1.32), V8's way: the token where it stopped (END when the whole
396
+ * string was read), or INVALID. */
397
+ static Token parse_iso(Scanner *sc, DayComposer *day, TimeComposer *time, ZoneComposer *tz) {
398
+ if (is_sign(sc->next)) {
399
+ Token sign = next_token(sc);
400
+ if (!is_fixed_number(sc->next, 6)) return sign;
401
+ int year = next_token(sc).value;
402
+ if (sign.value == '-' && year == 0) return sign;
403
+ day_add(day, sign.value == '-' ? -year : year);
404
+ } else if (is_fixed_number(sc->next, 4)) {
405
+ day_add(day, next_token(sc).value);
406
+ } else {
407
+ return next_token(sc);
408
+ }
409
+ if (skip_symbol(sc, '-')) {
410
+ if (!is_fixed_number(sc->next, 2) || !between(sc->next.value, 1, 12)) return next_token(sc);
411
+ day_add(day, next_token(sc).value);
412
+ if (skip_symbol(sc, '-')) {
413
+ if (!is_fixed_number(sc->next, 2) || !between(sc->next.value, 1, 31)) return next_token(sc);
414
+ day_add(day, next_token(sc).value);
415
+ }
416
+ }
417
+ if (!(sc->next.type == TK_KEYWORD && sc->next.keyword == KW_T)) {
418
+ if (sc->next.type != TK_END) return next_token(sc);
419
+ } else {
420
+ next_token(sc);
421
+ Token invalid = { TK_INVALID, 0, 0, KW_NONE };
422
+ if (!is_fixed_number(sc->next, 2) || !between(sc->next.value, 0, 24)) return invalid;
423
+ bool hour_24 = sc->next.value == 24;
424
+ time_add(time, next_token(sc).value);
425
+ if (!skip_symbol(sc, ':')) return invalid;
426
+ if (!is_fixed_number(sc->next, 2) || !between(sc->next.value, 0, 59) || (hour_24 && sc->next.value > 0)) return invalid;
427
+ time_add(time, next_token(sc).value);
428
+ if (skip_symbol(sc, ':')) {
429
+ if (!is_fixed_number(sc->next, 2) || !between(sc->next.value, 0, 59) || (hour_24 && sc->next.value > 0)) return invalid;
430
+ time_add(time, next_token(sc).value);
431
+ if (skip_symbol(sc, '.')) {
432
+ if (sc->next.type != TK_NUMBER || (hour_24 && sc->next.value > 0)) return invalid;
433
+ time_add(time, read_ms(next_token(sc)));
434
+ }
435
+ }
436
+ if (is_keyword_z(sc->next)) {
437
+ next_token(sc);
438
+ zone_set(tz, 0);
439
+ } else if (is_sign(sc->next)) {
440
+ tz->sign = next_token(sc).value == '+' ? 1 : -1;
441
+ if (is_fixed_number(sc->next, 4)) {
442
+ int hm = next_token(sc).value;
443
+ if (!between(hm / 100, 0, 23) || !between(hm % 100, 0, 59)) return invalid;
444
+ tz->hour = hm / 100;
445
+ tz->minute = hm % 100;
446
+ } else {
447
+ if (!is_fixed_number(sc->next, 2) || !between(sc->next.value, 0, 23)) return invalid;
448
+ tz->hour = next_token(sc).value;
449
+ if (!skip_symbol(sc, ':')) return invalid;
450
+ if (!is_fixed_number(sc->next, 2) || !between(sc->next.value, 0, 59)) return invalid;
451
+ tz->minute = next_token(sc).value;
452
+ }
453
+ }
454
+ if (sc->next.type != TK_END) return invalid;
455
+ }
456
+ /* date-only forms are UTC; date-time forms without an offset, local */
457
+ if (tz->hour == NONE && time->index == 0) zone_set(tz, 0);
458
+ day->iso = true;
459
+ return (Token){ TK_END, 0, 0, KW_NONE };
460
+ }
461
+
462
+ /* Date.parse(string): a time value, or NaN. */
463
+ static double parse_date(JSContext *ctx, JSValue str) {
464
+ JSStrView v = js_string_view(ctx, str);
465
+ uint16_t *units = malloc((v.length + 1) * sizeof *units);
466
+ if (!units) js_fatal("out of memory parsing a date");
467
+ for (uint32_t i = 0; i < v.length; i++) units[i] = (uint16_t)js_view_at(v, i);
468
+ Scanner sc = { units, v.length, 0, { TK_END, 0, 0, KW_NONE } };
469
+ sc.next = scan(&sc);
470
+ DayComposer day = { { 0, 0, 0 }, 0, NONE, false };
471
+ TimeComposer time = { { 0, 0, 0, 0 }, 0, NONE };
472
+ ZoneComposer tz = { NONE, NONE, NONE };
473
+ double result = NAN;
474
+
475
+ Token token = parse_iso(&sc, &day, &time, &tz);
476
+ if (token.type == TK_INVALID) goto done;
477
+ bool has_read_number = day.index > 0;
478
+ for (; token.type != TK_END; token = next_token(&sc)) { /* the legacy parser */
479
+ if (token.type == TK_NUMBER) {
480
+ has_read_number = true;
481
+ int n = token.value;
482
+ if (skip_symbol(&sc, ':')) {
483
+ if (skip_symbol(&sc, ':')) {
484
+ if (time.index != 0) goto done;
485
+ time_add(&time, n);
486
+ time_add(&time, 0);
487
+ } else {
488
+ if (!time_add(&time, n)) goto done;
489
+ if (sc.next.type == TK_SYMBOL && sc.next.value == '.') next_token(&sc);
490
+ }
491
+ } else if (sc.next.type == TK_SYMBOL && sc.next.value == '.' && time_expecting(&time, n)) {
492
+ next_token(&sc);
493
+ time_add(&time, n);
494
+ if (sc.next.type != TK_NUMBER) goto done;
495
+ time_add_final(&time, read_ms(next_token(&sc)));
496
+ } else if (zone_expecting(&tz, n)) {
497
+ tz.minute = n;
498
+ } else if (time_expecting(&time, n)) {
499
+ time_add_final(&time, n);
500
+ Token p = sc.next;
501
+ if (p.type != TK_END && p.type != TK_SPACE && !is_keyword_z(p) && !is_sign(p)) goto done;
502
+ } else {
503
+ if (!day_add(&day, n)) goto done;
504
+ skip_symbol(&sc, '-');
505
+ }
506
+ } else if (token.type == TK_KEYWORD) {
507
+ if (token.keyword == KW_AM_PM && time.index != 0) {
508
+ time.hour_offset = token.value;
509
+ } else if (token.keyword == KW_MONTH) {
510
+ day.named_month = token.value;
511
+ skip_symbol(&sc, '-');
512
+ } else if (token.keyword == KW_ZONE && has_read_number) {
513
+ zone_set(&tz, token.value);
514
+ } else {
515
+ if (has_read_number) goto done; /* no words after a number */
516
+ if (sc.next.type == TK_NUMBER) goto done; /* nor a word glued to one */
517
+ }
518
+ } else if (is_sign(token) && (zone_is_utc(&tz) || time.index != 0)) {
519
+ tz.sign = token.value == '+' ? 1 : -1;
520
+ int n = 0, length = 0;
521
+ if (sc.next.type == TK_NUMBER) {
522
+ Token num = next_token(&sc);
523
+ n = num.value;
524
+ length = num.length;
525
+ }
526
+ has_read_number = true;
527
+ if (sc.next.type == TK_SYMBOL && sc.next.value == ':') {
528
+ tz.hour = n;
529
+ tz.minute = NONE;
530
+ } else if (length == 1 || length == 2) {
531
+ tz.hour = n;
532
+ tz.minute = 0;
533
+ } else if (length == 3 || length == 4) {
534
+ tz.hour = n / 100;
535
+ tz.minute = n % 100;
536
+ } else {
537
+ goto done;
538
+ }
539
+ } else if ((is_sign(token) || (token.type == TK_SYMBOL && token.value == ')')) && has_read_number) {
540
+ goto done;
541
+ }
542
+ }
543
+
544
+ /* DayComposer::Write */
545
+ if (day.index < 1) goto done;
546
+ while (day.index < 3) day.comp[day.index++] = 1;
547
+ int year = 0, month, mday;
548
+ if (day.named_month == NONE) {
549
+ if (day.iso || !between(day.comp[0], 1, 31)) {
550
+ year = day.comp[0];
551
+ month = day.comp[1];
552
+ mday = day.comp[2];
553
+ } else {
554
+ month = day.comp[0];
555
+ mday = day.comp[1];
556
+ year = day.comp[2];
557
+ }
558
+ } else {
559
+ month = day.named_month;
560
+ if (!between(day.comp[0], 1, 31)) {
561
+ year = day.comp[0];
562
+ mday = day.comp[1];
563
+ } else {
564
+ mday = day.comp[0];
565
+ year = day.comp[1];
566
+ }
567
+ }
568
+ if (!day.iso) {
569
+ if (between(year, 0, 49)) year += 2000;
570
+ else if (between(year, 50, 99)) year += 1900;
571
+ }
572
+ if (!between(month, 1, 12) || !between(mday, 1, 31)) goto done;
573
+ /* TimeComposer::Write */
574
+ while (time.index < 4) time.comp[time.index++] = 0;
575
+ int hour = time.comp[0], minute = time.comp[1], second = time.comp[2], ms = time.comp[3];
576
+ if (time.hour_offset != NONE) {
577
+ if (!between(hour, 0, 12)) goto done;
578
+ hour = hour % 12 + time.hour_offset;
579
+ }
580
+ if (!between(hour, 0, 23) || !between(minute, 0, 59) || !between(second, 0, 59) || !between(ms, 0, 999)) {
581
+ if (hour != 24 || minute != 0 || second != 0 || ms != 0) goto done;
582
+ }
583
+ double t = make_date(make_day(year, month - 1, mday), make_time(hour, minute, second, ms));
584
+ if (tz.sign != NONE) { /* TimeZoneComposer::Write */
585
+ double offset = (tz.hour == NONE ? 0 : tz.hour) * 3600.0 + (tz.minute == NONE ? 0 : tz.minute) * 60.0;
586
+ result = t - tz.sign * offset * 1000;
587
+ } else {
588
+ result = utc_of(t);
589
+ }
590
+ result = time_clip(result);
591
+ done:
592
+ free(units);
593
+ return result;
594
+ }
595
+
596
+ /* ---- The constructor and its statics -------------------------------------------------------- */
597
+
598
+ static double now(void) { return floor(js_os_time_ms()); }
599
+
600
+ /* The year argument of the constructor and Date.UTC: 0..99 mean 1900..1999. */
601
+ static double full_year(double y) {
602
+ if (isnan(y)) return y;
603
+ double yi = to_integer(y);
604
+ return yi >= 0 && yi <= 99 ? 1900 + yi : y;
605
+ }
606
+
607
+ /* MakeDate from (year, month, date, hours, minutes, seconds, ms) arguments, as numbers. */
608
+ static int date_from_args(JSContext *ctx, uint32_t argc, const JSValue *argv, double *out) {
609
+ double v[7] = { NAN, 0, 1, 0, 0, 0, 0 };
610
+ for (uint32_t i = 0; i < argc && i < 7; i++)
611
+ if (js_to_number(ctx, &v[i], argv[i]) < 0) return -1;
612
+ *out = make_date(make_day(full_year(v[0]), v[1], v[2]), make_time(v[3], v[4], v[5], v[6]));
613
+ return 0;
614
+ }
615
+
616
+ /* Date(...) (§21.4.2.1) */
617
+ BUILTIN(date_ctor) {
618
+ (void)callee, (void)this_val;
619
+ if (js_is_undefined(new_target)) return format_value(ctx, now(), FMT_STRING);
620
+ double tv;
621
+ if (argc == 0) {
622
+ tv = now();
623
+ } else if (argc == 1) {
624
+ JSValue value = argv[0];
625
+ if (is_date(value)) {
626
+ tv = ((DateObject *)js_as_object(value))->time;
627
+ } else {
628
+ JSValue p = js_to_primitive(ctx, value, JS_HINT_DEFAULT);
629
+ if (js_is_exception(p)) return p;
630
+ if (js_is_string(p)) tv = parse_date(ctx, p);
631
+ else if (js_to_number(ctx, &tv, p) < 0) return JS_EXCEPTION;
632
+ }
633
+ tv = time_clip(tv);
634
+ } else {
635
+ if (date_from_args(ctx, argc, argv, &tv) < 0) return JS_EXCEPTION;
636
+ tv = time_clip(utc_of(tv));
637
+ }
638
+ JSValue proto = js_get_prototype_from_constructor(ctx, new_target, JS_INTRINSIC_DATE_PROTOTYPE);
639
+ if (js_is_exception(proto)) return proto;
640
+ DateObject *d = (DateObject *)js_alloc_object(ctx, JS_CELL_OBJECT, js_shape_root(ctx, &date_class, proto, 0));
641
+ d->time = tv;
642
+ return js_object_value(&d->obj);
643
+ }
644
+
645
+ BUILTIN(date_now) {
646
+ UNUSED_ARGS;
647
+ return js_number(now());
648
+ }
649
+
650
+ BUILTIN(date_parse) {
651
+ UNUSED_ARGS;
652
+ JSValue s = js_to_string(ctx, ARG(0));
653
+ return js_is_exception(s) ? s : js_number(parse_date(ctx, s));
654
+ }
655
+
656
+ /* Date.UTC(year, month, …) (§21.4.3.4) */
657
+ BUILTIN(date_utc) {
658
+ UNUSED_ARGS;
659
+ double t;
660
+ if (date_from_args(ctx, argc, argv, &t) < 0) return JS_EXCEPTION;
661
+ return js_number(time_clip(t));
662
+ }
663
+
664
+ /* ---- Date.prototype ------------------------------------------------------------------------- */
665
+
666
+ static DateObject *this_date(JSContext *ctx, JSValue v, const char *method) {
667
+ if (is_date(v)) return (DateObject *)js_as_object(v);
668
+ if (!method) {
669
+ js_discard(js_throw_type_error(ctx, "this is not a Date object."));
670
+ } else {
671
+ char what[64];
672
+ js_describe_value(ctx, v, what, sizeof what);
673
+ js_discard(js_throw_type_error(ctx, "Method Date.prototype.%s called on incompatible receiver %s", method, what));
674
+ }
675
+ return NULL;
676
+ }
677
+
678
+ enum { F_YEAR, F_MONTH, F_DATE, F_HOURS, F_MINUTES, F_SECONDS, F_MS, F_DAY, F_TIME, F_OFFSET };
679
+
680
+ static double field(double t, int which, bool local) {
681
+ if (isnan(t)) return NAN;
682
+ if (which == F_TIME) return t;
683
+ if (which == F_OFFSET) return trunc((t - local_time(t)) / 60000);
684
+ Fields f = fields_of(local ? local_time(t) : t);
685
+ switch (which) {
686
+ case F_YEAR: return f.year;
687
+ case F_MONTH: return f.month;
688
+ case F_DATE: return f.date;
689
+ case F_HOURS: return f.hours;
690
+ case F_MINUTES: return f.minutes;
691
+ case F_SECONDS: return f.seconds;
692
+ case F_MS: return f.ms;
693
+ default: return f.weekday;
694
+ }
695
+ }
696
+
697
+ #define GETTER(fn, which, local) \
698
+ BUILTIN(fn) { \
699
+ UNUSED_ARGS; \
700
+ DateObject *d = this_date(ctx, this_val, NULL); \
701
+ return d ? js_number(field(d->time, which, local)) : JS_EXCEPTION; \
702
+ }
703
+ GETTER(date_get_time, F_TIME, false)
704
+ GETTER(date_get_timezone_offset, F_OFFSET, true)
705
+ GETTER(date_get_full_year, F_YEAR, true)
706
+ GETTER(date_get_month, F_MONTH, true)
707
+ GETTER(date_get_date, F_DATE, true)
708
+ GETTER(date_get_day, F_DAY, true)
709
+ GETTER(date_get_hours, F_HOURS, true)
710
+ GETTER(date_get_minutes, F_MINUTES, true)
711
+ GETTER(date_get_seconds, F_SECONDS, true)
712
+ GETTER(date_get_milliseconds, F_MS, true)
713
+ GETTER(date_get_utc_full_year, F_YEAR, false)
714
+ GETTER(date_get_utc_month, F_MONTH, false)
715
+ GETTER(date_get_utc_date, F_DATE, false)
716
+ GETTER(date_get_utc_day, F_DAY, false)
717
+ GETTER(date_get_utc_hours, F_HOURS, false)
718
+ GETTER(date_get_utc_minutes, F_MINUTES, false)
719
+ GETTER(date_get_utc_seconds, F_SECONDS, false)
720
+ GETTER(date_get_utc_milliseconds, F_MS, false)
721
+
722
+ /* getYear (Annex B.2.3.1) */
723
+ BUILTIN(date_get_year) {
724
+ UNUSED_ARGS;
725
+ DateObject *d = this_date(ctx, this_val, "getYear");
726
+ return d ? js_number(field(d->time, F_YEAR, true) - 1900) : JS_EXCEPTION;
727
+ }
728
+
729
+ /* The setters (§21.4.4.20–28): fields first..first+max-1 from the arguments (at least one),
730
+ * the rest from the current (local or UTC) time. setFullYear starts from +0 when invalid. */
731
+ static JSValue set_fields(JSContext *ctx, JSValue this_val, uint32_t argc, const JSValue *argv, int first, uint32_t max, bool local,
732
+ const char *method) {
733
+ DateObject *d = this_date(ctx, this_val, method);
734
+ if (!d) return JS_EXCEPTION;
735
+ double t = d->time, v[4];
736
+ uint32_t n = argc < 1 ? 1 : argc < max ? argc : max;
737
+ for (uint32_t i = 0; i < n; i++)
738
+ if (js_to_number(ctx, &v[i], i < argc ? argv[i] : JS_UNDEFINED) < 0) return JS_EXCEPTION;
739
+ if (isnan(t)) {
740
+ if (first != F_YEAR) return js_number(NAN);
741
+ t = 0;
742
+ } else if (local) {
743
+ t = local_time(t);
744
+ }
745
+ Fields f = fields_of(t);
746
+ double fs[7] = { f.year, f.month, f.date, f.hours, f.minutes, f.seconds, f.ms };
747
+ for (uint32_t i = 0; i < n; i++) fs[first + (int)i] = v[i];
748
+ double date = make_date(make_day(fs[0], fs[1], fs[2]), make_time(fs[3], fs[4], fs[5], fs[6]));
749
+ d->time = time_clip(local ? utc_of(date) : date);
750
+ return js_number(d->time);
751
+ }
752
+
753
+ #define SETTER(fn, first, max, local, name) \
754
+ BUILTIN(fn) { \
755
+ (void)callee, (void)new_target; \
756
+ return set_fields(ctx, this_val, argc, argv, first, max, local, name); \
757
+ }
758
+ SETTER(date_set_full_year, F_YEAR, 3, true, "setFullYear")
759
+ SETTER(date_set_month, F_MONTH, 2, true, "setMonth")
760
+ SETTER(date_set_date, F_DATE, 1, true, "setDate")
761
+ SETTER(date_set_hours, F_HOURS, 4, true, "setHours")
762
+ SETTER(date_set_minutes, F_MINUTES, 3, true, "setMinutes")
763
+ SETTER(date_set_seconds, F_SECONDS, 2, true, "setSeconds")
764
+ SETTER(date_set_milliseconds, F_MS, 1, true, "setMilliseconds")
765
+ SETTER(date_set_utc_full_year, F_YEAR, 3, false, "setUTCFullYear")
766
+ SETTER(date_set_utc_month, F_MONTH, 2, false, "setUTCMonth")
767
+ SETTER(date_set_utc_date, F_DATE, 1, false, "setUTCDate")
768
+ SETTER(date_set_utc_hours, F_HOURS, 4, false, "setUTCHours")
769
+ SETTER(date_set_utc_minutes, F_MINUTES, 3, false, "setUTCMinutes")
770
+ SETTER(date_set_utc_seconds, F_SECONDS, 2, false, "setUTCSeconds")
771
+ SETTER(date_set_utc_milliseconds, F_MS, 1, false, "setUTCMilliseconds")
772
+
773
+ BUILTIN(date_set_time) {
774
+ UNUSED_ARGS;
775
+ DateObject *d = this_date(ctx, this_val, "setTime");
776
+ if (!d) return JS_EXCEPTION;
777
+ double t;
778
+ if (js_to_number(ctx, &t, ARG(0)) < 0) return JS_EXCEPTION;
779
+ d->time = time_clip(t);
780
+ return js_number(d->time);
781
+ }
782
+
783
+ /* setYear (Annex B.2.3.2) */
784
+ BUILTIN(date_set_year) {
785
+ UNUSED_ARGS;
786
+ DateObject *d = this_date(ctx, this_val, "setYear");
787
+ if (!d) return JS_EXCEPTION;
788
+ double y;
789
+ if (js_to_number(ctx, &y, ARG(0)) < 0) return JS_EXCEPTION;
790
+ double t = isnan(d->time) ? 0 : local_time(d->time);
791
+ if (isnan(y)) {
792
+ d->time = NAN;
793
+ return js_number(NAN);
794
+ }
795
+ Fields f = fields_of(t);
796
+ double date = make_date(make_day(full_year(y), f.month, f.date), time_within_day(t));
797
+ d->time = time_clip(utc_of(date));
798
+ return js_number(d->time);
799
+ }
800
+
801
+ #define FORMATTER(fn, kind, name) \
802
+ BUILTIN(fn) { \
803
+ UNUSED_ARGS; \
804
+ DateObject *d = this_date(ctx, this_val, name); \
805
+ return d ? format_value(ctx, d->time, kind) : JS_EXCEPTION; \
806
+ }
807
+ FORMATTER(date_to_string, FMT_STRING, "toString")
808
+ FORMATTER(date_to_date_string, FMT_DATE, "toDateString")
809
+ FORMATTER(date_to_time_string, FMT_TIME, "toTimeString")
810
+ FORMATTER(date_to_utc_string, FMT_UTC, "toUTCString")
811
+ FORMATTER(date_to_locale_string, FMT_LOCALE, "toLocaleString")
812
+ FORMATTER(date_to_locale_date_string, FMT_LOCALE_DATE, "toLocaleDateString")
813
+ FORMATTER(date_to_locale_time_string, FMT_LOCALE_TIME, "toLocaleTimeString")
814
+
815
+ BUILTIN(date_to_iso_string) {
816
+ UNUSED_ARGS;
817
+ DateObject *d = this_date(ctx, this_val, "toISOString");
818
+ if (!d) return JS_EXCEPTION;
819
+ if (isnan(d->time)) return js_throw_range_error(ctx, "Invalid time value");
820
+ return format_value(ctx, d->time, FMT_ISO);
821
+ }
822
+
823
+ BUILTIN(date_value_of) {
824
+ UNUSED_ARGS;
825
+ DateObject *d = this_date(ctx, this_val, NULL);
826
+ return d ? js_number(d->time) : JS_EXCEPTION;
827
+ }
828
+
829
+ /* toJSON(key) (§21.4.4.37) */
830
+ BUILTIN(date_to_json) {
831
+ UNUSED_ARGS;
832
+ JSValue o = js_to_object(ctx, this_val);
833
+ if (js_is_exception(o)) return o;
834
+ JSValue tv = js_to_primitive(ctx, o, JS_HINT_NUMBER);
835
+ if (js_is_exception(tv)) return tv;
836
+ if (js_is_number(tv) && !isfinite(js_as_number(tv))) return JS_NULL;
837
+ JSValue f = js_get_value(ctx, o, js_atom_from_cstr(ctx, "toISOString"));
838
+ if (js_is_exception(f)) return f;
839
+ if (!js_is_callable(f)) return js_throw_type_error(ctx, "toISOString is not a function");
840
+ return js_call(ctx, f, o, 0, NULL);
841
+ }
842
+
843
+ /* [@@toPrimitive](hint) (§21.4.4.45) */
844
+ BUILTIN(date_to_primitive) {
845
+ UNUSED_ARGS;
846
+ if (!js_is_object(this_val)) {
847
+ char what[64];
848
+ js_describe_value(ctx, this_val, what, sizeof what);
849
+ return js_throw_type_error(ctx, "Method Date.prototype [ @@toPrimitive ] called on incompatible receiver %s", what);
850
+ }
851
+ JSValue hint = ARG(0);
852
+ if (js_is_string(hint)) {
853
+ if (js_string_equals(ctx, hint, JS_ATOM(string)) || js_string_equals(ctx, hint, JS_ATOM(default)))
854
+ return js_ordinary_to_primitive(ctx, this_val, JS_HINT_STRING);
855
+ if (js_string_equals(ctx, hint, JS_ATOM(number))) return js_ordinary_to_primitive(ctx, this_val, JS_HINT_NUMBER);
856
+ }
857
+ char what[64];
858
+ js_describe_value(ctx, hint, what, sizeof what);
859
+ return js_throw_type_error(ctx, "Invalid hint: %s", what);
860
+ }
861
+
862
+ /* util.inspect's view (inspect.c, through rt->date_inspect): the ISO string, or "Invalid Date". */
863
+ static JSValue date_inspect(JSContext *ctx, JSValue v) {
864
+ if (!is_date(v)) return JS_EMPTY;
865
+ double t = ((DateObject *)js_as_object(v))->time;
866
+ return format_value(ctx, t, FMT_ISO);
867
+ }
868
+
869
+ /* ---- Realm ----------------------------------------------------------------------------------- */
870
+
871
+ static const JSBuiltin date_statics[] = {
872
+ JS_BUILTIN_FN("now", date_now, 0),
873
+ JS_BUILTIN_FN("parse", date_parse, 1),
874
+ JS_BUILTIN_FN("UTC", date_utc, 7),
875
+ };
876
+
877
+ static const JSBuiltin date_proto[] = { /* V8's order */
878
+ JS_BUILTIN_FN("toString", date_to_string, 0),
879
+ JS_BUILTIN_FN("toDateString", date_to_date_string, 0),
880
+ JS_BUILTIN_FN("toTimeString", date_to_time_string, 0),
881
+ JS_BUILTIN_FN("toISOString", date_to_iso_string, 0),
882
+ JS_BUILTIN_FN("toUTCString", date_to_utc_string, 0),
883
+ JS_BUILTIN_ALIAS("toGMTString", "toUTCString"),
884
+ JS_BUILTIN_FN("getDate", date_get_date, 0),
885
+ JS_BUILTIN_FN("setDate", date_set_date, 1),
886
+ JS_BUILTIN_FN("getDay", date_get_day, 0),
887
+ JS_BUILTIN_FN("getFullYear", date_get_full_year, 0),
888
+ JS_BUILTIN_FN("setFullYear", date_set_full_year, 3),
889
+ JS_BUILTIN_FN("getHours", date_get_hours, 0),
890
+ JS_BUILTIN_FN("setHours", date_set_hours, 4),
891
+ JS_BUILTIN_FN("getMilliseconds", date_get_milliseconds, 0),
892
+ JS_BUILTIN_FN("setMilliseconds", date_set_milliseconds, 1),
893
+ JS_BUILTIN_FN("getMinutes", date_get_minutes, 0),
894
+ JS_BUILTIN_FN("setMinutes", date_set_minutes, 3),
895
+ JS_BUILTIN_FN("getMonth", date_get_month, 0),
896
+ JS_BUILTIN_FN("setMonth", date_set_month, 2),
897
+ JS_BUILTIN_FN("getSeconds", date_get_seconds, 0),
898
+ JS_BUILTIN_FN("setSeconds", date_set_seconds, 2),
899
+ JS_BUILTIN_FN("getTime", date_get_time, 0),
900
+ JS_BUILTIN_FN("setTime", date_set_time, 1),
901
+ JS_BUILTIN_FN("getTimezoneOffset", date_get_timezone_offset, 0),
902
+ JS_BUILTIN_FN("getUTCDate", date_get_utc_date, 0),
903
+ JS_BUILTIN_FN("setUTCDate", date_set_utc_date, 1),
904
+ JS_BUILTIN_FN("getUTCDay", date_get_utc_day, 0),
905
+ JS_BUILTIN_FN("getUTCFullYear", date_get_utc_full_year, 0),
906
+ JS_BUILTIN_FN("setUTCFullYear", date_set_utc_full_year, 3),
907
+ JS_BUILTIN_FN("getUTCHours", date_get_utc_hours, 0),
908
+ JS_BUILTIN_FN("setUTCHours", date_set_utc_hours, 4),
909
+ JS_BUILTIN_FN("getUTCMilliseconds", date_get_utc_milliseconds, 0),
910
+ JS_BUILTIN_FN("setUTCMilliseconds", date_set_utc_milliseconds, 1),
911
+ JS_BUILTIN_FN("getUTCMinutes", date_get_utc_minutes, 0),
912
+ JS_BUILTIN_FN("setUTCMinutes", date_set_utc_minutes, 3),
913
+ JS_BUILTIN_FN("getUTCMonth", date_get_utc_month, 0),
914
+ JS_BUILTIN_FN("setUTCMonth", date_set_utc_month, 2),
915
+ JS_BUILTIN_FN("getUTCSeconds", date_get_utc_seconds, 0),
916
+ JS_BUILTIN_FN("setUTCSeconds", date_set_utc_seconds, 2),
917
+ JS_BUILTIN_FN("valueOf", date_value_of, 0),
918
+ JS_BUILTIN_FN("getYear", date_get_year, 0),
919
+ JS_BUILTIN_FN("setYear", date_set_year, 1),
920
+ JS_BUILTIN_FN("toJSON", date_to_json, 1),
921
+ JS_BUILTIN_FN("toLocaleString", date_to_locale_string, 0),
922
+ JS_BUILTIN_FN("toLocaleDateString", date_to_locale_date_string, 0),
923
+ JS_BUILTIN_FN("toLocaleTimeString", date_to_locale_time_string, 0),
924
+ { NULL, &js_symbol_toPrimitive, JS_BUILTIN_KIND_FN, JS_PROP_CONFIGURABLE, 1, date_to_primitive, NULL, 0, NULL },
925
+ };
926
+
927
+ static void install_date(JSContext *ctx, JSObject *global) {
928
+ JSValue proto = js_new_object_proto(ctx, ctx->intrinsics[JS_INTRINSIC_OBJECT_PROTOTYPE], 8);
929
+ ctx->intrinsics[JS_INTRINSIC_DATE_PROTOTYPE] = proto;
930
+ JSValue key = js_atom_from_cstr(ctx, "Date");
931
+ JSValue c = js_new_native(ctx, date_ctor, key, 7, JS_FN_STRICT | JS_FN_CONSTRUCTOR);
932
+ js_define_data(ctx, js_as_object(c), JS_ATOM(prototype), proto, 0);
933
+ js_define_builtins(ctx, js_as_object(c), date_statics, JS_COUNTOF(date_statics));
934
+ js_define_data(ctx, js_as_object(proto), JS_ATOM(constructor), c, JS_BUILTIN_METHOD_ATTRS);
935
+ js_define_builtins(ctx, js_as_object(proto), date_proto, JS_COUNTOF(date_proto));
936
+ js_define_data(ctx, global, key, c, JS_BUILTIN_METHOD_ATTRS);
937
+ ctx->rt->date_inspect = date_inspect;
938
+ }
939
+
940
+ const JSComponent js_component_date = { "date", install_date };