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,721 @@
1
+ /* Promises (ECMAScript §27.2; ADR 0008): the promise object, reactions and their jobs,
2
+ * the Promise constructor, its statics and Promise.prototype. */
3
+ #include "js_promise.h"
4
+
5
+ #include "internal.h"
6
+ #include "js_atoms.h"
7
+ #include "js_error.h"
8
+ #include "js_function.h"
9
+ #include "js_generator.h"
10
+ #include "js_jobs.h"
11
+ #include "js_ops.h"
12
+ #include "js_symbol.h"
13
+ #include "jscontext.h"
14
+
15
+ #define ARG(i) ((i) < argc ? argv[i] : JS_UNDEFINED)
16
+ #define BUILTIN(fn) \
17
+ static JSValue fn(JSContext *ctx, JSValue callee, JSValue this_val, uint32_t argc, \
18
+ const JSValue *argv, JSValue new_target)
19
+ #define UNUSED_ARGS (void)ctx, (void)callee, (void)this_val, (void)argc, (void)argv, (void)new_target
20
+
21
+ /* The realm a builtin was created in: where its %Promise% comes from. */
22
+ #define REALM(callee) (js_as_function(callee)->realm)
23
+
24
+ static void promise_visit(JSCell *c, JSTracer *trc) {
25
+ JSPromise *p = (JSPromise *)c;
26
+ js_trace_value(trc, p->result);
27
+ js_trace_value(trc, p->reactions);
28
+ }
29
+
30
+ static const JSClass promise_class = { "Promise", sizeof(JSPromise), NULL, NULL, NULL, NULL, promise_visit, NULL, NULL };
31
+
32
+ bool js_is_promise(JSValue v) { return js_is_object(v) && js_as_object(v)->shape->cls == &promise_class; }
33
+
34
+ static JSValue alloc_promise(JSContext *ctx, JSValue proto) {
35
+ JSPromise *p = (JSPromise *)js_alloc_object(ctx, JS_CELL_OBJECT, js_shape_root(ctx, &promise_class, proto, 0));
36
+ js_init_slot(&p->result, JS_UNDEFINED);
37
+ js_init_slot(&p->reactions, JS_UNDEFINED);
38
+ p->state = JS_PROMISE_PENDING;
39
+ return js_object_value(&p->obj);
40
+ }
41
+
42
+ JSValue js_new_promise(JSContext *ctx) { return alloc_promise(ctx, ctx->intrinsics[JS_INTRINSIC_PROMISE_PROTOTYPE]); }
43
+
44
+ /* A builtin closure: `data` (any value) is kept in its home_object slot, which only
45
+ * compiled methods use otherwise. */
46
+ static JSValue native_with(JSContext *ctx, JSNativeFn fn, uint32_t length, JSValue data) {
47
+ JSValue f = js_new_native(ctx, fn, js_empty_string(), length, JS_FN_STRICT);
48
+ js_store(ctx, &js_as_function(f)->obj.cell, &js_as_function(f)->home_object, data);
49
+ return f;
50
+ }
51
+ static JSValue data_of(JSValue callee) { return js_as_function(callee)->home_object; }
52
+ static JSValue *record_of(JSValue callee) { return ((JSValueArray *)js_as_cell(data_of(callee)))->values; }
53
+
54
+ static JSValue new_record(JSContext *ctx, uint32_t n) {
55
+ JSValueArray *a = js_alloc_value_array(ctx, n);
56
+ for (uint32_t i = 0; i < n; i++) js_init_slot(&a->values[i], JS_UNDEFINED);
57
+ return js_cell(&a->cell);
58
+ }
59
+ static void record_set(JSContext *ctx, JSValue rec, uint32_t i, JSValue v) {
60
+ JSValueArray *a = (JSValueArray *)js_as_cell(rec);
61
+ js_store(ctx, &a->cell, &a->values[i], v);
62
+ }
63
+
64
+ /* ---- Reactions --------------------------------------------------------------------- */
65
+
66
+ /* One per then(): both handlers, and what to settle with the handler's result. */
67
+ enum { REACTION_THEN, REACTION_AWAIT };
68
+
69
+ typedef struct Reaction {
70
+ JSHostCell host;
71
+ uint8_t kind; /* AWAIT: on_fulfilled is the async state to resume */
72
+ JSValue on_fulfilled; /* a function, or EMPTY: the value passes through */
73
+ JSValue on_rejected; /* a function, or EMPTY: the reason passes through */
74
+ JSValue capability; /* the derived promise (settled directly), a Capability cell, or undefined */
75
+ JSValue next; /* the next (older) reaction, or undefined */
76
+ } Reaction;
77
+
78
+ static void reaction_visit(JSCell *c, JSTracer *trc) {
79
+ Reaction *r = (Reaction *)c;
80
+ js_trace_value(trc, r->on_fulfilled);
81
+ js_trace_value(trc, r->on_rejected);
82
+ js_trace_value(trc, r->capability);
83
+ js_trace_value(trc, r->next);
84
+ }
85
+ static const JSCellClass reaction_class = { "PromiseReaction", reaction_visit, NULL };
86
+
87
+ static void enqueue_reaction(JSContext *ctx, JSValue reaction, JSValue argument, int state) {
88
+ JSJob job = { JS_JOB_PROMISE_REACTION, NULL, reaction, argument, js_int32(state) };
89
+ js_enqueue_microtask(ctx, &job);
90
+ }
91
+
92
+ /* FulfillPromise / RejectPromise (§27.2.1.4, §27.2.1.7) and TriggerPromiseReactions. */
93
+ static void settle(JSContext *ctx, JSValue promise, int state, JSValue v) {
94
+ JSPromise *p = js_as_promise(promise);
95
+ JSValue list = p->reactions;
96
+ js_store(ctx, &p->obj.cell, &p->result, v);
97
+ js_store(ctx, &p->obj.cell, &p->reactions, JS_UNDEFINED);
98
+ p->state = (uint8_t)state;
99
+ if (state == JS_PROMISE_REJECTED && !p->is_handled) js_track_rejection(ctx, promise, true);
100
+ JSValue ordered = JS_UNDEFINED; /* the list is newest first: reverse it */
101
+ while (!js_is_undefined(list)) {
102
+ Reaction *r = (Reaction *)js_as_cell(list);
103
+ JSValue next = r->next;
104
+ js_store(ctx, &r->host.cell, &r->next, ordered);
105
+ ordered = list;
106
+ list = next;
107
+ }
108
+ for (; !js_is_undefined(ordered); ordered = ((Reaction *)js_as_cell(ordered))->next)
109
+ enqueue_reaction(ctx, ordered, v, state);
110
+ }
111
+
112
+ /* The body of a promise resolve function (§27.2.1.3.2), after its alreadyResolved check. */
113
+ static void resolve(JSContext *ctx, JSValue promise, JSValue resolution) {
114
+ if (js_same_bits(resolution, promise)) {
115
+ JSValue e = js_new_error(ctx, JS_TYPE_ERROR, js_new_string_cstr(ctx, "Chaining cycle detected for promise #<Promise>"));
116
+ settle(ctx, promise, JS_PROMISE_REJECTED, e);
117
+ return;
118
+ }
119
+ if (!js_is_object(resolution)) {
120
+ settle(ctx, promise, JS_PROMISE_FULFILLED, resolution);
121
+ return;
122
+ }
123
+ JSValue then = js_get_value(ctx, resolution, JS_ATOM(then));
124
+ if (js_is_exception(then)) {
125
+ settle(ctx, promise, JS_PROMISE_REJECTED, js_take_exception(ctx));
126
+ return;
127
+ }
128
+ if (!js_is_callable(then)) {
129
+ settle(ctx, promise, JS_PROMISE_FULFILLED, resolution);
130
+ return;
131
+ }
132
+ JSJob job = { JS_JOB_RESOLVE_THENABLE, NULL, promise, resolution, then };
133
+ js_enqueue_microtask(ctx, &job);
134
+ }
135
+
136
+ void js_promise_resolve_internal(JSContext *ctx, JSValue promise, JSValue resolution) {
137
+ JSPromise *p = js_as_promise(promise);
138
+ if (p->already_resolved) return;
139
+ p->already_resolved = 1;
140
+ resolve(ctx, promise, resolution);
141
+ }
142
+
143
+ void js_promise_reject_internal(JSContext *ctx, JSValue promise, JSValue reason) {
144
+ JSPromise *p = js_as_promise(promise);
145
+ if (p->already_resolved) return;
146
+ p->already_resolved = 1;
147
+ settle(ctx, promise, JS_PROMISE_REJECTED, reason);
148
+ }
149
+
150
+ /* ---- Resolving functions (§27.2.1.3) ----------------------------------------------- */
151
+
152
+ /* Both share a record: [promise, alreadyResolved]. */
153
+ BUILTIN(resolve_function) {
154
+ (void)this_val, (void)new_target;
155
+ JSValue *rec = record_of(callee);
156
+ if (js_truthy(rec[1])) return JS_UNDEFINED;
157
+ record_set(ctx, data_of(callee), 1, JS_TRUE);
158
+ resolve(ctx, rec[0], ARG(0));
159
+ return JS_UNDEFINED;
160
+ }
161
+
162
+ BUILTIN(reject_function) {
163
+ (void)this_val, (void)new_target;
164
+ JSValue *rec = record_of(callee);
165
+ if (js_truthy(rec[1])) return JS_UNDEFINED;
166
+ record_set(ctx, data_of(callee), 1, JS_TRUE);
167
+ settle(ctx, rec[0], JS_PROMISE_REJECTED, ARG(0));
168
+ return JS_UNDEFINED;
169
+ }
170
+
171
+ static void resolving_functions(JSContext *ctx, JSValue promise, JSValue out[2]) {
172
+ JSValue rec = new_record(ctx, 2);
173
+ record_set(ctx, rec, 0, promise);
174
+ record_set(ctx, rec, 1, JS_FALSE);
175
+ out[0] = native_with(ctx, resolve_function, 1, rec);
176
+ out[1] = native_with(ctx, reject_function, 1, rec);
177
+ }
178
+
179
+ /* ---- Capabilities (§27.2.1.5) -------------------------------------------------------- */
180
+
181
+ /* A PromiseCapability. resolve and reject EMPTY: the promise is native and settled
182
+ * directly (js_promise_*_internal); nothing outside the runtime can see the difference. */
183
+ typedef struct Cap {
184
+ JSValue promise, resolve, reject;
185
+ } Cap;
186
+
187
+ typedef struct Capability {
188
+ JSHostCell host;
189
+ JSValue promise, resolve, reject;
190
+ } Capability;
191
+
192
+ static void capability_visit(JSCell *c, JSTracer *trc) {
193
+ Capability *k = (Capability *)c;
194
+ js_trace_value(trc, k->promise);
195
+ js_trace_value(trc, k->resolve);
196
+ js_trace_value(trc, k->reject);
197
+ }
198
+ static const JSCellClass capability_class = { "PromiseCapability", capability_visit, NULL };
199
+
200
+ /* As a value for a reaction: the promise itself when it is settled directly. */
201
+ static JSValue cap_store(JSContext *ctx, const Cap *cap) {
202
+ if (js_is_empty(cap->resolve)) return cap->promise;
203
+ Capability *k = (Capability *)js_alloc_host_cell(ctx, &capability_class, sizeof(Capability));
204
+ js_store(ctx, &k->host.cell, &k->promise, cap->promise);
205
+ js_store(ctx, &k->host.cell, &k->resolve, cap->resolve);
206
+ js_store(ctx, &k->host.cell, &k->reject, cap->reject);
207
+ return js_cell(&k->host.cell);
208
+ }
209
+
210
+ static Cap cap_load(JSValue v) {
211
+ if (js_is_object(v)) return (Cap){ v, JS_EMPTY, JS_EMPTY };
212
+ Capability *k = (Capability *)js_as_cell(v);
213
+ return (Cap){ k->promise, k->resolve, k->reject };
214
+ }
215
+
216
+ static JSValue cap_resolve(JSContext *ctx, const Cap *cap, JSValue v) {
217
+ if (!js_is_empty(cap->resolve)) return js_call(ctx, cap->resolve, JS_UNDEFINED, 1, &v);
218
+ js_promise_resolve_internal(ctx, cap->promise, v);
219
+ return JS_UNDEFINED;
220
+ }
221
+
222
+ static JSValue cap_reject(JSContext *ctx, const Cap *cap, JSValue v) {
223
+ if (!js_is_empty(cap->reject)) return js_call(ctx, cap->reject, JS_UNDEFINED, 1, &v);
224
+ js_promise_reject_internal(ctx, cap->promise, v);
225
+ return JS_UNDEFINED;
226
+ }
227
+
228
+ /* The executor NewPromiseCapability passes to C: it keeps C's resolve and reject in
229
+ * its record [resolve, reject]. */
230
+ BUILTIN(capability_executor) {
231
+ (void)this_val, (void)new_target;
232
+ JSValue *rec = record_of(callee);
233
+ if (!js_is_undefined(rec[0]) || !js_is_undefined(rec[1]))
234
+ return js_throw_type_error(ctx, "Promise executor has already been invoked with non-undefined arguments");
235
+ record_set(ctx, data_of(callee), 0, ARG(0));
236
+ record_set(ctx, data_of(callee), 1, ARG(1));
237
+ return JS_UNDEFINED;
238
+ }
239
+
240
+ static bool is_intrinsic_promise(JSValue c);
241
+
242
+ /* NewPromiseCapability(C). `functions`: resolve and reject must be real functions
243
+ * (they are handed to user code). %Promise% itself takes a shortcut: constructing it
244
+ * is unobservable. 0, or -1 on exception. */
245
+ static int new_capability(JSContext *ctx, JSValue c, Cap *cap, bool functions) {
246
+ if (is_intrinsic_promise(c)) {
247
+ JSContext *realm = js_as_function(c)->realm;
248
+ cap->promise = alloc_promise(ctx, realm->intrinsics[JS_INTRINSIC_PROMISE_PROTOTYPE]);
249
+ cap->resolve = cap->reject = JS_EMPTY;
250
+ if (functions) {
251
+ JSValue fns[2];
252
+ resolving_functions(ctx, cap->promise, fns);
253
+ cap->resolve = fns[0];
254
+ cap->reject = fns[1];
255
+ }
256
+ return 0;
257
+ }
258
+ if (!js_is_constructor(c)) {
259
+ js_discard(js_throw_type_error(ctx, "Promise capability constructor is not a constructor"));
260
+ return -1;
261
+ }
262
+ JSValue rec = new_record(ctx, 2);
263
+ JSValue executor = native_with(ctx, capability_executor, 2, rec);
264
+ JSValue promise = js_construct(ctx, c, 1, &executor, c, NULL);
265
+ if (js_is_exception(promise)) return -1;
266
+ JSValue *fns = ((JSValueArray *)js_as_cell(rec))->values;
267
+ if (!js_is_callable(fns[0]) || !js_is_callable(fns[1])) {
268
+ js_discard(js_throw_type_error(ctx, "Promise resolve or reject function is not callable"));
269
+ return -1;
270
+ }
271
+ *cap = (Cap){ promise, fns[0], fns[1] };
272
+ return 0;
273
+ }
274
+
275
+ /* ---- then (§27.2.5.4.1 PerformPromiseThen) and the jobs ----------------------------- */
276
+
277
+ static void add_reaction(JSContext *ctx, JSValue promise, Reaction *r);
278
+
279
+ static void perform_then(JSContext *ctx, JSValue promise, JSValue on_fulfilled, JSValue on_rejected, JSValue capability) {
280
+ Reaction *r = (Reaction *)js_alloc_host_cell(ctx, &reaction_class, sizeof(Reaction));
281
+ r->kind = REACTION_THEN;
282
+ js_init_slot(&r->on_fulfilled, js_is_callable(on_fulfilled) ? on_fulfilled : JS_EMPTY);
283
+ js_init_slot(&r->on_rejected, js_is_callable(on_rejected) ? on_rejected : JS_EMPTY);
284
+ js_init_slot(&r->capability, capability);
285
+ js_init_slot(&r->next, JS_UNDEFINED);
286
+ add_reaction(ctx, promise, r);
287
+ }
288
+
289
+ void js_promise_then_internal(JSContext *ctx, JSValue promise, JSValue on_fulfilled, JSValue on_rejected, JSValue derived) {
290
+ perform_then(ctx, promise, on_fulfilled, on_rejected, derived);
291
+ }
292
+
293
+ void js_promise_await(JSContext *ctx, JSValue promise, JSValue gen) {
294
+ Reaction *r = (Reaction *)js_alloc_host_cell(ctx, &reaction_class, sizeof(Reaction));
295
+ r->kind = REACTION_AWAIT;
296
+ js_init_slot(&r->on_fulfilled, gen);
297
+ js_init_slot(&r->on_rejected, JS_EMPTY);
298
+ js_init_slot(&r->capability, JS_UNDEFINED);
299
+ js_init_slot(&r->next, JS_UNDEFINED);
300
+ add_reaction(ctx, promise, r);
301
+ }
302
+
303
+ static void add_reaction(JSContext *ctx, JSValue promise, Reaction *r) {
304
+ JSValue reaction = js_cell(&r->host.cell);
305
+ JSPromise *p = js_as_promise(promise);
306
+ if (p->state == JS_PROMISE_PENDING) {
307
+ js_store(ctx, &r->host.cell, &r->next, p->reactions);
308
+ js_store(ctx, &p->obj.cell, &p->reactions, reaction);
309
+ } else {
310
+ if (p->state == JS_PROMISE_REJECTED && !p->is_handled) js_track_rejection(ctx, promise, false);
311
+ enqueue_reaction(ctx, reaction, p->result, p->state);
312
+ }
313
+ p->is_handled = 1;
314
+ }
315
+
316
+ /* NewPromiseReactionJob (§27.2.2.1): a handler's throw rejects the derived promise; only
317
+ * a throwing resolve or reject of a foreign capability escapes, as an uncaught error. */
318
+ int js_promise_reaction_job(JSContext *ctx, JSValue reaction, JSValue argument, JSValue state) {
319
+ Reaction *r = (Reaction *)js_as_cell(reaction);
320
+ bool rejected = js_as_int32(state) == JS_PROMISE_REJECTED;
321
+ if (r->kind == REACTION_AWAIT) { /* resume the async call; its outcome settles its own promise */
322
+ js_async_resume(ctx, js_as_generator(r->on_fulfilled), argument, rejected ? JS_RESUME_THROW : JS_RESUME_NEXT);
323
+ return 0;
324
+ }
325
+ JSValue handler = rejected ? r->on_rejected : r->on_fulfilled;
326
+ JSValue result = argument;
327
+ bool threw = rejected;
328
+ if (!js_is_empty(handler)) {
329
+ result = js_call(ctx, handler, JS_UNDEFINED, 1, &argument);
330
+ threw = js_is_exception(result);
331
+ if (threw) result = js_take_exception(ctx);
332
+ }
333
+ if (js_is_undefined(r->capability)) return 0;
334
+ Cap cap = cap_load(r->capability);
335
+ JSValue s = threw ? cap_reject(ctx, &cap, result) : cap_resolve(ctx, &cap, result);
336
+ return js_is_exception(s) ? -1 : 0;
337
+ }
338
+
339
+ /* NewPromiseResolveThenableJob (§27.2.2.2): thenable.then(resolve, reject). */
340
+ int js_promise_thenable_job(JSContext *ctx, JSValue promise, JSValue thenable, JSValue then) {
341
+ JSValue fns[2];
342
+ resolving_functions(ctx, promise, fns);
343
+ JSValue r = js_call(ctx, then, thenable, 2, fns);
344
+ if (js_is_exception(r)) {
345
+ JSValue e = js_take_exception(ctx);
346
+ r = js_call(ctx, fns[1], JS_UNDEFINED, 1, &e);
347
+ if (js_is_exception(r)) return -1;
348
+ }
349
+ return 0;
350
+ }
351
+
352
+ /* ---- Helpers ------------------------------------------------------------------------ */
353
+
354
+ /* Invoke(v, "then", args). */
355
+ static JSValue invoke_then(JSContext *ctx, JSValue v, uint32_t argc, const JSValue *argv) {
356
+ JSValue then = js_get_value(ctx, v, JS_ATOM(then));
357
+ if (js_is_exception(then)) return JS_EXCEPTION;
358
+ return js_call_site(ctx, then, v, argc, argv, "then");
359
+ }
360
+
361
+ /* PromiseResolve(C, x) (§27.2.4.7.1). */
362
+ static JSValue promise_resolve(JSContext *ctx, JSValue c, JSValue x) {
363
+ if (js_is_promise(x)) {
364
+ JSValue xc = js_get_value(ctx, x, JS_ATOM(constructor));
365
+ if (js_is_exception(xc)) return JS_EXCEPTION;
366
+ if (js_same_bits(xc, c)) return x;
367
+ }
368
+ Cap cap;
369
+ if (new_capability(ctx, c, &cap, false) < 0) return JS_EXCEPTION;
370
+ if (js_is_exception(cap_resolve(ctx, &cap, x))) return JS_EXCEPTION;
371
+ return cap.promise;
372
+ }
373
+
374
+ JSValue js_promise_resolve(JSContext *ctx, JSValue v) {
375
+ return promise_resolve(ctx, ctx->intrinsics[JS_INTRINSIC_PROMISE], v);
376
+ }
377
+
378
+ /* SpeciesConstructor(o, default) (§7.3.22). */
379
+ static JSValue species_constructor(JSContext *ctx, JSValue o, JSValue fallback) {
380
+ JSValue c = js_get_value(ctx, o, JS_ATOM(constructor));
381
+ if (js_is_exception(c)) return JS_EXCEPTION;
382
+ if (js_is_undefined(c)) return fallback;
383
+ if (!js_is_object(c)) return js_throw_type_error(ctx, "The .constructor property is not an object");
384
+ JSValue s = js_get_value(ctx, c, JS_SYMBOL(species));
385
+ if (js_is_exception(s)) return JS_EXCEPTION;
386
+ if (js_is_nullish(s)) return fallback;
387
+ if (js_is_constructor(s)) return s;
388
+ return js_throw_type_error(ctx, "object.constructor[Symbol.species] is not a constructor");
389
+ }
390
+
391
+ /* IfAbruptRejectPromise: rejects the capability with the pending exception. */
392
+ static JSValue reject_abrupt(JSContext *ctx, const Cap *cap) {
393
+ JSValue e = js_take_exception(ctx);
394
+ if (js_is_exception(cap_reject(ctx, cap, e))) return JS_EXCEPTION;
395
+ return cap->promise;
396
+ }
397
+
398
+ static JSValue this_constructor(JSContext *ctx, JSValue this_val, const char *method) {
399
+ if (js_is_object(this_val)) return this_val;
400
+ return js_throw_type_error(ctx, "%s called on non-object", method);
401
+ }
402
+
403
+ /* ---- The constructor and its statics (§27.2.3, §27.2.4) ---------------------------- */
404
+
405
+ BUILTIN(promise_ctor) {
406
+ (void)this_val;
407
+ if (js_is_undefined(new_target)) return js_throw_type_error(ctx, "Promise constructor cannot be invoked without 'new'");
408
+ JSValue executor = ARG(0);
409
+ if (!js_is_callable(executor)) return js_throw_type_error(ctx, "Promise resolver is not a function");
410
+ JSValue proto = js_get_prototype_from_constructor(ctx, new_target, JS_INTRINSIC_PROMISE_PROTOTYPE);
411
+ if (js_is_exception(proto)) return JS_EXCEPTION;
412
+ JSValue promise = alloc_promise(ctx, proto);
413
+ JSValue fns[2];
414
+ resolving_functions(ctx, promise, fns);
415
+ JSValue r = js_call(ctx, executor, JS_UNDEFINED, 2, fns);
416
+ if (js_is_exception(r)) {
417
+ JSValue e = js_take_exception(ctx);
418
+ if (js_is_exception(js_call(ctx, fns[1], JS_UNDEFINED, 1, &e))) return JS_EXCEPTION;
419
+ }
420
+ (void)callee;
421
+ return promise;
422
+ }
423
+
424
+ static bool is_intrinsic_promise(JSValue c) { return js_is_function(c) && js_as_function(c)->entry == promise_ctor; }
425
+
426
+ BUILTIN(promise_resolve_static) {
427
+ (void)callee, (void)new_target;
428
+ JSValue c = this_constructor(ctx, this_val, "Promise.resolve");
429
+ if (js_is_exception(c)) return JS_EXCEPTION;
430
+ return promise_resolve(ctx, c, ARG(0));
431
+ }
432
+
433
+ BUILTIN(promise_reject_static) {
434
+ (void)callee, (void)new_target;
435
+ Cap cap;
436
+ if (new_capability(ctx, this_val, &cap, false) < 0) return JS_EXCEPTION;
437
+ if (js_is_exception(cap_reject(ctx, &cap, ARG(0)))) return JS_EXCEPTION;
438
+ return cap.promise;
439
+ }
440
+
441
+ BUILTIN(promise_with_resolvers) {
442
+ (void)callee, (void)argc, (void)argv, (void)new_target;
443
+ Cap cap;
444
+ if (new_capability(ctx, this_val, &cap, true) < 0) return JS_EXCEPTION;
445
+ JSValue o = js_new_object(ctx);
446
+ js_define_data(ctx, js_as_object(o), js_atom_from_cstr(ctx, "promise"), cap.promise, JS_PROP_DEFAULT);
447
+ js_define_data(ctx, js_as_object(o), js_atom_from_cstr(ctx, "resolve"), cap.resolve, JS_PROP_DEFAULT);
448
+ js_define_data(ctx, js_as_object(o), js_atom_from_cstr(ctx, "reject"), cap.reject, JS_PROP_DEFAULT);
449
+ return o;
450
+ }
451
+
452
+ /* Promise.try(callback, ...args) (ES2025) */
453
+ BUILTIN(promise_try) {
454
+ (void)callee, (void)new_target;
455
+ JSValue c = this_constructor(ctx, this_val, "Promise.try");
456
+ if (js_is_exception(c)) return JS_EXCEPTION;
457
+ Cap cap;
458
+ if (new_capability(ctx, c, &cap, false) < 0) return JS_EXCEPTION;
459
+ JSValue r = js_call(ctx, ARG(0), JS_UNDEFINED, argc > 1 ? argc - 1 : 0, argc > 1 ? argv + 1 : NULL);
460
+ if (js_is_exception(r)) return reject_abrupt(ctx, &cap);
461
+ if (js_is_exception(cap_resolve(ctx, &cap, r))) return JS_EXCEPTION;
462
+ return cap.promise;
463
+ }
464
+
465
+ BUILTIN(promise_species) {
466
+ UNUSED_ARGS;
467
+ return this_val;
468
+ }
469
+
470
+ /* ---- Promise.all, allSettled, any, race (§27.2.4.1–5) -------------------------------- */
471
+
472
+ enum { ALL, ALL_SETTLED, ANY, RACE };
473
+
474
+ /* What the element functions share: [values, promise, resolve, reject, remaining]. */
475
+ enum { ST_VALUES, ST_PROMISE, ST_RESOLVE, ST_REJECT, ST_REMAINING, ST_SIZE };
476
+ /* Each element's record: [state, index, alreadyCalled]. */
477
+ enum { EL_STATE, EL_INDEX, EL_CALLED, EL_SIZE };
478
+
479
+ /* remaining -= 1; at zero, settle with the values (ANY: reject with an AggregateError). */
480
+ static JSValue element_done(JSContext *ctx, JSValue st, bool any) {
481
+ JSValue *s = ((JSValueArray *)js_as_cell(st))->values;
482
+ int32_t remaining = js_as_int32(s[ST_REMAINING]) - 1;
483
+ record_set(ctx, st, ST_REMAINING, js_int32(remaining));
484
+ if (remaining) return JS_UNDEFINED;
485
+ JSValue values = s[ST_VALUES];
486
+ if (!any) return js_call(ctx, s[ST_RESOLVE], JS_UNDEFINED, 1, &values);
487
+ JSValue e = js_new_error(ctx, JS_AGGREGATE_ERROR, js_new_string_cstr(ctx, "All promises were rejected"));
488
+ js_define_data(ctx, js_as_object(e), js_atom_from_cstr(ctx, "errors"), values, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
489
+ return js_call(ctx, s[ST_REJECT], JS_UNDEFINED, 1, &e);
490
+ }
491
+
492
+ /* Stores x at the element's index, once; then element_done. */
493
+ static JSValue element_call(JSContext *ctx, JSValue callee, JSValue x, bool any) {
494
+ JSValue *el = record_of(callee);
495
+ if (js_truthy(el[EL_CALLED])) return JS_UNDEFINED;
496
+ record_set(ctx, data_of(callee), EL_CALLED, JS_TRUE);
497
+ JSValue st = el[EL_STATE];
498
+ JSValue values = ((JSValueArray *)js_as_cell(st))->values[ST_VALUES];
499
+ JSPropertyDescriptor d = js_data_descriptor(x, JS_PROP_DEFAULT);
500
+ if (js_define_own_property(ctx, js_as_object(values), el[EL_INDEX], &d, true) < 0) return JS_EXCEPTION;
501
+ return element_done(ctx, st, any);
502
+ }
503
+
504
+ /* allSettled's { status, value } / { status, reason }. */
505
+ static JSValue settled_record(JSContext *ctx, bool fulfilled, JSValue x) {
506
+ JSValue o = js_new_object(ctx);
507
+ js_define_data(ctx, js_as_object(o), js_atom_from_cstr(ctx, "status"), js_new_string_cstr(ctx, fulfilled ? "fulfilled" : "rejected"), JS_PROP_DEFAULT);
508
+ js_define_data(ctx, js_as_object(o), fulfilled ? JS_ATOM(value) : js_atom_from_cstr(ctx, "reason"), x, JS_PROP_DEFAULT);
509
+ return o;
510
+ }
511
+
512
+ BUILTIN(all_resolve_element) {
513
+ (void)this_val, (void)new_target;
514
+ return element_call(ctx, callee, ARG(0), false);
515
+ }
516
+ BUILTIN(settled_fulfilled_element) {
517
+ (void)this_val, (void)new_target;
518
+ return element_call(ctx, callee, settled_record(ctx, true, ARG(0)), false);
519
+ }
520
+ BUILTIN(settled_rejected_element) {
521
+ (void)this_val, (void)new_target;
522
+ return element_call(ctx, callee, settled_record(ctx, false, ARG(0)), false);
523
+ }
524
+ BUILTIN(any_reject_element) {
525
+ (void)this_val, (void)new_target;
526
+ return element_call(ctx, callee, ARG(0), true);
527
+ }
528
+
529
+ /* PerformPromiseAll / AllSettled / Any / Race: the loop over the iterator. */
530
+ static JSValue perform_combinator(JSContext *ctx, int kind, JSValue rec, JSValue c, const Cap *cap, JSValue promise_resolve_fn) {
531
+ JSValue st = new_record(ctx, ST_SIZE);
532
+ record_set(ctx, st, ST_VALUES, js_new_array(ctx, 0));
533
+ record_set(ctx, st, ST_PROMISE, cap->promise);
534
+ record_set(ctx, st, ST_RESOLVE, cap->resolve);
535
+ record_set(ctx, st, ST_REJECT, cap->reject);
536
+ record_set(ctx, st, ST_REMAINING, js_int32(1));
537
+ JSValue values = ((JSValueArray *)js_as_cell(st))->values[ST_VALUES];
538
+ for (uint32_t index = 0;; index++) {
539
+ JSValue next = js_iter_next(ctx, rec);
540
+ if (js_is_exception(next)) return JS_EXCEPTION;
541
+ if (js_is_empty(next)) {
542
+ if (kind == RACE) return cap->promise;
543
+ JSValue r = element_done(ctx, st, kind == ANY);
544
+ return js_is_exception(r) ? JS_EXCEPTION : cap->promise;
545
+ }
546
+ JSValue next_promise = js_call(ctx, promise_resolve_fn, c, 1, &next);
547
+ if (js_is_exception(next_promise)) return JS_EXCEPTION;
548
+ JSValue handlers[2] = { cap->resolve, cap->reject };
549
+ if (kind != RACE) {
550
+ if (js_array_push(ctx, js_as_object(values), JS_UNDEFINED) < 0) return JS_EXCEPTION;
551
+ JSValue el = new_record(ctx, EL_SIZE);
552
+ record_set(ctx, el, EL_STATE, st);
553
+ record_set(ctx, el, EL_INDEX, js_index_key(index));
554
+ record_set(ctx, el, EL_CALLED, JS_FALSE);
555
+ if (kind == ALL) handlers[0] = native_with(ctx, all_resolve_element, 1, el);
556
+ else if (kind == ANY) handlers[1] = native_with(ctx, any_reject_element, 1, el);
557
+ else {
558
+ handlers[0] = native_with(ctx, settled_fulfilled_element, 1, el);
559
+ handlers[1] = native_with(ctx, settled_rejected_element, 1, el);
560
+ }
561
+ JSValue *s = ((JSValueArray *)js_as_cell(st))->values;
562
+ record_set(ctx, st, ST_REMAINING, js_int32(js_as_int32(s[ST_REMAINING]) + 1));
563
+ }
564
+ if (js_is_exception(invoke_then(ctx, next_promise, 2, handlers))) return JS_EXCEPTION;
565
+ }
566
+ }
567
+
568
+ static JSValue combinator(JSContext *ctx, JSValue c, JSValue iterable, int kind) {
569
+ Cap cap;
570
+ if (new_capability(ctx, c, &cap, true) < 0) return JS_EXCEPTION;
571
+ /* GetPromiseResolve (§27.2.4.1.1) */
572
+ JSValue promise_resolve_fn = js_get_value(ctx, c, js_atom_from_cstr(ctx, "resolve"));
573
+ if (js_is_exception(promise_resolve_fn)) return reject_abrupt(ctx, &cap);
574
+ if (!js_is_callable(promise_resolve_fn)) {
575
+ js_discard(js_throw_type_error(ctx, "Promise resolve is not a function"));
576
+ return reject_abrupt(ctx, &cap);
577
+ }
578
+ JSValue rec = js_iter_start(ctx, iterable);
579
+ if (js_is_exception(rec)) return reject_abrupt(ctx, &cap);
580
+ JSValue r = perform_combinator(ctx, kind, rec, c, &cap, promise_resolve_fn);
581
+ if (!js_is_exception(r)) return r;
582
+ JSValue e = js_take_exception(ctx);
583
+ js_iter_close_throw(ctx, rec); /* unless the iterator itself failed (then it is done) */
584
+ js_discard(js_throw(ctx, e));
585
+ return reject_abrupt(ctx, &cap);
586
+ }
587
+
588
+ #define COMBINATOR(fn, kind) \
589
+ BUILTIN(fn) { \
590
+ (void)callee, (void)new_target; \
591
+ return combinator(ctx, this_val, ARG(0), kind); \
592
+ }
593
+ COMBINATOR(promise_all, ALL)
594
+ COMBINATOR(promise_all_settled, ALL_SETTLED)
595
+ COMBINATOR(promise_any, ANY)
596
+ COMBINATOR(promise_race, RACE)
597
+
598
+ /* ---- Promise.prototype (§27.2.5) ------------------------------------------------------- */
599
+
600
+ /* An own data property's value, or EMPTY (none, or an accessor), without running code. */
601
+ static JSValue own_data(JSObject *o, JSValue key) {
602
+ uint8_t attrs;
603
+ int32_t slot = js_shape_find(o->shape, key, &attrs);
604
+ return slot < 0 || (attrs & JS_PROP_ACCESSOR) ? JS_EMPTY : *js_object_slot(o, (uint32_t)slot);
605
+ }
606
+
607
+ /* SpeciesConstructor(p, %Promise%) without the lookups when it can only be %Promise%: p has no
608
+ * own properties and inherits from %Promise.prototype%, whose `constructor` is still %Promise%,
609
+ * whose @@species is still the original getter (which returns `this`). */
610
+ static bool species_is_intrinsic(JSContext *realm, JSValue promise) {
611
+ JSObject *o = js_as_object(promise);
612
+ JSValue proto = realm->intrinsics[JS_INTRINSIC_PROMISE_PROTOTYPE];
613
+ JSValue ctor = realm->intrinsics[JS_INTRINSIC_PROMISE];
614
+ if (o->shape->prop_count != 0 || !js_same_bits(o->shape->proto, proto) || (o->shape->flags & JS_SHAPE_DICTIONARY)) return false;
615
+ if (!js_same_bits(own_data(js_as_object(proto), JS_ATOM(constructor)), ctor)) return false;
616
+ uint8_t attrs;
617
+ JSObject *c = js_as_object(ctor);
618
+ int32_t slot = js_shape_find(c->shape, JS_SYMBOL(species), &attrs);
619
+ if (slot < 0 || !(attrs & JS_PROP_ACCESSOR)) return false;
620
+ JSAccessorPair *pair = (JSAccessorPair *)js_as_cell(*js_object_slot(c, (uint32_t)slot));
621
+ return js_same_bits(pair->get, realm->intrinsics[JS_INTRINSIC_PROMISE_SPECIES_GETTER]);
622
+ }
623
+
624
+ BUILTIN(promise_proto_then) {
625
+ (void)new_target;
626
+ if (!js_is_promise(this_val))
627
+ return js_throw_type_error(ctx, "Method Promise.prototype.then called on incompatible receiver");
628
+ JSContext *realm = REALM(callee);
629
+ JSValue c = species_is_intrinsic(realm, this_val) ? realm->intrinsics[JS_INTRINSIC_PROMISE]
630
+ : species_constructor(ctx, this_val, realm->intrinsics[JS_INTRINSIC_PROMISE]);
631
+ if (js_is_exception(c)) return JS_EXCEPTION;
632
+ Cap cap;
633
+ if (new_capability(ctx, c, &cap, false) < 0) return JS_EXCEPTION;
634
+ perform_then(ctx, this_val, ARG(0), ARG(1), cap_store(ctx, &cap));
635
+ return cap.promise;
636
+ }
637
+
638
+ BUILTIN(promise_proto_catch) {
639
+ (void)callee, (void)new_target;
640
+ JSValue args[2] = { JS_UNDEFINED, ARG(0) };
641
+ return invoke_then(ctx, this_val, 2, args);
642
+ }
643
+
644
+ /* finally's helpers: a thunk returning its value, and one throwing it. */
645
+ BUILTIN(value_thunk) {
646
+ UNUSED_ARGS;
647
+ return data_of(callee);
648
+ }
649
+ BUILTIN(thrower) {
650
+ (void)this_val, (void)argc, (void)argv, (void)new_target;
651
+ return js_throw(ctx, data_of(callee));
652
+ }
653
+
654
+ /* Then Finally / Catch Finally (§27.2.5.3.1–2): record [onFinally, C]. */
655
+ static JSValue finally_step(JSContext *ctx, JSValue callee, JSValue arg, bool rejected) {
656
+ JSValue *rec = record_of(callee);
657
+ JSValue result = js_call(ctx, rec[0], JS_UNDEFINED, 0, NULL);
658
+ if (js_is_exception(result)) return JS_EXCEPTION;
659
+ JSValue p = promise_resolve(ctx, rec[1], result);
660
+ if (js_is_exception(p)) return JS_EXCEPTION;
661
+ JSValue thunk = native_with(ctx, rejected ? thrower : value_thunk, 0, arg);
662
+ return invoke_then(ctx, p, 1, &thunk);
663
+ }
664
+ BUILTIN(then_finally) {
665
+ (void)this_val, (void)new_target;
666
+ return finally_step(ctx, callee, ARG(0), false);
667
+ }
668
+ BUILTIN(catch_finally) {
669
+ (void)this_val, (void)new_target;
670
+ return finally_step(ctx, callee, ARG(0), true);
671
+ }
672
+
673
+ BUILTIN(promise_proto_finally) {
674
+ (void)new_target;
675
+ if (!js_is_object(this_val)) return js_throw_type_error(ctx, "Promise.prototype.finally called on non-object");
676
+ JSValue c = species_constructor(ctx, this_val, REALM(callee)->intrinsics[JS_INTRINSIC_PROMISE]);
677
+ if (js_is_exception(c)) return JS_EXCEPTION;
678
+ JSValue on_finally = ARG(0);
679
+ JSValue handlers[2] = { on_finally, on_finally };
680
+ if (js_is_callable(on_finally)) {
681
+ JSValue rec = new_record(ctx, 2);
682
+ record_set(ctx, rec, 0, on_finally);
683
+ record_set(ctx, rec, 1, c);
684
+ handlers[0] = native_with(ctx, then_finally, 1, rec);
685
+ handlers[1] = native_with(ctx, catch_finally, 1, rec);
686
+ }
687
+ return invoke_then(ctx, this_val, 2, handlers);
688
+ }
689
+
690
+ /* ---- Realm ------------------------------------------------------------------------------ */
691
+
692
+ void js_promise_realm_init(JSContext *ctx, JSObject *global) {
693
+ JSValue *in = ctx->intrinsics;
694
+ JSValue proto = js_new_object_proto(ctx, in[JS_INTRINSIC_OBJECT_PROTOTYPE], 8);
695
+ in[JS_INTRINSIC_PROMISE_PROTOTYPE] = proto;
696
+ JSValue ctor = js_new_native(ctx, promise_ctor, js_atom_from_cstr(ctx, "Promise"), 1, JS_FN_STRICT | JS_FN_CONSTRUCTOR);
697
+ in[JS_INTRINSIC_PROMISE] = ctor;
698
+ JSObject *c = js_as_object(ctor), *p = js_as_object(proto);
699
+ js_define_data(ctx, c, JS_ATOM(prototype), proto, 0);
700
+ js_define_data(ctx, p, JS_ATOM(constructor), ctor, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
701
+ js_define_data(ctx, global, js_atom_from_cstr(ctx, "Promise"), ctor, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
702
+
703
+ (void)js_define_method(ctx, c, "all", promise_all, 1);
704
+ (void)js_define_method(ctx, c, "allSettled", promise_all_settled, 1);
705
+ (void)js_define_method(ctx, c, "any", promise_any, 1);
706
+ (void)js_define_method(ctx, c, "race", promise_race, 1);
707
+ (void)js_define_method(ctx, c, "reject", promise_reject_static, 1);
708
+ (void)js_define_method(ctx, c, "resolve", promise_resolve_static, 1);
709
+ (void)js_define_method(ctx, c, "try", promise_try, 1);
710
+ (void)js_define_method(ctx, c, "withResolvers", promise_with_resolvers, 0);
711
+ JSValue species = js_new_native(ctx, promise_species, js_atom_from_cstr(ctx, "get [Symbol.species]"), 0, JS_FN_STRICT);
712
+ ctx->intrinsics[JS_INTRINSIC_PROMISE_SPECIES_GETTER] = species;
713
+ JSPropertyDescriptor d = { JS_DESC_GET | JS_DESC_SET | JS_DESC_ENUMERABLE | JS_DESC_CONFIGURABLE, JS_PROP_CONFIGURABLE,
714
+ JS_UNDEFINED, species, JS_UNDEFINED };
715
+ if (js_define_own_property(ctx, c, JS_SYMBOL(species), &d, true) < 0) js_fatal("promise realm init");
716
+
717
+ (void)js_define_method(ctx, p, "then", promise_proto_then, 2);
718
+ (void)js_define_method(ctx, p, "catch", promise_proto_catch, 1);
719
+ (void)js_define_method(ctx, p, "finally", promise_proto_finally, 1);
720
+ js_define_data(ctx, p, JS_SYMBOL(toStringTag), js_atom_from_cstr(ctx, "Promise"), JS_PROP_CONFIGURABLE);
721
+ }