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.
- package/LICENSE +21 -0
- package/README.md +45 -2
- package/cli.js +8084 -0
- package/node/include/js_node.h +46 -0
- package/node/prelude/async_hooks.js +88 -0
- package/node/prelude/buffer.js +31 -0
- package/node/prelude/crypto.js +114 -0
- package/node/prelude/events.js +227 -0
- package/node/prelude/fs.js +79 -0
- package/node/prelude/http.js +536 -0
- package/node/prelude/http2.js +30 -0
- package/node/prelude/internal/crypto/asym.js +333 -0
- package/node/prelude/internal/crypto/cipher.js +205 -0
- package/node/prelude/internal/crypto/hash.js +137 -0
- package/node/prelude/internal/crypto/kdf.js +182 -0
- package/node/prelude/internal/crypto/keys.js +603 -0
- package/node/prelude/internal/crypto/random.js +118 -0
- package/node/prelude/internal/crypto/util.js +76 -0
- package/node/prelude/internal/errors.js +88 -0
- package/node/prelude/internal/querystring.js +105 -0
- package/node/prelude/module.js +53 -0
- package/node/prelude/net.js +51 -0
- package/node/prelude/os.js +129 -0
- package/node/prelude/path.js +257 -0
- package/node/prelude/process.js +21 -0
- package/node/prelude/querystring.js +469 -0
- package/node/prelude/stream.js +1327 -0
- package/node/prelude/stream_promises.js +7 -0
- package/node/prelude/stream_web.js +6 -0
- package/node/prelude/string_decoder.js +236 -0
- package/node/prelude/tty.js +18 -0
- package/node/prelude/url.js +1156 -0
- package/node/prelude/util.js +64 -0
- package/node/prelude/zlib.js +81 -0
- package/node/src/host_fs.c +126 -0
- package/node/src/host_http.c +486 -0
- package/node/src/host_os.c +505 -0
- package/node/src/host_sys.c +78 -0
- package/node/third_party/libuv/LICENSE +19 -0
- package/node/third_party/libuv/include/uv/aix.h +32 -0
- package/node/third_party/libuv/include/uv/bsd.h +34 -0
- package/node/third_party/libuv/include/uv/darwin.h +61 -0
- package/node/third_party/libuv/include/uv/errno.h +483 -0
- package/node/third_party/libuv/include/uv/linux.h +34 -0
- package/node/third_party/libuv/include/uv/os390.h +33 -0
- package/node/third_party/libuv/include/uv/posix.h +31 -0
- package/node/third_party/libuv/include/uv/sunos.h +44 -0
- package/node/third_party/libuv/include/uv/threadpool.h +37 -0
- package/node/third_party/libuv/include/uv/tree.h +521 -0
- package/node/third_party/libuv/include/uv/unix.h +512 -0
- package/node/third_party/libuv/include/uv/version.h +43 -0
- package/node/third_party/libuv/include/uv/win.h +698 -0
- package/node/third_party/libuv/include/uv.h +1990 -0
- package/node/third_party/libuv/src/fs-poll.c +290 -0
- package/node/third_party/libuv/src/heap-inl.h +245 -0
- package/node/third_party/libuv/src/idna.c +560 -0
- package/node/third_party/libuv/src/idna.h +31 -0
- package/node/third_party/libuv/src/inet.c +298 -0
- package/node/third_party/libuv/src/queue.h +90 -0
- package/node/third_party/libuv/src/random.c +123 -0
- package/node/third_party/libuv/src/strscpy.c +38 -0
- package/node/third_party/libuv/src/strscpy.h +39 -0
- package/node/third_party/libuv/src/strtok.c +52 -0
- package/node/third_party/libuv/src/strtok.h +27 -0
- package/node/third_party/libuv/src/thread-common.c +175 -0
- package/node/third_party/libuv/src/threadpool.c +419 -0
- package/node/third_party/libuv/src/timer.c +200 -0
- package/node/third_party/libuv/src/unix/async.c +418 -0
- package/node/third_party/libuv/src/unix/bsd-ifaddrs.c +164 -0
- package/node/third_party/libuv/src/unix/core.c +2104 -0
- package/node/third_party/libuv/src/unix/darwin-proctitle.c +176 -0
- package/node/third_party/libuv/src/unix/darwin-stub.h +97 -0
- package/node/third_party/libuv/src/unix/darwin-syscalls.h +17 -0
- package/node/third_party/libuv/src/unix/darwin.c +237 -0
- package/node/third_party/libuv/src/unix/dl.c +80 -0
- package/node/third_party/libuv/src/unix/fs.c +2303 -0
- package/node/third_party/libuv/src/unix/fsevents.c +906 -0
- package/node/third_party/libuv/src/unix/getaddrinfo.c +252 -0
- package/node/third_party/libuv/src/unix/getnameinfo.c +121 -0
- package/node/third_party/libuv/src/unix/internal.h +530 -0
- package/node/third_party/libuv/src/unix/kqueue.c +667 -0
- package/node/third_party/libuv/src/unix/linux.c +2761 -0
- package/node/third_party/libuv/src/unix/loop-watcher.c +68 -0
- package/node/third_party/libuv/src/unix/loop.c +240 -0
- package/node/third_party/libuv/src/unix/pipe.c +555 -0
- package/node/third_party/libuv/src/unix/poll.c +159 -0
- package/node/third_party/libuv/src/unix/process.c +1123 -0
- package/node/third_party/libuv/src/unix/procfs-exepath.c +45 -0
- package/node/third_party/libuv/src/unix/proctitle.c +157 -0
- package/node/third_party/libuv/src/unix/random-devurandom.c +93 -0
- package/node/third_party/libuv/src/unix/random-getentropy.c +57 -0
- package/node/third_party/libuv/src/unix/random-getrandom.c +86 -0
- package/node/third_party/libuv/src/unix/random-sysctl-linux.c +99 -0
- package/node/third_party/libuv/src/unix/signal.c +581 -0
- package/node/third_party/libuv/src/unix/stream.c +1567 -0
- package/node/third_party/libuv/src/unix/tcp.c +673 -0
- package/node/third_party/libuv/src/unix/thread.c +975 -0
- package/node/third_party/libuv/src/unix/tty.c +510 -0
- package/node/third_party/libuv/src/unix/udp.c +1434 -0
- package/node/third_party/libuv/src/uv-common.c +1051 -0
- package/node/third_party/libuv/src/uv-common.h +474 -0
- package/node/third_party/libuv/src/uv-data-getter-setters.c +119 -0
- package/node/third_party/libuv/src/version.c +45 -0
- package/node/third_party/llhttp/LICENSE +22 -0
- package/node/third_party/llhttp/api.c +509 -0
- package/node/third_party/llhttp/http.c +170 -0
- package/node/third_party/llhttp/llhttp.c +10099 -0
- package/node/third_party/llhttp/llhttp.h +907 -0
- package/package.json +25 -4
- package/runtime/include/js_atoms.gen.h +68 -0
- package/runtime/include/js_atoms.h +54 -0
- package/runtime/include/js_bigint.h +93 -0
- package/runtime/include/js_buffer.h +79 -0
- package/runtime/include/js_builtins.h +168 -0
- package/runtime/include/js_console.h +58 -0
- package/runtime/include/js_convert.h +22 -0
- package/runtime/include/js_core.def +188 -0
- package/runtime/include/js_crypto.h +58 -0
- package/runtime/include/js_error.h +37 -0
- package/runtime/include/js_exception.h +65 -0
- package/runtime/include/js_function.h +167 -0
- package/runtime/include/js_gc.h +195 -0
- package/runtime/include/js_generator.h +96 -0
- package/runtime/include/js_host.h +19 -0
- package/runtime/include/js_jobs.h +84 -0
- package/runtime/include/js_module.h +16 -0
- package/runtime/include/js_object.h +384 -0
- package/runtime/include/js_ops.h +111 -0
- package/runtime/include/js_promise.h +45 -0
- package/runtime/include/js_regexp.h +25 -0
- package/runtime/include/js_runtime.h +30 -0
- package/runtime/include/js_symbol.h +62 -0
- package/runtime/include/js_web.h +110 -0
- package/runtime/include/jscell.h +48 -0
- package/runtime/include/jscontext.h +240 -0
- package/runtime/include/jsnum.h +42 -0
- package/runtime/include/jsstring.h +161 -0
- package/runtime/include/jsvalue.h +142 -0
- package/runtime/src/arguments.c +115 -0
- package/runtime/src/array.c +1145 -0
- package/runtime/src/arraybuffer.c +608 -0
- package/runtime/src/async_iter.c +479 -0
- package/runtime/src/atoms.c +157 -0
- package/runtime/src/base64.c +107 -0
- package/runtime/src/bigint.c +1189 -0
- package/runtime/src/blob.c +371 -0
- package/runtime/src/buffer.c +1357 -0
- package/runtime/src/builtin_table.c +100 -0
- package/runtime/src/builtins.c +987 -0
- package/runtime/src/builtins_util.h +53 -0
- package/runtime/src/collections.c +912 -0
- package/runtime/src/components.c +28 -0
- package/runtime/src/console.c +637 -0
- package/runtime/src/convert.c +82 -0
- package/runtime/src/core_all.c +21 -0
- package/runtime/src/crypto.c +116 -0
- package/runtime/src/crypto_asym.c +644 -0
- package/runtime/src/crypto_cipher.c +671 -0
- package/runtime/src/crypto_hash.c +260 -0
- package/runtime/src/crypto_host.c +414 -0
- package/runtime/src/crypto_internal.h +304 -0
- package/runtime/src/crypto_kdf.c +143 -0
- package/runtime/src/crypto_key.c +171 -0
- package/runtime/src/crypto_pkey.c +794 -0
- package/runtime/src/crypto_subtle.c +1675 -0
- package/runtime/src/date.c +940 -0
- package/runtime/src/domexception.c +169 -0
- package/runtime/src/elements.c +312 -0
- package/runtime/src/elements.h +45 -0
- package/runtime/src/encoding.c +485 -0
- package/runtime/src/error.c +297 -0
- package/runtime/src/events.c +793 -0
- package/runtime/src/exception.c +56 -0
- package/runtime/src/fetch.c +772 -0
- package/runtime/src/function.c +530 -0
- package/runtime/src/gc.c +803 -0
- package/runtime/src/generator.c +218 -0
- package/runtime/src/global.c +119 -0
- package/runtime/src/headers.c +557 -0
- package/runtime/src/inspect.c +1792 -0
- package/runtime/src/internal.h +80 -0
- package/runtime/src/iterate.c +94 -0
- package/runtime/src/iterator.c +409 -0
- package/runtime/src/jobs.c +337 -0
- package/runtime/src/jsnum.c +353 -0
- package/runtime/src/json.c +1028 -0
- package/runtime/src/math.c +243 -0
- package/runtime/src/module.c +336 -0
- package/runtime/src/number.c +176 -0
- package/runtime/src/object.c +1265 -0
- package/runtime/src/ops.c +322 -0
- package/runtime/src/os.c +196 -0
- package/runtime/src/os.h +29 -0
- package/runtime/src/process.c +432 -0
- package/runtime/src/promise.c +721 -0
- package/runtime/src/proxy.c +570 -0
- package/runtime/src/reflect.c +194 -0
- package/runtime/src/regexp.c +1141 -0
- package/runtime/src/regexp_anchor.h +34 -0
- package/runtime/src/regexp_message.h +32 -0
- package/runtime/src/shape.c +294 -0
- package/runtime/src/shape.h +46 -0
- package/runtime/src/streams.c +1046 -0
- package/runtime/src/streams.h +47 -0
- package/runtime/src/string.c +364 -0
- package/runtime/src/string_builtins.c +837 -0
- package/runtime/src/symbol.c +143 -0
- package/runtime/src/test_host.c +59 -0
- package/runtime/src/typedarray.c +1330 -0
- package/runtime/src/tznames.gen.h +712 -0
- package/runtime/src/uri.c +169 -0
- package/runtime/src/url.c +2116 -0
- package/runtime/src/weak.c +486 -0
- package/runtime/src/web.c +214 -0
- package/runtime/src/wrapper.c +59 -0
- package/runtime/src/writable.c +1486 -0
- package/runtime/third_party/ada-idna/LICENSE-MIT +18 -0
- package/runtime/third_party/ada-idna/README.md +27 -0
- package/runtime/third_party/ada-idna/convert.mjs +83 -0
- package/runtime/third_party/ada-idna/idna.c +416 -0
- package/runtime/third_party/ada-idna/idna.h +15 -0
- package/runtime/third_party/ada-idna/idna_tables.h +2657 -0
- package/runtime/third_party/bearssl/LICENSE.txt +21 -0
- package/runtime/third_party/bearssl/README.txt +136 -0
- package/runtime/third_party/bearssl/VERSION +1 -0
- package/runtime/third_party/bearssl/inc/bearssl.h +183 -0
- package/runtime/third_party/bearssl/inc/bearssl_aead.h +1059 -0
- package/runtime/third_party/bearssl/inc/bearssl_block.h +2618 -0
- package/runtime/third_party/bearssl/inc/bearssl_ec.h +967 -0
- package/runtime/third_party/bearssl/inc/bearssl_hash.h +1346 -0
- package/runtime/third_party/bearssl/inc/bearssl_hmac.h +241 -0
- package/runtime/third_party/bearssl/inc/bearssl_kdf.h +284 -0
- package/runtime/third_party/bearssl/inc/bearssl_pem.h +294 -0
- package/runtime/third_party/bearssl/inc/bearssl_prf.h +150 -0
- package/runtime/third_party/bearssl/inc/bearssl_rand.h +397 -0
- package/runtime/third_party/bearssl/inc/bearssl_rsa.h +1655 -0
- package/runtime/third_party/bearssl/inc/bearssl_ssl.h +4296 -0
- package/runtime/third_party/bearssl/inc/bearssl_x509.h +1474 -0
- package/runtime/third_party/bearssl/src/aead/ccm.c +346 -0
- package/runtime/third_party/bearssl/src/aead/eax.c +525 -0
- package/runtime/third_party/bearssl/src/aead/gcm.c +318 -0
- package/runtime/third_party/bearssl/src/codec/ccopy.c +44 -0
- package/runtime/third_party/bearssl/src/codec/dec16be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec16le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec32be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec32le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec64be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec64le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc16be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc16le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc32be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc32le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc64be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc64le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/pemdec.c +526 -0
- package/runtime/third_party/bearssl/src/codec/pemdec.t0 +314 -0
- package/runtime/third_party/bearssl/src/codec/pemenc.c +173 -0
- package/runtime/third_party/bearssl/src/config.h +247 -0
- package/runtime/third_party/bearssl/src/ec/ec_all_m15.c +121 -0
- package/runtime/third_party/bearssl/src/ec/ec_all_m31.c +171 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_i15.c +398 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_i31.c +390 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_m15.c +1478 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_m31.c +800 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_m62.c +605 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_m64.c +831 -0
- package/runtime/third_party/bearssl/src/ec/ec_curve25519.c +46 -0
- package/runtime/third_party/bearssl/src/ec/ec_default.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ec_keygen.c +86 -0
- package/runtime/third_party/bearssl/src/ec/ec_p256_m15.c +2124 -0
- package/runtime/third_party/bearssl/src/ec/ec_p256_m31.c +1469 -0
- package/runtime/third_party/bearssl/src/ec/ec_p256_m62.c +1765 -0
- package/runtime/third_party/bearssl/src/ec/ec_p256_m64.c +1781 -0
- package/runtime/third_party/bearssl/src/ec/ec_prime_i15.c +824 -0
- package/runtime/third_party/bearssl/src/ec/ec_prime_i31.c +826 -0
- package/runtime/third_party/bearssl/src/ec/ec_pubkey.c +85 -0
- package/runtime/third_party/bearssl/src/ec/ec_secp256r1.c +51 -0
- package/runtime/third_party/bearssl/src/ec/ec_secp384r1.c +57 -0
- package/runtime/third_party/bearssl/src/ec/ec_secp521r1.c +64 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_atr.c +134 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_asn1.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_raw.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_asn1.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_raw.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_bits.c +47 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_asn1.c +45 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_raw.c +174 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_asn1.c +48 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_raw.c +166 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_bits.c +47 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_asn1.c +45 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_raw.c +173 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_asn1.c +48 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_raw.c +165 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_rta.c +121 -0
- package/runtime/third_party/bearssl/src/hash/dig_oid.c +84 -0
- package/runtime/third_party/bearssl/src/hash/dig_size.c +50 -0
- package/runtime/third_party/bearssl/src/hash/ghash_ctmul.c +345 -0
- package/runtime/third_party/bearssl/src/hash/ghash_ctmul32.c +251 -0
- package/runtime/third_party/bearssl/src/hash/ghash_ctmul64.c +154 -0
- package/runtime/third_party/bearssl/src/hash/ghash_pclmul.c +389 -0
- package/runtime/third_party/bearssl/src/hash/ghash_pwr8.c +411 -0
- package/runtime/third_party/bearssl/src/hash/md5.c +208 -0
- package/runtime/third_party/bearssl/src/hash/md5sha1.c +141 -0
- package/runtime/third_party/bearssl/src/hash/mgf1.c +56 -0
- package/runtime/third_party/bearssl/src/hash/multihash.c +166 -0
- package/runtime/third_party/bearssl/src/hash/sha1.c +191 -0
- package/runtime/third_party/bearssl/src/hash/sha2big.c +285 -0
- package/runtime/third_party/bearssl/src/hash/sha2small.c +341 -0
- package/runtime/third_party/bearssl/src/inner.h +2577 -0
- package/runtime/third_party/bearssl/src/int/i15_add.c +46 -0
- package/runtime/third_party/bearssl/src/int/i15_bitlen.c +44 -0
- package/runtime/third_party/bearssl/src/int/i15_decmod.c +124 -0
- package/runtime/third_party/bearssl/src/int/i15_decode.c +56 -0
- package/runtime/third_party/bearssl/src/int/i15_decred.c +100 -0
- package/runtime/third_party/bearssl/src/int/i15_encode.c +56 -0
- package/runtime/third_party/bearssl/src/int/i15_fmont.c +59 -0
- package/runtime/third_party/bearssl/src/int/i15_iszero.c +39 -0
- package/runtime/third_party/bearssl/src/int/i15_moddiv.c +465 -0
- package/runtime/third_party/bearssl/src/int/i15_modpow.c +50 -0
- package/runtime/third_party/bearssl/src/int/i15_modpow2.c +160 -0
- package/runtime/third_party/bearssl/src/int/i15_montmul.c +184 -0
- package/runtime/third_party/bearssl/src/int/i15_mulacc.c +61 -0
- package/runtime/third_party/bearssl/src/int/i15_muladd.c +173 -0
- package/runtime/third_party/bearssl/src/int/i15_ninv15.c +38 -0
- package/runtime/third_party/bearssl/src/int/i15_reduce.c +66 -0
- package/runtime/third_party/bearssl/src/int/i15_rshift.c +47 -0
- package/runtime/third_party/bearssl/src/int/i15_sub.c +46 -0
- package/runtime/third_party/bearssl/src/int/i15_tmont.c +36 -0
- package/runtime/third_party/bearssl/src/int/i31_add.c +46 -0
- package/runtime/third_party/bearssl/src/int/i31_bitlen.c +44 -0
- package/runtime/third_party/bearssl/src/int/i31_decmod.c +124 -0
- package/runtime/third_party/bearssl/src/int/i31_decode.c +57 -0
- package/runtime/third_party/bearssl/src/int/i31_decred.c +103 -0
- package/runtime/third_party/bearssl/src/int/i31_encode.c +79 -0
- package/runtime/third_party/bearssl/src/int/i31_fmont.c +60 -0
- package/runtime/third_party/bearssl/src/int/i31_iszero.c +39 -0
- package/runtime/third_party/bearssl/src/int/i31_moddiv.c +488 -0
- package/runtime/third_party/bearssl/src/int/i31_modpow.c +65 -0
- package/runtime/third_party/bearssl/src/int/i31_modpow2.c +160 -0
- package/runtime/third_party/bearssl/src/int/i31_montmul.c +127 -0
- package/runtime/third_party/bearssl/src/int/i31_mulacc.c +74 -0
- package/runtime/third_party/bearssl/src/int/i31_muladd.c +157 -0
- package/runtime/third_party/bearssl/src/int/i31_ninv31.c +39 -0
- package/runtime/third_party/bearssl/src/int/i31_reduce.c +66 -0
- package/runtime/third_party/bearssl/src/int/i31_rshift.c +47 -0
- package/runtime/third_party/bearssl/src/int/i31_sub.c +46 -0
- package/runtime/third_party/bearssl/src/int/i31_tmont.c +36 -0
- package/runtime/third_party/bearssl/src/int/i32_add.c +51 -0
- package/runtime/third_party/bearssl/src/int/i32_bitlen.c +44 -0
- package/runtime/third_party/bearssl/src/int/i32_decmod.c +77 -0
- package/runtime/third_party/bearssl/src/int/i32_decode.c +63 -0
- package/runtime/third_party/bearssl/src/int/i32_decred.c +107 -0
- package/runtime/third_party/bearssl/src/int/i32_div32.c +56 -0
- package/runtime/third_party/bearssl/src/int/i32_encode.c +72 -0
- package/runtime/third_party/bearssl/src/int/i32_fmont.c +60 -0
- package/runtime/third_party/bearssl/src/int/i32_iszero.c +39 -0
- package/runtime/third_party/bearssl/src/int/i32_modpow.c +65 -0
- package/runtime/third_party/bearssl/src/int/i32_montmul.c +69 -0
- package/runtime/third_party/bearssl/src/int/i32_mulacc.c +56 -0
- package/runtime/third_party/bearssl/src/int/i32_muladd.c +138 -0
- package/runtime/third_party/bearssl/src/int/i32_ninv32.c +39 -0
- package/runtime/third_party/bearssl/src/int/i32_reduce.c +66 -0
- package/runtime/third_party/bearssl/src/int/i32_sub.c +51 -0
- package/runtime/third_party/bearssl/src/int/i32_tmont.c +36 -0
- package/runtime/third_party/bearssl/src/int/i62_modpow2.c +493 -0
- package/runtime/third_party/bearssl/src/kdf/hkdf.c +107 -0
- package/runtime/third_party/bearssl/src/kdf/shake.c +590 -0
- package/runtime/third_party/bearssl/src/mac/hmac.c +122 -0
- package/runtime/third_party/bearssl/src/mac/hmac_ct.c +193 -0
- package/runtime/third_party/bearssl/src/rand/aesctr_drbg.c +206 -0
- package/runtime/third_party/bearssl/src/rand/hmac_drbg.c +157 -0
- package/runtime/third_party/bearssl/src/rand/sysrng.c +252 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_keygen.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_modulus.c +36 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_decrypt.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_encrypt.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_sign.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_vrfy.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_priv.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_privexp.c +36 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_sign.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_vrfy.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pub.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pubexp.c +36 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_keygen.c +583 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_modulus.c +99 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_decrypt.c +41 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_encrypt.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_sign.c +37 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_vrfy.c +43 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_priv.c +209 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_privexp.c +320 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_sign.c +40 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_vrfy.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pub.c +113 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pubexp.c +152 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen.c +37 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen_inner.c +608 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_modulus.c +99 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_decrypt.c +41 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_encrypt.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_sign.c +37 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_vrfy.c +43 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_priv.c +203 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_privexp.c +318 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_sign.c +40 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_vrfy.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pub.c +106 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pubexp.c +152 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_decrypt.c +41 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_encrypt.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_sign.c +37 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_vrfy.c +43 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_priv.c +160 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_sign.c +40 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_vrfy.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pub.c +77 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_keygen.c +57 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_decrypt.c +61 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_encrypt.c +64 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_sign.c +57 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_vrfy.c +63 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_priv.c +223 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_sign.c +60 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_vrfy.c +64 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pub.c +125 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_oaep_pad.c +112 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_oaep_unpad.c +145 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +100 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_unpad.c +121 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_pad.c +106 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_unpad.c +121 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_ssl_decrypt.c +52 -0
- package/runtime/third_party/bearssl/src/settings.c +306 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcdec.c +69 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcenc.c +67 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_ctr.c +84 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_ctrcbc.c +142 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_dec.c +254 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_enc.c +157 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_common.c +112 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct.c +328 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64.c +398 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcdec.c +104 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcenc.c +81 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctr.c +114 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctrcbc.c +433 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_dec.c +159 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_enc.c +115 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcdec.c +111 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcenc.c +91 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctr.c +116 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctrcbc.c +422 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_dec.c +170 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_enc.c +112 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8.c +445 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcdec.c +670 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcenc.c +417 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctr.c +717 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctrcbc.c +946 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcdec.c +69 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcenc.c +67 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_ctr.c +84 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_ctrcbc.c +142 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_dec.c +176 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_enc.c +129 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni.c +240 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcdec.c +223 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcenc.c +122 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctr.c +211 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctrcbc.c +596 -0
- package/runtime/third_party/bearssl/src/symcipher/chacha20_ct.c +106 -0
- package/runtime/third_party/bearssl/src/symcipher/chacha20_sse2.c +237 -0
- package/runtime/third_party/bearssl/src/symcipher/des_ct.c +411 -0
- package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcdec.c +87 -0
- package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcenc.c +69 -0
- package/runtime/third_party/bearssl/src/symcipher/des_support.c +166 -0
- package/runtime/third_party/bearssl/src/symcipher/des_tab.c +310 -0
- package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcdec.c +85 -0
- package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcenc.c +67 -0
- package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul.c +260 -0
- package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul32.c +297 -0
- package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmulq.c +475 -0
- package/runtime/third_party/bearssl/src/symcipher/poly1305_i15.c +221 -0
- package/runtime/third_party/bearssl/src/x509/asn1.t0 +757 -0
- package/runtime/third_party/bearssl/src/x509/asn1enc.c +93 -0
- package/runtime/third_party/bearssl/src/x509/encode_ec_pk8der.c +110 -0
- package/runtime/third_party/bearssl/src/x509/encode_ec_rawder.c +161 -0
- package/runtime/third_party/bearssl/src/x509/encode_rsa_pk8der.c +97 -0
- package/runtime/third_party/bearssl/src/x509/encode_rsa_rawder.c +96 -0
- package/runtime/third_party/bearssl/src/x509/skey_decoder.c +653 -0
- package/runtime/third_party/bearssl/src/x509/skey_decoder.t0 +376 -0
- package/runtime/third_party/bearssl/src/x509/x509_decoder.c +776 -0
- package/runtime/third_party/bearssl/src/x509/x509_decoder.t0 +324 -0
- package/runtime/third_party/bearssl/src/x509/x509_knownkey.c +105 -0
- package/runtime/third_party/bearssl/src/x509/x509_minimal.c +1722 -0
- package/runtime/third_party/bearssl/src/x509/x509_minimal.t0 +1526 -0
- package/runtime/third_party/bearssl/src/x509/x509_minimal_full.c +59 -0
- package/runtime/third_party/quickjs-dtoa/LICENSE +22 -0
- package/runtime/third_party/quickjs-dtoa/README.md +23 -0
- package/runtime/third_party/quickjs-dtoa/dtoa.c +1640 -0
- package/runtime/third_party/quickjs-dtoa/dtoa.h +83 -0
- package/runtime/third_party/quickjs-dtoa/dtoa_compat.h +89 -0
- package/runtime/third_party/quickjs-regexp/LICENSE +22 -0
- package/runtime/third_party/quickjs-regexp/README.md +22 -0
- package/runtime/third_party/quickjs-regexp/cutils.c +641 -0
- package/runtime/third_party/quickjs-regexp/cutils.h +457 -0
- package/runtime/third_party/quickjs-regexp/libregexp-opcode.h +73 -0
- package/runtime/third_party/quickjs-regexp/libregexp.c +3448 -0
- package/runtime/third_party/quickjs-regexp/libregexp.h +65 -0
- package/runtime/third_party/quickjs-regexp/libunicode-table.h +5206 -0
- package/runtime/third_party/quickjs-regexp/libunicode.c +2124 -0
- package/runtime/third_party/quickjs-regexp/libunicode.h +196 -0
- package/runtime/third_party/v8-ieee754/LICENSE +61 -0
- package/runtime/third_party/v8-ieee754/README.md +22 -0
- package/runtime/third_party/v8-ieee754/convert.py +84 -0
- package/runtime/third_party/v8-ieee754/ieee754.c +3030 -0
- package/runtime/third_party/v8-ieee754/ieee754.h +27 -0
- package/runtime/tools/regexp_compile.c +90 -0
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
/* Proxy (ECMAScript §10.5, §28.2), an optional component (ADR 0014).
|
|
2
|
+
*
|
|
3
|
+
* A proxy's class overrides every internal method (JSClass.methods, and the get_own_property,
|
|
4
|
+
* define_own_property and delete_property hooks): each calls the handler's trap, or the target's
|
|
5
|
+
* method when there is none, then checks the spec's invariants against the target. A proxy whose
|
|
6
|
+
* target is callable is a function cell, so typeof, calls and `new` treat it as a function; its
|
|
7
|
+
* entry runs the apply and construct traps. Revoking clears the target and the handler. */
|
|
8
|
+
#include <stdio.h>
|
|
9
|
+
#include <stdlib.h>
|
|
10
|
+
#include <string.h>
|
|
11
|
+
|
|
12
|
+
#include "internal.h"
|
|
13
|
+
#include "builtins_util.h"
|
|
14
|
+
#include "js_atoms.h"
|
|
15
|
+
#include "js_convert.h"
|
|
16
|
+
#include "js_error.h"
|
|
17
|
+
#include "js_function.h"
|
|
18
|
+
#include "js_ops.h"
|
|
19
|
+
#include "jscontext.h"
|
|
20
|
+
#include "jsstring.h"
|
|
21
|
+
|
|
22
|
+
typedef struct ProxyObject {
|
|
23
|
+
JSObject obj;
|
|
24
|
+
JSValue target, handler; /* null once revoked */
|
|
25
|
+
} ProxyObject;
|
|
26
|
+
|
|
27
|
+
/* A callable proxy is a JSFunction: home_object is the target, bound_this the handler. */
|
|
28
|
+
static JSValue *target_slot(JSObject *o) {
|
|
29
|
+
return o->cell.kind == JS_CELL_FUNCTION ? &((JSFunction *)o)->home_object : &((ProxyObject *)o)->target;
|
|
30
|
+
}
|
|
31
|
+
static JSValue *handler_slot(JSObject *o) {
|
|
32
|
+
return o->cell.kind == JS_CELL_FUNCTION ? &((JSFunction *)o)->bound_this : &((ProxyObject *)o)->handler;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* ---- Helpers ---------------------------------------------------------------------------------- */
|
|
36
|
+
|
|
37
|
+
/* A key as V8 quotes it in messages: x, 0, Symbol(s). */
|
|
38
|
+
static void key_text(JSContext *ctx, JSValue key, char *buf, size_t cap) {
|
|
39
|
+
js_describe_value(ctx, key, buf, cap);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* A key as traps receive it: index keys are strings. */
|
|
43
|
+
static JSValue key_value(JSContext *ctx, JSValue key) {
|
|
44
|
+
return js_is_number(key) ? js_to_string(ctx, key) : key;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* The handler's trap: 1 with *trap set, 0 when there is none (use the target), -1. */
|
|
48
|
+
static int get_trap(JSContext *ctx, JSObject *o, const char *name, JSValue *handler, JSValue *target, JSValue *trap) {
|
|
49
|
+
*handler = *handler_slot(o);
|
|
50
|
+
if (js_is_null(*handler)) {
|
|
51
|
+
js_discard(js_throw_type_error(ctx, "Cannot perform '%s' on a proxy that has been revoked", name));
|
|
52
|
+
return -1;
|
|
53
|
+
}
|
|
54
|
+
*target = *target_slot(o);
|
|
55
|
+
JSValue t = js_get_value(ctx, *handler, js_atom_from_cstr(ctx, name));
|
|
56
|
+
if (js_is_exception(t)) return -1;
|
|
57
|
+
if (js_is_nullish(t)) return 0;
|
|
58
|
+
if (!js_is_callable(t)) {
|
|
59
|
+
char what[128];
|
|
60
|
+
js_describe_value(ctx, t, what, sizeof what);
|
|
61
|
+
js_discard(js_throw_type_error(ctx, "'%s' returned for property '%s' of object '#<Object>' is not a function", what, name));
|
|
62
|
+
return -1;
|
|
63
|
+
}
|
|
64
|
+
*trap = t;
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static JSValue call_trap(JSContext *ctx, JSValue trap, JSValue handler, uint32_t argc, const JSValue *argv) {
|
|
69
|
+
return js_call(ctx, trap, handler, argc, argv);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* ToBoolean(Call(trap, handler, args)): 1, 0, or -1. */
|
|
73
|
+
static int call_bool_trap(JSContext *ctx, JSValue trap, JSValue handler, uint32_t argc, const JSValue *argv) {
|
|
74
|
+
JSValue r = call_trap(ctx, trap, handler, argc, argv);
|
|
75
|
+
return js_is_exception(r) ? -1 : js_truthy(r);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static int fail(JSContext *ctx, const char *fmt, const char *trap, JSValue key) {
|
|
79
|
+
char k[128];
|
|
80
|
+
key_text(ctx, key, k, sizeof k);
|
|
81
|
+
js_discard(js_throw_type_error(ctx, fmt, trap, k));
|
|
82
|
+
return -1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static bool is_accessor(const JSPropertyDescriptor *d) { return (d->has & (JS_DESC_GET | JS_DESC_SET)) != 0; }
|
|
86
|
+
static bool is_data(const JSPropertyDescriptor *d) { return (d->has & (JS_DESC_VALUE | JS_DESC_WRITABLE)) != 0; }
|
|
87
|
+
|
|
88
|
+
/* CompletePropertyDescriptor (§6.2.6.6) */
|
|
89
|
+
static void complete(JSPropertyDescriptor *d) {
|
|
90
|
+
if (!is_accessor(d)) {
|
|
91
|
+
if (!(d->has & JS_DESC_VALUE)) d->value = JS_UNDEFINED;
|
|
92
|
+
d->has |= JS_DESC_VALUE | JS_DESC_WRITABLE;
|
|
93
|
+
} else {
|
|
94
|
+
if (!(d->has & JS_DESC_GET)) d->get = JS_UNDEFINED;
|
|
95
|
+
if (!(d->has & JS_DESC_SET)) d->set = JS_UNDEFINED;
|
|
96
|
+
d->has |= JS_DESC_GET | JS_DESC_SET;
|
|
97
|
+
}
|
|
98
|
+
d->has |= JS_DESC_ENUMERABLE | JS_DESC_CONFIGURABLE;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* IsCompatiblePropertyDescriptor (§10.1.6.2): ValidateAndApplyPropertyDescriptor without an object. */
|
|
102
|
+
static bool is_compatible(JSContext *ctx, bool extensible, const JSPropertyDescriptor *desc, const JSPropertyDescriptor *current, bool has_current) {
|
|
103
|
+
if (!has_current) return extensible;
|
|
104
|
+
if (!desc->has) return true;
|
|
105
|
+
if (current->attrs & JS_PROP_CONFIGURABLE) return true;
|
|
106
|
+
if ((desc->has & JS_DESC_CONFIGURABLE) && (desc->attrs & JS_PROP_CONFIGURABLE)) return false;
|
|
107
|
+
if ((desc->has & JS_DESC_ENUMERABLE) && ((desc->attrs ^ current->attrs) & JS_PROP_ENUMERABLE)) return false;
|
|
108
|
+
bool generic = !is_accessor(desc) && !is_data(desc);
|
|
109
|
+
if (!generic && is_accessor(desc) != is_accessor(current)) return false;
|
|
110
|
+
if (is_accessor(current)) {
|
|
111
|
+
if ((desc->has & JS_DESC_GET) && !js_same_value(ctx, desc->get, current->get)) return false;
|
|
112
|
+
if ((desc->has & JS_DESC_SET) && !js_same_value(ctx, desc->set, current->set)) return false;
|
|
113
|
+
} else if (!(current->attrs & JS_PROP_WRITABLE)) {
|
|
114
|
+
if ((desc->has & JS_DESC_WRITABLE) && (desc->attrs & JS_PROP_WRITABLE)) return false;
|
|
115
|
+
if ((desc->has & JS_DESC_VALUE) && !js_same_value(ctx, desc->value, current->value)) return false;
|
|
116
|
+
}
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* FromPropertyDescriptor of a possibly partial descriptor: only the fields it has. */
|
|
121
|
+
static JSValue from_partial(JSContext *ctx, const JSPropertyDescriptor *d) {
|
|
122
|
+
JSValue r = js_new_object(ctx);
|
|
123
|
+
JSObject *o = js_as_object(r);
|
|
124
|
+
if (d->has & JS_DESC_VALUE) js_define_data(ctx, o, JS_ATOM(value), d->value, JS_PROP_DEFAULT);
|
|
125
|
+
if (d->has & JS_DESC_WRITABLE) js_define_data(ctx, o, js_atom_from_cstr(ctx, "writable"), js_bool(d->attrs & JS_PROP_WRITABLE), JS_PROP_DEFAULT);
|
|
126
|
+
if (d->has & JS_DESC_GET) js_define_data(ctx, o, JS_ATOM(get), d->get, JS_PROP_DEFAULT);
|
|
127
|
+
if (d->has & JS_DESC_SET) js_define_data(ctx, o, JS_ATOM(set), d->set, JS_PROP_DEFAULT);
|
|
128
|
+
if (d->has & JS_DESC_ENUMERABLE) js_define_data(ctx, o, js_atom_from_cstr(ctx, "enumerable"), js_bool(d->attrs & JS_PROP_ENUMERABLE), JS_PROP_DEFAULT);
|
|
129
|
+
if (d->has & JS_DESC_CONFIGURABLE) js_define_data(ctx, o, js_atom_from_cstr(ctx, "configurable"), js_bool(d->attrs & JS_PROP_CONFIGURABLE), JS_PROP_DEFAULT);
|
|
130
|
+
return r;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* ---- [[GetPrototypeOf]], [[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]] ----------- */
|
|
134
|
+
|
|
135
|
+
static JSValue proxy_get_prototype_of(JSContext *ctx, JSObject *o) {
|
|
136
|
+
JSValue handler, target, trap;
|
|
137
|
+
int t = get_trap(ctx, o, "getPrototypeOf", &handler, &target, &trap);
|
|
138
|
+
if (t < 0) return JS_EXCEPTION;
|
|
139
|
+
if (!t) return js_object_get_prototype_of(ctx, js_as_object(target));
|
|
140
|
+
JSValue proto = call_trap(ctx, trap, handler, 1, &target);
|
|
141
|
+
if (js_is_exception(proto)) return proto;
|
|
142
|
+
if (!js_is_object(proto) && !js_is_null(proto)) return js_throw_type_error(ctx, "'getPrototypeOf' on proxy: trap returned neither object nor null");
|
|
143
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
144
|
+
if (extensible) return extensible < 0 ? JS_EXCEPTION : proto;
|
|
145
|
+
JSValue target_proto = js_object_get_prototype_of(ctx, js_as_object(target));
|
|
146
|
+
if (js_is_exception(target_proto)) return target_proto;
|
|
147
|
+
if (!js_same_bits(proto, target_proto))
|
|
148
|
+
return js_throw_type_error(ctx, "'getPrototypeOf' on proxy: proxy target is non-extensible but the trap did not return its actual prototype");
|
|
149
|
+
return proto;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
static int proxy_set_prototype_of(JSContext *ctx, JSObject *o, JSValue proto) {
|
|
153
|
+
JSValue handler, target, trap;
|
|
154
|
+
int t = get_trap(ctx, o, "setPrototypeOf", &handler, &target, &trap);
|
|
155
|
+
if (t <= 0) return t < 0 ? -1 : js_set_prototype_of(ctx, js_as_object(target), proto);
|
|
156
|
+
JSValue args[2] = { target, proto };
|
|
157
|
+
int r = call_bool_trap(ctx, trap, handler, 2, args);
|
|
158
|
+
if (r <= 0) return r;
|
|
159
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
160
|
+
if (extensible) return extensible < 0 ? -1 : 1;
|
|
161
|
+
JSValue target_proto = js_object_get_prototype_of(ctx, js_as_object(target));
|
|
162
|
+
if (js_is_exception(target_proto)) return -1;
|
|
163
|
+
if (!js_same_bits(proto, target_proto)) {
|
|
164
|
+
js_discard(js_throw_type_error(ctx, "'setPrototypeOf' on proxy: trap returned truish for setting a new prototype on the non-extensible proxy target"));
|
|
165
|
+
return -1;
|
|
166
|
+
}
|
|
167
|
+
return 1;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
static int proxy_is_extensible(JSContext *ctx, JSObject *o) {
|
|
171
|
+
JSValue handler, target, trap;
|
|
172
|
+
int t = get_trap(ctx, o, "isExtensible", &handler, &target, &trap);
|
|
173
|
+
if (t <= 0) return t < 0 ? -1 : js_object_is_extensible(ctx, js_as_object(target));
|
|
174
|
+
int r = call_bool_trap(ctx, trap, handler, 1, &target);
|
|
175
|
+
if (r < 0) return -1;
|
|
176
|
+
int expected = js_object_is_extensible(ctx, js_as_object(target));
|
|
177
|
+
if (expected < 0) return -1;
|
|
178
|
+
if (r != expected) {
|
|
179
|
+
js_discard(js_throw_type_error(ctx, "'isExtensible' on proxy: trap result does not reflect extensibility of proxy target (which is '%s')",
|
|
180
|
+
expected ? "true" : "false"));
|
|
181
|
+
return -1;
|
|
182
|
+
}
|
|
183
|
+
return r;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
static int proxy_prevent_extensions(JSContext *ctx, JSObject *o) {
|
|
187
|
+
JSValue handler, target, trap;
|
|
188
|
+
int t = get_trap(ctx, o, "preventExtensions", &handler, &target, &trap);
|
|
189
|
+
if (t <= 0) return t < 0 ? -1 : js_prevent_extensions(ctx, js_as_object(target));
|
|
190
|
+
int r = call_bool_trap(ctx, trap, handler, 1, &target);
|
|
191
|
+
if (r <= 0) return r;
|
|
192
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
193
|
+
if (extensible < 0) return -1;
|
|
194
|
+
if (extensible) {
|
|
195
|
+
js_discard(js_throw_type_error(ctx, "'preventExtensions' on proxy: trap returned truish but the proxy target is extensible"));
|
|
196
|
+
return -1;
|
|
197
|
+
}
|
|
198
|
+
return 1;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* ---- [[GetOwnProperty]], [[DefineOwnProperty]], [[Delete]] (class hooks) --------------------- */
|
|
202
|
+
|
|
203
|
+
static int proxy_get_own(JSContext *ctx, JSObject *o, JSValue key, JSPropertyDescriptor *out) {
|
|
204
|
+
if (js_is_private_name(key)) return JS_ORDINARY; /* private names aren't proxied: the proxy's own */
|
|
205
|
+
JSValue handler, target, trap;
|
|
206
|
+
int t = get_trap(ctx, o, "getOwnPropertyDescriptor", &handler, &target, &trap);
|
|
207
|
+
if (t <= 0) return t < 0 ? -1 : js_get_own_property(ctx, js_as_object(target), key, out);
|
|
208
|
+
JSValue args[2] = { target, key_value(ctx, key) };
|
|
209
|
+
if (js_is_exception(args[1])) return -1;
|
|
210
|
+
JSValue result = call_trap(ctx, trap, handler, 2, args);
|
|
211
|
+
if (js_is_exception(result)) return -1;
|
|
212
|
+
if (!js_is_object(result) && !js_is_undefined(result))
|
|
213
|
+
return fail(ctx, "'%s' on proxy: trap returned neither object nor undefined for property '%s'", "getOwnPropertyDescriptor", key);
|
|
214
|
+
JSPropertyDescriptor target_desc;
|
|
215
|
+
int has = js_get_own_property(ctx, js_as_object(target), key, &target_desc);
|
|
216
|
+
if (has < 0) return -1;
|
|
217
|
+
if (js_is_undefined(result)) {
|
|
218
|
+
if (!has) return 0;
|
|
219
|
+
if (!(target_desc.attrs & JS_PROP_CONFIGURABLE))
|
|
220
|
+
return fail(ctx, "'%s' on proxy: trap returned undefined for property '%s' which is non-configurable in the proxy target", "getOwnPropertyDescriptor", key);
|
|
221
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
222
|
+
if (extensible < 0) return -1;
|
|
223
|
+
if (!extensible)
|
|
224
|
+
return fail(ctx, "'%s' on proxy: trap returned undefined for property '%s' which exists in the non-extensible proxy target", "getOwnPropertyDescriptor", key);
|
|
225
|
+
return 0;
|
|
226
|
+
}
|
|
227
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
228
|
+
if (extensible < 0) return -1;
|
|
229
|
+
JSPropertyDescriptor d;
|
|
230
|
+
if (js_to_property_descriptor(ctx, result, &d) < 0) return -1;
|
|
231
|
+
complete(&d);
|
|
232
|
+
if (!is_compatible(ctx, extensible, &d, &target_desc, has))
|
|
233
|
+
return fail(ctx, "'%s' on proxy: trap returned descriptor for property '%s' that is incompatible with the existing property in the proxy target", "getOwnPropertyDescriptor", key);
|
|
234
|
+
if (!(d.attrs & JS_PROP_CONFIGURABLE)) {
|
|
235
|
+
if (!has || (target_desc.attrs & JS_PROP_CONFIGURABLE))
|
|
236
|
+
return fail(ctx, "'%s' on proxy: trap reported non-configurability for property '%s' which is either non-existent or configurable in the proxy target", "getOwnPropertyDescriptor", key);
|
|
237
|
+
if ((d.has & JS_DESC_WRITABLE) && !(d.attrs & JS_PROP_WRITABLE) && (target_desc.attrs & JS_PROP_WRITABLE))
|
|
238
|
+
return fail(ctx, "'%s' on proxy: trap reported non-configurable and writable for property '%s' which is non-configurable, non-writable in the proxy target", "getOwnPropertyDescriptor", key);
|
|
239
|
+
}
|
|
240
|
+
*out = d;
|
|
241
|
+
return 1;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
static int proxy_define(JSContext *ctx, JSObject *o, JSValue key, const JSPropertyDescriptor *desc, bool throw_on_fail) {
|
|
245
|
+
if (js_is_private_name(key)) return JS_ORDINARY;
|
|
246
|
+
JSValue handler, target, trap;
|
|
247
|
+
int t = get_trap(ctx, o, "defineProperty", &handler, &target, &trap);
|
|
248
|
+
if (t <= 0) return t < 0 ? -1 : js_define_own_property(ctx, js_as_object(target), key, desc, throw_on_fail);
|
|
249
|
+
JSValue args[3] = { target, key_value(ctx, key), JS_UNDEFINED };
|
|
250
|
+
if (js_is_exception(args[1])) return -1;
|
|
251
|
+
args[2] = from_partial(ctx, desc);
|
|
252
|
+
int r = call_bool_trap(ctx, trap, handler, 3, args);
|
|
253
|
+
if (r < 0) return -1;
|
|
254
|
+
if (!r) return throw_on_fail ? fail(ctx, "'%s' on proxy: trap returned falsish for property '%s'", "defineProperty", key) : 0;
|
|
255
|
+
JSPropertyDescriptor target_desc;
|
|
256
|
+
int has = js_get_own_property(ctx, js_as_object(target), key, &target_desc);
|
|
257
|
+
if (has < 0) return -1;
|
|
258
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
259
|
+
if (extensible < 0) return -1;
|
|
260
|
+
bool setting_config_false = (desc->has & JS_DESC_CONFIGURABLE) && !(desc->attrs & JS_PROP_CONFIGURABLE);
|
|
261
|
+
if (!has) {
|
|
262
|
+
if (!extensible) return fail(ctx, "'%s' on proxy: trap returned truish for adding property '%s' to the non-extensible proxy target", "defineProperty", key);
|
|
263
|
+
if (setting_config_false)
|
|
264
|
+
return fail(ctx, "'%s' on proxy: trap returned truish for defining non-configurable property '%s' which is either non-existent or configurable in the proxy target", "defineProperty", key);
|
|
265
|
+
return 1;
|
|
266
|
+
}
|
|
267
|
+
if (!is_compatible(ctx, extensible, desc, &target_desc, true))
|
|
268
|
+
return fail(ctx, "'%s' on proxy: trap returned truish for adding property '%s' that is incompatible with the existing property in the proxy target", "defineProperty", key);
|
|
269
|
+
if (setting_config_false && (target_desc.attrs & JS_PROP_CONFIGURABLE))
|
|
270
|
+
return fail(ctx, "'%s' on proxy: trap returned truish for defining non-configurable property '%s' which is either non-existent or configurable in the proxy target", "defineProperty", key);
|
|
271
|
+
if (is_data(&target_desc) && !(target_desc.attrs & JS_PROP_CONFIGURABLE) && (target_desc.attrs & JS_PROP_WRITABLE) &&
|
|
272
|
+
(desc->has & JS_DESC_WRITABLE) && !(desc->attrs & JS_PROP_WRITABLE))
|
|
273
|
+
return fail(ctx, "'%s' on proxy: trap returned truish for defining non-configurable property '%s' which cannot be non-writable, unless there exists a corresponding non-configurable, non-writable own property of the target object.", "defineProperty", key);
|
|
274
|
+
return 1;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
static int proxy_delete(JSContext *ctx, JSObject *o, JSValue key, bool throw_on_fail) {
|
|
278
|
+
if (js_is_private_name(key)) return JS_ORDINARY;
|
|
279
|
+
JSValue handler, target, trap;
|
|
280
|
+
int t = get_trap(ctx, o, "deleteProperty", &handler, &target, &trap);
|
|
281
|
+
if (t <= 0) return t < 0 ? -1 : js_delete_property(ctx, js_as_object(target), key, throw_on_fail);
|
|
282
|
+
JSValue args[2] = { target, key_value(ctx, key) };
|
|
283
|
+
if (js_is_exception(args[1])) return -1;
|
|
284
|
+
int r = call_bool_trap(ctx, trap, handler, 2, args);
|
|
285
|
+
if (r < 0) return -1;
|
|
286
|
+
if (!r) return throw_on_fail ? fail(ctx, "'%s' on proxy: trap returned falsish for property '%s'", "deleteProperty", key) : 0;
|
|
287
|
+
JSPropertyDescriptor target_desc;
|
|
288
|
+
int has = js_get_own_property(ctx, js_as_object(target), key, &target_desc);
|
|
289
|
+
if (has <= 0) return has < 0 ? -1 : 1;
|
|
290
|
+
if (!(target_desc.attrs & JS_PROP_CONFIGURABLE))
|
|
291
|
+
return fail(ctx, "'%s' on proxy: trap returned truish for property '%s' which is non-configurable in the proxy target", "deleteProperty", key);
|
|
292
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
293
|
+
if (extensible < 0) return -1;
|
|
294
|
+
if (!extensible) return fail(ctx, "'%s' on proxy: trap returned truish for property '%s' but the proxy target is non-extensible", "deleteProperty", key);
|
|
295
|
+
return 1;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/* ---- [[HasProperty]], [[Get]], [[Set]] -------------------------------------------------------- */
|
|
299
|
+
|
|
300
|
+
static int proxy_has(JSContext *ctx, JSObject *o, JSValue key) {
|
|
301
|
+
if (js_is_private_name(key)) {
|
|
302
|
+
JSPropertyDescriptor d;
|
|
303
|
+
return js_ordinary_get_own_property(ctx, o, key, &d);
|
|
304
|
+
}
|
|
305
|
+
JSValue handler, target, trap;
|
|
306
|
+
int t = get_trap(ctx, o, "has", &handler, &target, &trap);
|
|
307
|
+
if (t <= 0) return t < 0 ? -1 : js_has_property(ctx, js_as_object(target), key);
|
|
308
|
+
JSValue args[2] = { target, key_value(ctx, key) };
|
|
309
|
+
if (js_is_exception(args[1])) return -1;
|
|
310
|
+
int r = call_bool_trap(ctx, trap, handler, 2, args);
|
|
311
|
+
if (r != 0) return r;
|
|
312
|
+
JSPropertyDescriptor target_desc;
|
|
313
|
+
int has = js_get_own_property(ctx, js_as_object(target), key, &target_desc);
|
|
314
|
+
if (has <= 0) return has;
|
|
315
|
+
if (!(target_desc.attrs & JS_PROP_CONFIGURABLE))
|
|
316
|
+
return fail(ctx, "'%s' on proxy: trap returned falsish for property '%s' which exists in the proxy target as non-configurable", "has", key);
|
|
317
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
318
|
+
if (extensible < 0) return -1;
|
|
319
|
+
if (!extensible) return fail(ctx, "'%s' on proxy: trap returned falsish for property '%s' but the proxy target is not extensible", "has", key);
|
|
320
|
+
return 0;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
static JSValue proxy_get(JSContext *ctx, JSObject *o, JSValue key, JSValue receiver) {
|
|
324
|
+
if (js_is_private_name(key)) {
|
|
325
|
+
JSPropertyDescriptor d;
|
|
326
|
+
int r = js_ordinary_get_own_property(ctx, o, key, &d);
|
|
327
|
+
if (r <= 0) return r < 0 ? JS_EXCEPTION : JS_UNDEFINED;
|
|
328
|
+
if (d.has & JS_DESC_VALUE) return d.value;
|
|
329
|
+
return js_is_undefined(d.get) ? JS_UNDEFINED : js_call(ctx, d.get, receiver, 0, NULL);
|
|
330
|
+
}
|
|
331
|
+
JSValue handler, target, trap;
|
|
332
|
+
int t = get_trap(ctx, o, "get", &handler, &target, &trap);
|
|
333
|
+
if (t <= 0) return t < 0 ? JS_EXCEPTION : js_get(ctx, js_as_object(target), key, receiver);
|
|
334
|
+
JSValue args[3] = { target, key_value(ctx, key), receiver };
|
|
335
|
+
if (js_is_exception(args[1])) return JS_EXCEPTION;
|
|
336
|
+
JSValue v = call_trap(ctx, trap, handler, 3, args);
|
|
337
|
+
if (js_is_exception(v)) return v;
|
|
338
|
+
JSPropertyDescriptor d;
|
|
339
|
+
int has = js_get_own_property(ctx, js_as_object(target), key, &d);
|
|
340
|
+
if (has < 0) return JS_EXCEPTION;
|
|
341
|
+
if (has && !(d.attrs & JS_PROP_CONFIGURABLE)) {
|
|
342
|
+
if (is_data(&d) && !(d.attrs & JS_PROP_WRITABLE) && !js_same_value(ctx, v, d.value)) {
|
|
343
|
+
char k[128], expected[128], got[128];
|
|
344
|
+
key_text(ctx, key, k, sizeof k);
|
|
345
|
+
js_describe_value(ctx, d.value, expected, sizeof expected);
|
|
346
|
+
js_describe_value(ctx, v, got, sizeof got);
|
|
347
|
+
return js_throw_type_error(ctx, "'get' on proxy: property '%s' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected '%s' but got '%s')",
|
|
348
|
+
k, expected, got);
|
|
349
|
+
}
|
|
350
|
+
if (is_accessor(&d) && js_is_undefined(d.get) && !js_is_undefined(v)) {
|
|
351
|
+
char k[128], got[128];
|
|
352
|
+
key_text(ctx, key, k, sizeof k);
|
|
353
|
+
js_describe_value(ctx, v, got, sizeof got);
|
|
354
|
+
return js_throw_type_error(ctx, "'get' on proxy: property '%s' is a non-configurable accessor property on the proxy target and does not have a getter function, but the trap did not return 'undefined' (got '%s')",
|
|
355
|
+
k, got);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return v;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
static int proxy_set(JSContext *ctx, JSObject *o, JSValue key, JSValue v, JSValue receiver, bool throw_on_fail) {
|
|
362
|
+
if (js_is_private_name(key)) {
|
|
363
|
+
JSPropertyDescriptor d = js_data_descriptor(v, JS_PROP_WRITABLE);
|
|
364
|
+
d.has = JS_DESC_VALUE;
|
|
365
|
+
return js_ordinary_define_own_property(ctx, o, key, &d, throw_on_fail);
|
|
366
|
+
}
|
|
367
|
+
JSValue handler, target, trap;
|
|
368
|
+
int t = get_trap(ctx, o, "set", &handler, &target, &trap);
|
|
369
|
+
if (t <= 0) return t < 0 ? -1 : js_set(ctx, js_as_object(target), key, v, receiver, throw_on_fail);
|
|
370
|
+
JSValue args[4] = { target, key_value(ctx, key), v, receiver };
|
|
371
|
+
if (js_is_exception(args[1])) return -1;
|
|
372
|
+
int r = call_bool_trap(ctx, trap, handler, 4, args);
|
|
373
|
+
if (r < 0) return -1;
|
|
374
|
+
if (!r) return throw_on_fail ? fail(ctx, "'%s' on proxy: trap returned falsish for property '%s'", "set", key) : 0;
|
|
375
|
+
JSPropertyDescriptor d;
|
|
376
|
+
int has = js_get_own_property(ctx, js_as_object(target), key, &d);
|
|
377
|
+
if (has < 0) return -1;
|
|
378
|
+
if (has && !(d.attrs & JS_PROP_CONFIGURABLE)) {
|
|
379
|
+
if (is_data(&d) && !(d.attrs & JS_PROP_WRITABLE) && !js_same_value(ctx, v, d.value))
|
|
380
|
+
return fail(ctx, "'%s' on proxy: trap returned truish for property '%s' which exists in the proxy target as a non-configurable and non-writable data property with a different value", "set", key);
|
|
381
|
+
if (is_accessor(&d) && js_is_undefined(d.set))
|
|
382
|
+
return fail(ctx, "'%s' on proxy: trap returned truish for property '%s' which exists in the proxy target as a non-configurable and non-writable accessor property without a setter", "set", key);
|
|
383
|
+
}
|
|
384
|
+
return 1;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/* ---- [[OwnPropertyKeys]] ---------------------------------------------------------------------- */
|
|
388
|
+
|
|
389
|
+
static bool same_key(JSContext *ctx, JSValue a, JSValue b) {
|
|
390
|
+
return js_same_bits(a, b) || (js_is_string(a) && js_is_string(b) && js_string_equals(ctx, a, b));
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/* The index of key in list[0..n), or -1. */
|
|
394
|
+
static int64_t index_of(JSContext *ctx, const JSValue *list, uint32_t n, JSValue key) {
|
|
395
|
+
for (uint32_t i = 0; i < n; i++)
|
|
396
|
+
if (same_key(ctx, list[i], key)) return i;
|
|
397
|
+
return -1;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
static JSValue proxy_own_keys(JSContext *ctx, JSObject *o) {
|
|
401
|
+
JSValue handler, target, trap;
|
|
402
|
+
int t = get_trap(ctx, o, "ownKeys", &handler, &target, &trap);
|
|
403
|
+
if (t <= 0) return t < 0 ? JS_EXCEPTION : js_own_keys(ctx, js_as_object(target));
|
|
404
|
+
JSValue array = call_trap(ctx, trap, handler, 1, &target);
|
|
405
|
+
if (js_is_exception(array)) return array;
|
|
406
|
+
/* CreateListFromArrayLike(array, « String, Symbol »), as property keys, without duplicates */
|
|
407
|
+
if (!js_is_object(array)) return js_throw_type_error(ctx, "CreateListFromArrayLike called on non-object");
|
|
408
|
+
double len;
|
|
409
|
+
if (js_length_of_array_like(ctx, array, &len) < 0) return JS_EXCEPTION;
|
|
410
|
+
if (len > 1e7) return js_throw_range_error(ctx, "Invalid array length");
|
|
411
|
+
uint32_t n = (uint32_t)len;
|
|
412
|
+
JSValueArray *keys = js_alloc_value_array(ctx, n);
|
|
413
|
+
JSValue held = js_cell(&keys->cell);
|
|
414
|
+
for (uint32_t i = 0; i < n; i++) {
|
|
415
|
+
JSValue v = js_get_value(ctx, array, js_index_key(i));
|
|
416
|
+
if (js_is_exception(v)) return v;
|
|
417
|
+
if (!js_is_string(v) && !js_is_symbol(v)) {
|
|
418
|
+
char what[128];
|
|
419
|
+
js_describe_value(ctx, v, what, sizeof what);
|
|
420
|
+
return js_throw_type_error(ctx, "%s is not a valid property name", what);
|
|
421
|
+
}
|
|
422
|
+
JSValue key = js_to_property_key(ctx, v);
|
|
423
|
+
if (js_is_exception(key)) return key;
|
|
424
|
+
if (index_of(ctx, keys->values, i, key) >= 0) return js_throw_type_error(ctx, "'ownKeys' on proxy: trap returned duplicate entries");
|
|
425
|
+
js_store(ctx, &keys->cell, &keys->values[i], key);
|
|
426
|
+
}
|
|
427
|
+
int extensible = js_object_is_extensible(ctx, js_as_object(target));
|
|
428
|
+
if (extensible < 0) return JS_EXCEPTION;
|
|
429
|
+
JSValue target_keys = js_own_keys(ctx, js_as_object(target));
|
|
430
|
+
if (js_is_exception(target_keys)) return target_keys;
|
|
431
|
+
JSValueArray *tk = (JSValueArray *)js_as_cell(target_keys);
|
|
432
|
+
/* the target's keys, non-configurable ones first */
|
|
433
|
+
JSValueArray *sorted = js_alloc_value_array(ctx, tk->cell.aux);
|
|
434
|
+
uint32_t nonconfig = 0, nsorted = 0;
|
|
435
|
+
for (int pass = 0; pass < 2; pass++)
|
|
436
|
+
for (uint32_t i = 0; i < tk->cell.aux; i++) {
|
|
437
|
+
JSPropertyDescriptor d;
|
|
438
|
+
int has = js_get_own_property(ctx, js_as_object(target), tk->values[i], &d);
|
|
439
|
+
if (has < 0) return JS_EXCEPTION;
|
|
440
|
+
bool nc = has && !(d.attrs & JS_PROP_CONFIGURABLE);
|
|
441
|
+
if (nc != (pass == 0)) continue;
|
|
442
|
+
js_store(ctx, &sorted->cell, &sorted->values[nsorted++], tk->values[i]);
|
|
443
|
+
if (nc) nonconfig++;
|
|
444
|
+
}
|
|
445
|
+
if (extensible && nonconfig == 0) return held;
|
|
446
|
+
/* each target key we must see: checked off a copy of the trap's list */
|
|
447
|
+
bool *seen = n ? calloc(n, sizeof *seen) : NULL;
|
|
448
|
+
for (uint32_t i = 0; i < nsorted; i++) {
|
|
449
|
+
if (extensible && i >= nonconfig) break;
|
|
450
|
+
int64_t at = index_of(ctx, keys->values, n, sorted->values[i]);
|
|
451
|
+
if (at < 0 || seen[at]) {
|
|
452
|
+
free(seen);
|
|
453
|
+
char k[128];
|
|
454
|
+
key_text(ctx, sorted->values[i], k, sizeof k);
|
|
455
|
+
return js_throw_type_error(ctx, "'ownKeys' on proxy: trap result did not include '%s'", k);
|
|
456
|
+
}
|
|
457
|
+
seen[at] = true;
|
|
458
|
+
}
|
|
459
|
+
bool extra = false;
|
|
460
|
+
for (uint32_t i = 0; i < n && !extensible; i++) extra |= !seen[i];
|
|
461
|
+
free(seen);
|
|
462
|
+
if (extra) return js_throw_type_error(ctx, "'ownKeys' on proxy: trap returned extra keys but proxy target is non-extensible");
|
|
463
|
+
js_keep_alive(target_keys);
|
|
464
|
+
js_keep_alive(held);
|
|
465
|
+
return held;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/* ---- [[Call]] and [[Construct]] ---------------------------------------------------------------- */
|
|
469
|
+
|
|
470
|
+
static JSValue proxy_entry(JSContext *ctx, JSValue callee, JSValue this_val, uint32_t argc, const JSValue *argv, JSValue new_target) {
|
|
471
|
+
JSObject *o = js_as_object(callee);
|
|
472
|
+
bool construct = !js_is_undefined(new_target);
|
|
473
|
+
JSValue handler, target, trap;
|
|
474
|
+
int t = get_trap(ctx, o, construct ? "construct" : "apply", &handler, &target, &trap);
|
|
475
|
+
if (t < 0) return JS_EXCEPTION;
|
|
476
|
+
if (!t) return construct ? js_construct(ctx, target, argc, argv, new_target, NULL) : js_call(ctx, target, this_val, argc, argv);
|
|
477
|
+
JSValue list = js_new_array_from(ctx, argv, argc);
|
|
478
|
+
if (js_is_exception(list)) return list;
|
|
479
|
+
if (!construct) {
|
|
480
|
+
JSValue args[3] = { target, this_val, list };
|
|
481
|
+
return call_trap(ctx, trap, handler, 3, args);
|
|
482
|
+
}
|
|
483
|
+
JSValue args[3] = { target, list, new_target };
|
|
484
|
+
JSValue r = call_trap(ctx, trap, handler, 3, args);
|
|
485
|
+
if (js_is_exception(r) || js_is_object(r)) return r;
|
|
486
|
+
char what[128];
|
|
487
|
+
js_describe_value(ctx, r, what, sizeof what);
|
|
488
|
+
return js_throw_type_error(ctx, "'construct' on proxy: trap returned non-object ('%s')", what);
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/* ---- Classes ----------------------------------------------------------------------------------- */
|
|
492
|
+
|
|
493
|
+
static JSValue proxy_target(JSObject *o) { return *target_slot(o); }
|
|
494
|
+
|
|
495
|
+
static const JSObjectMethods proxy_methods = {
|
|
496
|
+
proxy_get_prototype_of, proxy_set_prototype_of, proxy_is_extensible, proxy_prevent_extensions,
|
|
497
|
+
proxy_has, proxy_get, proxy_set, proxy_own_keys, proxy_target,
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
static void proxy_visit(JSCell *c, JSTracer *trc) {
|
|
501
|
+
JSObject *o = (JSObject *)c;
|
|
502
|
+
js_trace_value(trc, *target_slot(o));
|
|
503
|
+
js_trace_value(trc, *handler_slot(o));
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
static const JSClass proxy_class = { "Proxy", sizeof(ProxyObject), proxy_get_own, proxy_define, proxy_delete, NULL, proxy_visit, NULL, &proxy_methods };
|
|
507
|
+
static const JSClass proxy_function_class = { "Proxy", sizeof(JSFunction), proxy_get_own, proxy_define, proxy_delete, NULL, proxy_visit, NULL, &proxy_methods };
|
|
508
|
+
|
|
509
|
+
/* ProxyCreate (§10.5.14) */
|
|
510
|
+
static JSValue proxy_create(JSContext *ctx, JSValue target, JSValue handler) {
|
|
511
|
+
if (!js_is_object(target) || !js_is_object(handler)) return js_throw_type_error(ctx, "Cannot create proxy with a non-object as target or handler");
|
|
512
|
+
JSObject *o;
|
|
513
|
+
if (js_is_callable(target)) {
|
|
514
|
+
JSFunction *f = (JSFunction *)js_alloc_object(ctx, JS_CELL_FUNCTION, js_shape_root(ctx, &proxy_function_class, JS_NULL, 0));
|
|
515
|
+
f->entry = proxy_entry;
|
|
516
|
+
f->realm = ctx;
|
|
517
|
+
f->flags = JS_FN_STRICT | JS_FN_PROXY | (js_is_constructor(target) ? JS_FN_CONSTRUCTOR : 0);
|
|
518
|
+
o = &f->obj;
|
|
519
|
+
} else {
|
|
520
|
+
o = js_alloc_object(ctx, JS_CELL_OBJECT, js_shape_root(ctx, &proxy_class, JS_NULL, 0));
|
|
521
|
+
}
|
|
522
|
+
js_store(ctx, &o->cell, target_slot(o), target);
|
|
523
|
+
js_store(ctx, &o->cell, handler_slot(o), handler);
|
|
524
|
+
return js_object_value(o);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
BUILTIN(proxy_ctor) {
|
|
528
|
+
(void)callee, (void)this_val;
|
|
529
|
+
if (js_is_undefined(new_target)) return js_throw_type_error(ctx, "Constructor Proxy requires 'new'");
|
|
530
|
+
return proxy_create(ctx, ARG(0), ARG(1));
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/* The revoke function: its home_object holds the proxy until it runs. */
|
|
534
|
+
BUILTIN(proxy_revoke) {
|
|
535
|
+
(void)this_val, (void)argc, (void)argv, (void)new_target;
|
|
536
|
+
JSFunction *f = js_as_function(callee);
|
|
537
|
+
if (js_is_object(f->home_object)) {
|
|
538
|
+
JSObject *p = js_as_object(f->home_object);
|
|
539
|
+
js_store(ctx, &p->cell, target_slot(p), JS_NULL);
|
|
540
|
+
js_store(ctx, &p->cell, handler_slot(p), JS_NULL);
|
|
541
|
+
js_store(ctx, &f->obj.cell, &f->home_object, JS_NULL);
|
|
542
|
+
}
|
|
543
|
+
return JS_UNDEFINED;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/* Proxy.revocable(target, handler) (§28.2.2.1): { proxy, revoke } */
|
|
547
|
+
BUILTIN(proxy_revocable) {
|
|
548
|
+
(void)callee, (void)this_val, (void)new_target;
|
|
549
|
+
JSValue proxy = proxy_create(ctx, ARG(0), ARG(1));
|
|
550
|
+
if (js_is_exception(proxy)) return proxy;
|
|
551
|
+
JSValue revoke = js_new_native(ctx, proxy_revoke, js_empty_string(), 0, JS_FN_STRICT);
|
|
552
|
+
js_store(ctx, &js_as_object(revoke)->cell, &js_as_function(revoke)->home_object, proxy);
|
|
553
|
+
JSValue result = js_new_object(ctx);
|
|
554
|
+
js_define_data(ctx, js_as_object(result), js_atom_from_cstr(ctx, "proxy"), proxy, JS_PROP_DEFAULT);
|
|
555
|
+
js_define_data(ctx, js_as_object(result), js_atom_from_cstr(ctx, "revoke"), revoke, JS_PROP_DEFAULT);
|
|
556
|
+
return result;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
static const JSBuiltin proxy_statics[] = {
|
|
560
|
+
JS_BUILTIN_FN("revocable", proxy_revocable, 2),
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
static void install_proxy(JSContext *ctx, JSObject *global) {
|
|
564
|
+
JSValue key = js_atom_from_cstr(ctx, "Proxy");
|
|
565
|
+
JSValue c = js_new_native(ctx, proxy_ctor, key, 2, JS_FN_STRICT | JS_FN_CONSTRUCTOR); /* no `prototype` (§28.2.2) */
|
|
566
|
+
js_define_builtins(ctx, js_as_object(c), proxy_statics, JS_COUNTOF(proxy_statics));
|
|
567
|
+
js_define_data(ctx, global, key, c, JS_BUILTIN_METHOD_ATTRS);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
const JSComponent js_component_proxy = { "proxy", install_proxy };
|