visaljs 0.0.7 → 0.0.9
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/README.md +68 -4
- package/THIRD_PARTY_LICENSES +1216 -0
- package/cli.js +4461 -321
- package/node/include/js_node.h +57 -1
- package/node/include/js_uv.h +8 -1
- package/node/prelude/_http_agent.js +5 -0
- package/node/prelude/_http_server.js +7 -0
- package/node/prelude/_stream_duplex.js +4 -0
- package/node/prelude/_stream_passthrough.js +4 -0
- package/node/prelude/_stream_readable.js +4 -0
- package/node/prelude/_stream_transform.js +4 -0
- package/node/prelude/_stream_writable.js +4 -0
- package/node/prelude/assert.js +1334 -0
- package/node/prelude/assert_strict.js +12 -0
- package/node/prelude/async_hooks.js +1 -1
- package/node/prelude/buffer.js +43 -3
- package/node/prelude/child_process.js +1098 -0
- package/node/prelude/cluster.js +52 -0
- package/node/prelude/console.js +328 -0
- package/node/prelude/constants.js +10 -0
- package/node/prelude/crypto.js +1 -1
- package/node/prelude/diagnostics_channel.js +1 -1
- package/node/prelude/dns.js +8 -2
- package/node/prelude/domain.js +115 -0
- package/node/prelude/events.js +148 -16
- package/node/prelude/fs.js +1138 -151
- package/node/prelude/fs_promises.js +117 -11
- package/node/prelude/http.js +784 -301
- package/node/prelude/http2.js +1 -1
- package/node/prelude/https.js +159 -0
- package/node/prelude/inspector.js +27 -0
- package/node/prelude/inspector_promises.js +4 -0
- package/node/prelude/internal/async_context.js +1 -1
- package/node/prelude/internal/buffer_transcode.js +44 -0
- package/node/prelude/internal/comparisons.js +916 -0
- package/node/prelude/internal/compression_streams.js +153 -0
- package/node/prelude/internal/crypto/asym.js +27 -14
- package/node/prelude/internal/crypto/cipher.js +16 -5
- package/node/prelude/internal/crypto/diffiehellman.js +3 -2
- package/node/prelude/internal/crypto/hash.js +2 -1
- package/node/prelude/internal/crypto/kdf.js +14 -9
- package/node/prelude/internal/crypto/keys.js +63 -50
- package/node/prelude/internal/crypto/random.js +2 -1
- package/node/prelude/internal/crypto/util.js +4 -4
- package/node/prelude/internal/dotenv.js +98 -0
- package/node/prelude/internal/errors.js +21 -5
- package/node/prelude/internal/events_extras.js +113 -0
- package/node/prelude/internal/events_on.js +100 -0
- package/node/prelude/internal/features.js +72 -0
- package/node/prelude/internal/fetch.js +364 -0
- package/node/prelude/internal/form_data.js +376 -0
- package/node/prelude/internal/fs_bigint_stats.js +41 -0
- package/node/prelude/internal/fs_blob.js +19 -0
- package/node/prelude/internal/fs_cp.js +709 -0
- package/node/prelude/internal/fs_dir.js +166 -0
- package/node/prelude/internal/fs_filehandle.js +287 -0
- package/node/prelude/internal/fs_glob.js +296 -0
- package/node/prelude/internal/fs_statfs.js +42 -0
- package/node/prelude/internal/fs_stats.js +89 -0
- package/node/prelude/internal/fs_streams.js +541 -0
- package/node/prelude/internal/fs_utils.js +286 -0
- package/node/prelude/internal/fs_watch.js +580 -0
- package/node/prelude/internal/http_agent.js +114 -2
- package/node/prelude/internal/http_symbols.js +3 -0
- package/node/prelude/internal/mime.js +249 -0
- package/node/prelude/internal/net.js +1 -0
- package/node/prelude/internal/net_bound.js +123 -0
- package/node/prelude/internal/net_onread.js +73 -0
- package/node/prelude/internal/net_tos.js +54 -0
- package/node/prelude/internal/parse_args.js +288 -0
- package/node/prelude/internal/perf_histogram.js +435 -0
- package/node/prelude/internal/perf_observe.js +125 -0
- package/node/prelude/internal/performance_global.js +19 -0
- package/node/prelude/internal/process_events.js +49 -1
- package/node/prelude/internal/process_memory.js +14 -0
- package/node/prelude/internal/process_more.js +414 -0
- package/node/prelude/internal/process_signals.js +2 -1
- package/node/prelude/internal/process_stdin.js +52 -0
- package/node/prelude/internal/process_stdio.js +36 -0
- package/node/prelude/internal/querystring.js +0 -0
- package/node/prelude/internal/readline.js +338 -0
- package/node/prelude/internal/socketaddress.js +8 -4
- package/node/prelude/internal/source_map.js +122 -0
- package/node/prelude/internal/stream_compose.js +74 -0
- package/node/prelude/internal/stream_from.js +6 -0
- package/node/prelude/internal/stream_operators.js +23 -0
- package/node/prelude/internal/stream_pipeline.js +7 -0
- package/node/prelude/internal/stream_transform.js +10 -0
- package/node/prelude/internal/stream_web_adapters.js +143 -0
- package/node/prelude/internal/streams/add_abort_signal.js +58 -0
- package/node/prelude/internal/streams/compose.js +244 -0
- package/node/prelude/internal/streams/destroy.js +358 -0
- package/node/prelude/internal/streams/duplex.js +199 -0
- package/node/prelude/internal/streams/duplexify.js +378 -0
- package/node/prelude/internal/streams/end_of_stream.js +387 -0
- package/node/prelude/internal/streams/errors.js +216 -0
- package/node/prelude/internal/streams/from.js +211 -0
- package/node/prelude/internal/streams/legacy.js +120 -0
- package/node/prelude/internal/streams/operators.js +375 -0
- package/node/prelude/internal/streams/passthrough.js +45 -0
- package/node/prelude/internal/streams/pipeline.js +468 -0
- package/node/prelude/internal/streams/readable.js +1835 -0
- package/node/prelude/internal/streams/state.js +48 -0
- package/node/prelude/internal/streams/transform.js +203 -0
- package/node/prelude/internal/streams/utils.js +355 -0
- package/node/prelude/internal/streams/validators.js +108 -0
- package/node/prelude/internal/streams/writable.js +1160 -0
- package/node/prelude/internal/structured_clone.js +238 -0
- package/node/prelude/internal/system_errors.js +37 -0
- package/node/prelude/internal/test_runner/mock.js +431 -0
- package/node/prelude/internal/test_runner/reporters.js +404 -0
- package/node/prelude/internal/test_runner/test.js +1571 -0
- package/node/prelude/internal/timers.js +38 -7
- package/node/prelude/internal/timers_global.js +1 -1
- package/node/prelude/internal/tls/common.js +8 -2
- package/node/prelude/internal/tls/wrap.js +5 -16
- package/node/prelude/internal/tls/x509.js +1 -1
- package/node/prelude/internal/tty_read_stream.js +39 -0
- package/node/prelude/internal/tty_streams.js +3 -0
- package/node/prelude/internal/util_debuglog.js +68 -0
- package/node/prelude/internal/util_diff.js +63 -0
- package/node/prelude/internal/util_more.js +111 -0
- package/node/prelude/internal/util_styles.js +76 -0
- package/node/prelude/internal/zlib_engines.js +1 -1
- package/node/prelude/module.js +219 -8
- package/node/prelude/net.js +197 -49
- package/node/prelude/os.js +88 -11
- package/node/prelude/path.js +11 -7
- package/node/prelude/path_posix.js +1 -1
- package/node/prelude/path_win32.js +1 -1
- package/node/prelude/perf_hooks.js +151 -0
- package/node/prelude/process.js +36 -1
- package/node/prelude/punycode.js +188 -0
- package/node/prelude/querystring.js +1 -1
- package/node/prelude/readline.js +8 -0
- package/node/prelude/readline_promises.js +88 -0
- package/node/prelude/repl.js +38 -0
- package/node/prelude/sea.js +23 -0
- package/node/prelude/stream.js +70 -1332
- package/node/prelude/stream_consumers.js +34 -0
- package/node/prelude/stream_promises.js +1 -1
- package/node/prelude/stream_web.js +15 -2
- package/node/prelude/string_decoder.js +1 -1
- package/node/prelude/sys.js +7 -0
- package/node/prelude/test.js +56 -0
- package/node/prelude/test_reporters.js +269 -0
- package/node/prelude/timers.js +7 -84
- package/node/prelude/timers_promises.js +1 -1
- package/node/prelude/tls.js +2 -1
- package/node/prelude/trace_events.js +52 -0
- package/node/prelude/tty.js +10 -4
- package/node/prelude/url.js +88 -27
- package/node/prelude/util.js +121 -5
- package/node/prelude/util_types.js +4 -3
- package/node/prelude/v8.js +814 -0
- package/node/prelude/vm.js +86 -0
- package/node/prelude/wasi.js +10 -0
- package/node/prelude/worker_threads.js +56 -0
- package/node/prelude/zlib.js +58 -25
- package/node/src/host_brotli.c +59 -11
- package/node/src/host_fs.c +342 -11
- package/node/src/host_fswatch.c +170 -0
- package/node/src/host_http.c +292 -39
- package/node/src/host_loop.c +25 -2
- package/node/src/host_net.c +130 -16
- package/node/src/host_os.c +55 -1
- package/node/src/host_proc.c +291 -0
- package/node/src/host_process.c +488 -0
- package/node/src/host_sys.c +64 -2
- package/node/src/host_zlib.c +27 -7
- package/node/src/host_zstd.c +41 -6
- package/node/third_party/hdrhistogram/LICENSE +42 -0
- package/node/third_party/hdrhistogram/README.md +5 -0
- package/node/third_party/libuv/LICENSE +0 -0
- package/node/third_party/libuv/LICENSE-extra +36 -0
- package/node/third_party/libuv/include/uv/aix.h +0 -0
- package/node/third_party/libuv/include/uv/bsd.h +0 -0
- package/node/third_party/libuv/include/uv/darwin.h +0 -0
- package/node/third_party/libuv/include/uv/errno.h +0 -0
- package/node/third_party/libuv/include/uv/linux.h +0 -0
- package/node/third_party/libuv/include/uv/os390.h +0 -0
- package/node/third_party/libuv/include/uv/posix.h +0 -0
- package/node/third_party/libuv/include/uv/sunos.h +0 -0
- package/node/third_party/libuv/include/uv/threadpool.h +0 -0
- package/node/third_party/libuv/include/uv/tree.h +0 -0
- package/node/third_party/libuv/include/uv/unix.h +0 -0
- package/node/third_party/libuv/include/uv/version.h +0 -0
- package/node/third_party/libuv/include/uv/win.h +0 -0
- package/node/third_party/libuv/include/uv.h +0 -0
- package/node/third_party/libuv/src/fs-poll.c +0 -0
- package/node/third_party/libuv/src/heap-inl.h +0 -0
- package/node/third_party/libuv/src/idna.c +0 -0
- package/node/third_party/libuv/src/idna.h +0 -0
- package/node/third_party/libuv/src/inet.c +0 -0
- package/node/third_party/libuv/src/queue.h +0 -0
- package/node/third_party/libuv/src/random.c +0 -0
- package/node/third_party/libuv/src/strscpy.c +0 -0
- package/node/third_party/libuv/src/strscpy.h +0 -0
- package/node/third_party/libuv/src/strtok.c +0 -0
- package/node/third_party/libuv/src/strtok.h +0 -0
- package/node/third_party/libuv/src/thread-common.c +0 -0
- package/node/third_party/libuv/src/threadpool.c +0 -0
- package/node/third_party/libuv/src/timer.c +0 -0
- package/node/third_party/libuv/src/unix/async.c +0 -0
- package/node/third_party/libuv/src/unix/bsd-ifaddrs.c +0 -0
- package/node/third_party/libuv/src/unix/core.c +0 -0
- package/node/third_party/libuv/src/unix/darwin-proctitle.c +0 -0
- package/node/third_party/libuv/src/unix/darwin-stub.h +0 -0
- package/node/third_party/libuv/src/unix/darwin-syscalls.h +0 -0
- package/node/third_party/libuv/src/unix/darwin.c +0 -0
- package/node/third_party/libuv/src/unix/dl.c +0 -0
- package/node/third_party/libuv/src/unix/fs.c +0 -0
- package/node/third_party/libuv/src/unix/fsevents.c +0 -0
- package/node/third_party/libuv/src/unix/getaddrinfo.c +0 -0
- package/node/third_party/libuv/src/unix/getnameinfo.c +0 -0
- package/node/third_party/libuv/src/unix/internal.h +0 -0
- package/node/third_party/libuv/src/unix/kqueue.c +0 -0
- package/node/third_party/libuv/src/unix/linux.c +0 -0
- package/node/third_party/libuv/src/unix/loop-watcher.c +0 -0
- package/node/third_party/libuv/src/unix/loop.c +0 -0
- package/node/third_party/libuv/src/unix/pipe.c +0 -0
- package/node/third_party/libuv/src/unix/poll.c +0 -0
- package/node/third_party/libuv/src/unix/process.c +0 -0
- package/node/third_party/libuv/src/unix/procfs-exepath.c +0 -0
- package/node/third_party/libuv/src/unix/proctitle.c +0 -0
- package/node/third_party/libuv/src/unix/random-devurandom.c +0 -0
- package/node/third_party/libuv/src/unix/random-getentropy.c +0 -0
- package/node/third_party/libuv/src/unix/random-getrandom.c +0 -0
- package/node/third_party/libuv/src/unix/random-sysctl-linux.c +0 -0
- package/node/third_party/libuv/src/unix/signal.c +0 -0
- package/node/third_party/libuv/src/unix/stream.c +0 -0
- package/node/third_party/libuv/src/unix/tcp.c +0 -0
- package/node/third_party/libuv/src/unix/thread.c +0 -0
- package/node/third_party/libuv/src/unix/tty.c +0 -0
- package/node/third_party/libuv/src/unix/udp.c +0 -0
- package/node/third_party/libuv/src/uv-common.c +0 -0
- package/node/third_party/libuv/src/uv-common.h +0 -0
- package/node/third_party/libuv/src/uv-data-getter-setters.c +0 -0
- package/node/third_party/libuv/src/version.c +0 -0
- package/node/third_party/llhttp/LICENSE +0 -0
- package/node/third_party/llhttp/api.c +0 -0
- package/node/third_party/llhttp/http.c +0 -0
- package/node/third_party/llhttp/llhttp.c +0 -0
- package/node/third_party/llhttp/llhttp.h +0 -0
- package/node/third_party/nodejs/LICENSE +47 -0
- package/node/third_party/nodejs/README.md +5 -0
- package/node/third_party/parseargs/LICENSE +21 -0
- package/node/third_party/parseargs/README.md +5 -0
- package/node/third_party/punycode/LICENSE +20 -0
- package/node/third_party/punycode/README.md +5 -0
- package/node/third_party/zlib/LICENSE.chromium +27 -0
- package/package.json +1 -1
- package/prebuilt/darwin-arm64/boringssl-4a47438eaf7e73ba.a +0 -0
- package/prebuilt/darwin-arm64/brotli-7995bbdacc52e51c.a +0 -0
- package/prebuilt/darwin-arm64/uv-72ab666eae197cd8.a +0 -0
- package/prebuilt/darwin-arm64/zlib-4ce2317a4c3f5fb5.a +0 -0
- package/prebuilt/darwin-arm64/zstd-015315ac7c784c73.a +0 -0
- package/prebuilt/darwin-x64/boringssl-4a47438eaf7e73ba.a +0 -0
- package/prebuilt/darwin-x64/brotli-7995bbdacc52e51c.a +0 -0
- package/prebuilt/darwin-x64/uv-72ab666eae197cd8.a +0 -0
- package/prebuilt/darwin-x64/zlib-4ce2317a4c3f5fb5.a +0 -0
- package/prebuilt/darwin-x64/zstd-015315ac7c784c73.a +0 -0
- package/prebuilt/linux-arm64/boringssl-4a47438eaf7e73ba.a +0 -0
- package/prebuilt/linux-arm64/brotli-65481ff838ce9def.a +0 -0
- package/prebuilt/linux-arm64/uv-f1353f50ff983f3c.a +0 -0
- package/prebuilt/linux-arm64/zlib-4ce2317a4c3f5fb5.a +0 -0
- package/prebuilt/linux-arm64/zstd-015315ac7c784c73.a +0 -0
- package/prebuilt/linux-arm64-musl/boringssl-4a47438eaf7e73ba.a +0 -0
- package/prebuilt/linux-arm64-musl/brotli-65481ff838ce9def.a +0 -0
- package/prebuilt/linux-arm64-musl/uv-f1353f50ff983f3c.a +0 -0
- package/prebuilt/linux-arm64-musl/zlib-4ce2317a4c3f5fb5.a +0 -0
- package/prebuilt/linux-arm64-musl/zstd-015315ac7c784c73.a +0 -0
- package/prebuilt/linux-x64/boringssl-4a47438eaf7e73ba.a +0 -0
- package/prebuilt/linux-x64/brotli-65481ff838ce9def.a +0 -0
- package/prebuilt/linux-x64/uv-f1353f50ff983f3c.a +0 -0
- package/prebuilt/linux-x64/zlib-4ce2317a4c3f5fb5.a +0 -0
- package/prebuilt/linux-x64/zstd-015315ac7c784c73.a +0 -0
- package/prebuilt/linux-x64-musl/boringssl-4a47438eaf7e73ba.a +0 -0
- package/prebuilt/linux-x64-musl/brotli-65481ff838ce9def.a +0 -0
- package/prebuilt/linux-x64-musl/uv-f1353f50ff983f3c.a +0 -0
- package/prebuilt/linux-x64-musl/zlib-4ce2317a4c3f5fb5.a +0 -0
- package/prebuilt/linux-x64-musl/zstd-015315ac7c784c73.a +0 -0
- package/prebuilt/win32-x64/boringssl-ce573858472b7fc9.a +0 -0
- package/prebuilt/win32-x64/brotli-20d86a61f30baeb3.a +0 -0
- package/prebuilt/win32-x64/uv-b11bae65d7fced82.a +0 -0
- package/prebuilt/win32-x64/zlib-4ce2317a4c3f5fb5.a +0 -0
- package/prebuilt/win32-x64/zstd-015315ac7c784c73.a +0 -0
- package/runtime/include/js_atoms.gen.h +0 -0
- package/runtime/include/js_atoms.h +5 -1
- package/runtime/include/js_bigint.h +1 -1
- package/runtime/include/js_buffer.h +4 -4
- package/runtime/include/js_builtins.h +41 -3
- package/runtime/include/js_console.h +9 -4
- package/runtime/include/js_convert.h +1 -1
- package/runtime/include/js_core.def +5 -4
- package/runtime/include/js_crypto.h +1 -1
- package/runtime/include/js_error.h +1 -1
- package/runtime/include/js_exception.h +21 -1
- package/runtime/include/js_function.h +33 -9
- package/runtime/include/js_gc.h +172 -30
- package/runtime/include/js_generator.h +2 -2
- package/runtime/include/js_host.h +19 -1
- package/runtime/include/js_jobs.h +5 -5
- package/runtime/include/js_module.h +1 -1
- package/runtime/include/js_object.h +142 -15
- package/runtime/include/js_ops.h +107 -5
- package/runtime/include/js_promise.h +3 -3
- package/runtime/include/js_regexp.h +1 -1
- package/runtime/include/js_runtime.h +0 -0
- package/runtime/include/js_symbol.h +1 -1
- package/runtime/include/js_web.h +5 -1
- package/runtime/include/jscell.h +22 -15
- package/runtime/include/jscontext.h +82 -39
- package/runtime/include/jsnum.h +1 -1
- package/runtime/include/jsstring.h +19 -6
- package/runtime/include/jsvalue.h +7 -3
- package/runtime/src/arguments.c +2 -2
- package/runtime/src/array.c +4 -1
- package/runtime/src/arraybuffer.c +19 -7
- package/runtime/src/async_iter.c +4 -3
- package/runtime/src/atoms.c +38 -4
- package/runtime/src/base64.c +2 -2
- package/runtime/src/bigint.c +1 -1
- package/runtime/src/blob.c +22 -9
- package/runtime/src/boringssl_support.cc +1 -1
- package/runtime/src/buffer.c +299 -91
- package/runtime/src/builtin_table.c +1 -1
- package/runtime/src/builtins.c +30 -4
- package/runtime/src/builtins_util.h +0 -0
- package/runtime/src/collections.c +18 -3
- package/runtime/src/components.c +1 -1
- package/runtime/src/console.c +14 -7
- package/runtime/src/convert.c +0 -0
- package/runtime/src/core_all.c +1 -1
- package/runtime/src/crypto.c +1 -1
- package/runtime/src/crypto_asym.c +1 -1
- package/runtime/src/crypto_bn.c +1 -1
- package/runtime/src/crypto_cipher.c +10 -3
- package/runtime/src/crypto_hash.c +1 -1
- package/runtime/src/crypto_host.c +1 -1
- package/runtime/src/crypto_internal.h +1 -1
- package/runtime/src/crypto_kdf.c +1 -1
- package/runtime/src/crypto_key.c +14 -1
- package/runtime/src/crypto_pkey.c +1 -1
- package/runtime/src/crypto_subtle.c +142 -58
- package/runtime/src/crypto_tls.c +1 -1
- package/runtime/src/date.c +5 -2
- package/runtime/src/domexception.c +2 -2
- package/runtime/src/elements.c +56 -17
- package/runtime/src/elements.h +7 -2
- package/runtime/src/encoding.c +1 -1
- package/runtime/src/error.c +4 -4
- package/runtime/src/events.c +42 -14
- package/runtime/src/exception.c +1 -1
- package/runtime/src/fetch.c +241 -17
- package/runtime/src/function.c +31 -19
- package/runtime/src/gc.c +1720 -211
- package/runtime/src/gc_visit.h +87 -0
- package/runtime/src/generator.c +5 -3
- package/runtime/src/global.c +14 -6
- package/runtime/src/headers.c +10 -10
- package/runtime/src/inspect.c +76 -17
- package/runtime/src/internal.h +9 -6
- package/runtime/src/iterate.c +94 -2
- package/runtime/src/iterator.c +1 -1
- package/runtime/src/jobs.c +11 -5
- package/runtime/src/jsnum.c +2 -2
- package/runtime/src/json.c +1 -1
- package/runtime/src/math.c +9 -1
- package/runtime/src/module.c +3 -3
- package/runtime/src/number.c +0 -0
- package/runtime/src/object.c +107 -74
- package/runtime/src/ops.c +21 -3
- package/runtime/src/os.c +192 -1
- package/runtime/src/os.h +33 -2
- package/runtime/src/process.c +73 -8
- package/runtime/src/promise.c +4 -4
- package/runtime/src/proxy.c +1 -1
- package/runtime/src/reflect.c +1 -1
- package/runtime/src/regexp.c +700 -11
- package/runtime/src/regexp_anchor.h +1 -1
- package/runtime/src/regexp_message.h +1 -1
- package/runtime/src/shape.c +78 -20
- package/runtime/src/shape.h +0 -0
- package/runtime/src/streams.c +22 -8
- package/runtime/src/streams.h +0 -0
- package/runtime/src/string.c +64 -25
- package/runtime/src/string_builtins.c +7 -7
- package/runtime/src/symbol.c +2 -7
- package/runtime/src/test_host.c +3 -3
- package/runtime/src/tls_roots.gen.h +102 -620
- package/runtime/src/typedarray.c +8 -3
- package/runtime/src/tznames.gen.h +2 -1
- package/runtime/src/uri.c +1 -1
- package/runtime/src/url.c +42 -39
- package/runtime/src/weak.c +110 -36
- package/runtime/src/web.c +21 -3
- package/runtime/src/wrapper.c +0 -0
- package/runtime/src/writable.c +7 -6
- package/runtime/third_party/ada-idna/LICENSE-MIT +0 -0
- package/runtime/third_party/ada-idna/README.md +7 -7
- package/runtime/third_party/ada-idna/convert.mjs +89 -27
- package/runtime/third_party/ada-idna/idna.c +30 -31
- package/runtime/third_party/ada-idna/idna.h +0 -0
- package/runtime/third_party/ada-idna/idna_tables.h +2272 -1952
- package/runtime/third_party/boringssl/third_party/fiat/LICENSE +15 -0
- package/runtime/third_party/mozilla-ca/LICENSE +373 -0
- package/runtime/third_party/mozilla-ca/README.md +9 -0
- package/runtime/third_party/nodejs/LICENSE +47 -0
- package/runtime/third_party/nodejs/README.md +7 -0
- package/runtime/third_party/quickjs-dtoa/LICENSE +0 -0
- package/runtime/third_party/quickjs-dtoa/README.md +1 -1
- package/runtime/third_party/quickjs-dtoa/dtoa.c +0 -0
- package/runtime/third_party/quickjs-dtoa/dtoa.h +0 -0
- package/runtime/third_party/quickjs-dtoa/dtoa_compat.h +0 -0
- package/runtime/third_party/quickjs-regexp/LICENSE +0 -0
- package/runtime/third_party/quickjs-regexp/README.md +2 -2
- package/runtime/third_party/quickjs-regexp/cutils.c +0 -0
- package/runtime/third_party/quickjs-regexp/cutils.h +0 -0
- package/runtime/third_party/quickjs-regexp/libregexp-opcode.h +0 -0
- package/runtime/third_party/quickjs-regexp/libregexp.c +0 -0
- package/runtime/third_party/quickjs-regexp/libregexp.h +0 -0
- package/runtime/third_party/quickjs-regexp/libunicode-table.h +0 -0
- package/runtime/third_party/quickjs-regexp/libunicode.c +0 -0
- package/runtime/third_party/quickjs-regexp/libunicode.h +0 -0
- package/runtime/third_party/unicode/LICENSE +39 -0
- package/runtime/third_party/unicode/README.md +9 -0
- package/runtime/third_party/v8-ieee754/LICENSE +0 -0
- package/runtime/third_party/v8-ieee754/LICENSE.fdlibm +10 -0
- package/runtime/third_party/v8-ieee754/README.md +3 -2
- package/runtime/third_party/v8-ieee754/convert.py +0 -0
- package/runtime/third_party/v8-ieee754/ieee754.c +0 -0
- package/runtime/third_party/v8-ieee754/ieee754.h +0 -0
- package/runtime/tools/regexp_compile.c +2 -2
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* jscontext.h — the two runtime handles
|
|
2
|
+
* jscontext.h — the two runtime handles.
|
|
3
3
|
*
|
|
4
4
|
* JSRuntime the agent: heap and GC, atoms, pending exception, job queue
|
|
5
5
|
* JSContext a realm: global object and intrinsics. Reaches the agent via ctx->rt.
|
|
6
|
-
*
|
|
7
|
-
* Fields are added as each ADR is implemented.
|
|
8
6
|
*/
|
|
9
7
|
#ifndef JSCONTEXT_H
|
|
10
8
|
#define JSCONTEXT_H
|
|
@@ -17,7 +15,7 @@
|
|
|
17
15
|
#include "js_jobs.h"
|
|
18
16
|
|
|
19
17
|
/* Room left below the stack limit for the throw path and for runtime C code
|
|
20
|
-
* called after the last check
|
|
18
|
+
* called after the last check. Sanitizers make frames larger. */
|
|
21
19
|
#if defined(__SANITIZE_ADDRESS__)
|
|
22
20
|
#define JS_STACK_MARGIN ((uintptr_t)256 * 1024)
|
|
23
21
|
#elif defined(__has_feature)
|
|
@@ -32,8 +30,7 @@
|
|
|
32
30
|
/* Typed array element types (js_buffer.h lists them): one constructor and prototype each. */
|
|
33
31
|
#define JS_TYPED_ARRAY_TYPES 12
|
|
34
32
|
|
|
35
|
-
/* Per-realm objects the runtime needs
|
|
36
|
-
* model and built-ins land (M3); every slot is a GC root. */
|
|
33
|
+
/* Per-realm objects the runtime needs; every slot is a GC root. */
|
|
37
34
|
typedef enum JSIntrinsic {
|
|
38
35
|
JS_INTRINSIC_GLOBAL_OBJECT, /* globalThis */
|
|
39
36
|
JS_INTRINSIC_OBJECT_PROTOTYPE, /* %Object.prototype% */
|
|
@@ -70,7 +67,7 @@ typedef enum JSIntrinsic {
|
|
|
70
67
|
JS_INTRINSIC_WEAK_SET_PROTOTYPE,
|
|
71
68
|
JS_INTRINSIC_WEAK_REF_PROTOTYPE,
|
|
72
69
|
JS_INTRINSIC_FINALIZATION_REGISTRY_PROTOTYPE,
|
|
73
|
-
JS_INTRINSIC_MAP_PROTOTYPE, /* the collections component
|
|
70
|
+
JS_INTRINSIC_MAP_PROTOTYPE, /* the collections component, when installed */
|
|
74
71
|
JS_INTRINSIC_SET_PROTOTYPE,
|
|
75
72
|
JS_INTRINSIC_MAP_ITERATOR_PROTOTYPE,
|
|
76
73
|
JS_INTRINSIC_SET_ITERATOR_PROTOTYPE,
|
|
@@ -96,11 +93,11 @@ typedef enum JSIntrinsic {
|
|
|
96
93
|
JS_INTRINSIC_ERROR_STACK_SET,
|
|
97
94
|
JS_INTRINSIC_ERROR, /* %Error%: Error.captureStackTrace reads its prepareStackTrace and stackTraceLimit */
|
|
98
95
|
JS_INTRINSIC_CALL_SITE_PROTOTYPE, /* the placeholder call sites Error.prepareStackTrace receives */
|
|
99
|
-
JS_INTRINSIC_REGEXP, /* %RegExp%, when the RegExp component is installed
|
|
96
|
+
JS_INTRINSIC_REGEXP, /* %RegExp%, when the RegExp component is installed */
|
|
100
97
|
JS_INTRINSIC_REGEXP_PROTOTYPE,
|
|
101
98
|
JS_INTRINSIC_REGEXP_EXEC, /* the original RegExp.prototype.exec: RegExpExec calls it directly */
|
|
102
99
|
JS_INTRINSIC_REGEXP_STRING_ITERATOR_PROTOTYPE,
|
|
103
|
-
JS_INTRINSIC_DOM_EXCEPTION_PROTOTYPE, /* the web-standard host layer
|
|
100
|
+
JS_INTRINSIC_DOM_EXCEPTION_PROTOTYPE, /* the web-standard host layer */
|
|
104
101
|
JS_INTRINSIC_TEXT_ENCODER_PROTOTYPE,
|
|
105
102
|
JS_INTRINSIC_TEXT_DECODER_PROTOTYPE,
|
|
106
103
|
JS_INTRINSIC_URL_PROTOTYPE,
|
|
@@ -111,7 +108,7 @@ typedef enum JSIntrinsic {
|
|
|
111
108
|
JS_INTRINSIC_EVENT_TARGET_PROTOTYPE,
|
|
112
109
|
JS_INTRINSIC_ABORT_SIGNAL_PROTOTYPE,
|
|
113
110
|
JS_INTRINSIC_ABORT_CONTROLLER_PROTOTYPE,
|
|
114
|
-
JS_INTRINSIC_BUFFER, /* Node's Buffer
|
|
111
|
+
JS_INTRINSIC_BUFFER, /* Node's Buffer */
|
|
115
112
|
JS_INTRINSIC_BUFFER_PROTOTYPE,
|
|
116
113
|
JS_INTRINSIC_HEADERS_PROTOTYPE,
|
|
117
114
|
JS_INTRINSIC_HEADERS_ITERATOR_PROTOTYPE,
|
|
@@ -128,26 +125,31 @@ typedef enum JSIntrinsic {
|
|
|
128
125
|
JS_INTRINSIC_FILE_PROTOTYPE,
|
|
129
126
|
JS_INTRINSIC_REQUEST_PROTOTYPE,
|
|
130
127
|
JS_INTRINSIC_RESPONSE_PROTOTYPE, /* the original entries: new URLSearchParams(params) copies directly */
|
|
131
|
-
JS_INTRINSIC_CRYPTO, /* Web Crypto
|
|
128
|
+
JS_INTRINSIC_CRYPTO, /* Web Crypto: the crypto object */
|
|
132
129
|
JS_INTRINSIC_CRYPTO_PROTOTYPE,
|
|
133
130
|
JS_INTRINSIC_SUBTLE_CRYPTO, /* crypto.subtle */
|
|
134
131
|
JS_INTRINSIC_SUBTLE_CRYPTO_PROTOTYPE,
|
|
135
132
|
JS_INTRINSIC_CRYPTO_KEY_PROTOTYPE,
|
|
136
|
-
JS_INTRINSIC_UTIL_INSPECT, /* the util.inspect function custom inspectors receive
|
|
133
|
+
JS_INTRINSIC_UTIL_INSPECT, /* the util.inspect function custom inspectors receive */
|
|
137
134
|
JS_INTRINSIC_CONSOLE_STATE, /* console's counters and timers, by label */
|
|
138
135
|
JS_INTRINSIC_COUNT
|
|
139
136
|
} JSIntrinsic;
|
|
140
137
|
|
|
141
|
-
/* Shapes the GC processes weakly
|
|
138
|
+
/* Shapes the GC processes weakly: root shapes by (class, proto,
|
|
142
139
|
* capacity), and shapes whose transition tables point to children. */
|
|
143
140
|
typedef struct JSShapeRegistry {
|
|
144
141
|
struct JSShape **roots; /* open addressing; NULL = empty */
|
|
145
142
|
size_t root_cap, root_count;
|
|
146
143
|
struct JSShape **parents; /* shapes with transitions */
|
|
147
144
|
size_t parent_count, parent_cap;
|
|
145
|
+
/* Since the last collection: the root shapes and transitions' children made (the only shapes
|
|
146
|
+
* a young collection can find dead), and the shapes given transitions, parents[old_parents..]. */
|
|
147
|
+
struct JSShape **young;
|
|
148
|
+
size_t young_count, young_cap;
|
|
149
|
+
size_t old_parents;
|
|
148
150
|
} JSShapeRegistry;
|
|
149
151
|
|
|
150
|
-
/* Registered inline-cache arrays
|
|
152
|
+
/* Registered inline-cache arrays: reset weakly after marking. */
|
|
151
153
|
typedef struct JSPropCacheTables {
|
|
152
154
|
struct JSPropCacheTable { struct JSPropCache *ics; size_t n; } *tables;
|
|
153
155
|
size_t count, cap;
|
|
@@ -160,7 +162,7 @@ typedef enum JSCollectionPreview {
|
|
|
160
162
|
JS_PREVIEW_MAP_ENTRIES, JS_PREVIEW_SET_ENTRIES, /* the [key, value] pairs left */
|
|
161
163
|
} JSCollectionPreview;
|
|
162
164
|
|
|
163
|
-
/* An I/O backend for the event loop
|
|
165
|
+
/* An I/O backend for the event loop: libuv, set by the host code that first needs it
|
|
164
166
|
* (node:http), so that programs without I/O don't link libuv. */
|
|
165
167
|
typedef struct JSIOBackend {
|
|
166
168
|
bool (*alive)(JSRuntime *rt); /* open handles (servers, sockets) keep the program running */
|
|
@@ -174,16 +176,21 @@ struct JSRuntime {
|
|
|
174
176
|
JSShapeRegistry shapes;
|
|
175
177
|
JSPropCacheTables prop_caches;
|
|
176
178
|
/* the shared second-level caches (object.c): get and set entries by (shape, key), for the
|
|
177
|
-
* sites a monomorphic cache misses and C code's lookups
|
|
178
|
-
|
|
179
|
+
* sites a monomorphic cache misses and C code's lookups, and the shape that defining a new
|
|
180
|
+
* key gives (object literals); emptied at every collection */
|
|
181
|
+
struct JSMegaEntry *mega_get, *mega_set, *mega_define;
|
|
182
|
+
/* Bumped when an object that is some shape's prototype changes shape (js_object_set_shape):
|
|
183
|
+
* caches that saw a prototype chain (ADD, PROTO) and remember the epoch it had are good
|
|
184
|
+
* while it's the same, without walking the chain again (optimizer step 11). */
|
|
185
|
+
uint32_t proto_epoch;
|
|
179
186
|
JSContext *realms; /* every live JSContext, linked through next_realm */
|
|
180
|
-
JSAtomTable atoms; /* weak
|
|
181
|
-
JSValue exception; /* pending exception, JS_EMPTY if none; a GC root
|
|
187
|
+
JSAtomTable atoms; /* weak */
|
|
188
|
+
JSValue exception; /* pending exception, JS_EMPTY if none; a GC root */
|
|
182
189
|
JSValue symbol_registry; /* Symbol.for's GlobalSymbolRegistry: key -> symbol (a root) */
|
|
183
190
|
uintptr_t stack_limit; /* lowest usable stack address, margin included */
|
|
184
|
-
JSJobQueue jobs; /* microtasks
|
|
185
|
-
JSTimers timers; /* setTimeout / setInterval
|
|
186
|
-
/* The async context
|
|
191
|
+
JSJobQueue jobs; /* microtasks */
|
|
192
|
+
JSTimers timers; /* setTimeout / setInterval */
|
|
193
|
+
/* The async context: an opaque value the host keeps per chain of async work
|
|
187
194
|
* (node:async_hooks' AsyncLocalStorage keeps its stores in it). Every job, timer and promise
|
|
188
195
|
* reaction takes the one current when it was queued, and runs under it. Undefined: none. A root. */
|
|
189
196
|
JSValue async_context;
|
|
@@ -198,13 +205,16 @@ struct JSRuntime {
|
|
|
198
205
|
int (*on_uncaught)(JSContext *ctx, JSValue error, JSValue promise);
|
|
199
206
|
int (*on_handled_late)(JSContext *ctx, JSValue promise);
|
|
200
207
|
uint8_t failure; /* the exit status after an uncaught error: 1, or on_uncaught's */
|
|
201
|
-
struct JSWeakList { struct JSObject **items; size_t count, cap; } weak; /* WeakMap/Set/Ref, registries
|
|
208
|
+
struct JSWeakList { struct JSObject **items; size_t count, cap; } weak; /* WeakMap/Set/Ref, registries */
|
|
209
|
+
/* WeakMap and WeakSet entries set since the last collection, by key (EMPTY: every entry of the
|
|
210
|
+
* table): the only ones a young collection looks at (weak.c). */
|
|
211
|
+
struct JSWeakWrites { struct JSWeakWrite { struct JSObject *table; JSValue key; } *items; size_t count, cap; } weak_writes;
|
|
202
212
|
struct JSKeptAlive { JSValue *items; size_t count, cap; } kept_alive; /* [[KeptAlive]]: roots until ClearKeptObjects */
|
|
203
|
-
const struct JSComponent *const *components; /* installed in every realm
|
|
213
|
+
const struct JSComponent *const *components; /* installed in every realm */
|
|
204
214
|
size_t ncomponents;
|
|
205
215
|
const struct JSCoreEntry *core; /* the core methods every realm installs (js_core.def) */
|
|
206
216
|
size_t ncore;
|
|
207
|
-
/* Set by the collections component (
|
|
217
|
+
/* Set by the collections component (core reaches optional components through
|
|
208
218
|
* hooks): a Map's or Set's entries, or what an iterator has left, as an array (flat
|
|
209
219
|
* [k1, v1, k2, v2, …] for a Map and the entries iterators); EMPTY for other values. */
|
|
210
220
|
JSValue (*collection_preview)(JSContext *ctx, JSValue v, JSCollectionPreview *what);
|
|
@@ -213,9 +223,12 @@ struct JSRuntime {
|
|
|
213
223
|
JSValue (*date_inspect)(JSContext *ctx, JSValue v);
|
|
214
224
|
/* Set by RegExp: a RegExp's "/source/flags" for util.inspect; EMPTY otherwise. */
|
|
215
225
|
JSValue (*regexp_inspect)(JSContext *ctx, JSValue v);
|
|
216
|
-
const JSBigIntOps *bigint; /* set by the bigint component
|
|
226
|
+
const JSBigIntOps *bigint; /* set by the bigint component */
|
|
217
227
|
/* A typed array's length now: -1 when out of bounds (detached), -2 for anything else. */
|
|
218
228
|
double (*typed_array_length)(JSValue v);
|
|
229
|
+
/* Set by typed arrays: a typed array's or DataView's bytes (its current window), true; false
|
|
230
|
+
* for anything else (an ArrayBuffer too: process.stdout.write takes views only). */
|
|
231
|
+
bool (*view_bytes)(JSValue v, uint8_t **data, size_t *length);
|
|
219
232
|
const JSIOBackend *io; /* the event loop's I/O, once a program uses some */
|
|
220
233
|
uint8_t rejection_mode; /* JSRejectionMode */
|
|
221
234
|
uint8_t in_checkpoint; /* js_run_microtasks is running */
|
|
@@ -224,6 +237,7 @@ struct JSRuntime {
|
|
|
224
237
|
struct JSContext {
|
|
225
238
|
JSRuntime *rt;
|
|
226
239
|
uintptr_t stack_limit; /* copy of rt->stack_limit: one load in every function prologue */
|
|
240
|
+
uint8_t barrier_threshold; /* js_store's slow path runs for an owner whose GC byte is this or more */
|
|
227
241
|
JSValue intrinsics[JS_INTRINSIC_COUNT];
|
|
228
242
|
JSContext *next_realm;
|
|
229
243
|
};
|
|
@@ -232,23 +246,52 @@ JSRuntime *js_runtime_new(void);
|
|
|
232
246
|
void js_runtime_free(JSRuntime *rt); /* frees every cell, running finalizers */
|
|
233
247
|
JSContext *js_context_new(JSRuntime *rt); /* a new realm; js_runtime_free frees any left */
|
|
234
248
|
void js_context_free(JSContext *ctx);
|
|
235
|
-
/* The test262 host
|
|
249
|
+
/* The test262 host: defines $262 on ctx's global object and returns it. */
|
|
236
250
|
JSValue js_test_host_init(JSContext *ctx);
|
|
237
251
|
|
|
238
|
-
/*
|
|
239
|
-
*
|
|
240
|
-
|
|
252
|
+
/* Every store of a JSValue into a cell that may already be reachable: the write barrier.
|
|
253
|
+
* One compare when the owner is young or already remembered. */
|
|
254
|
+
static inline void js_store(JSContext *ctx, JSCell *owner, JSValue *slot, JSValue v) {
|
|
255
|
+
assert(!js_is_exception(v) && "JS_EXCEPTION stored into a cell");
|
|
256
|
+
*slot = v;
|
|
257
|
+
if (JS_UNLIKELY(owner->gc >= ctx->barrier_threshold) && js_is_cell(v)) js_write_barrier_slow(ctx, owner, slot, js_as_cell(v));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* The barrier alone, after storing `v` at `slot` (NULL: in malloc'd memory) where js_store can't
|
|
261
|
+
* write: a malloc'd table's entry, a struct holding several values. */
|
|
262
|
+
static inline void js_write_barrier(JSContext *ctx, JSCell *owner, const void *slot, JSValue v) {
|
|
263
|
+
if (JS_UNLIKELY(owner->gc >= ctx->barrier_threshold) && js_is_cell(v)) js_write_barrier_slow(ctx, owner, slot, js_as_cell(v));
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* The barrier for a store of a cell pointer (a JSShape *, a JSEnv *, ...) into `owner`, after the
|
|
267
|
+
* store: js_store_ptr does both. */
|
|
268
|
+
static inline void js_write_barrier_cell(JSContext *ctx, JSCell *owner, const void *slot, const JSCell *c) {
|
|
269
|
+
if (JS_UNLIKELY(owner->gc >= ctx->barrier_threshold) && c) js_write_barrier_slow(ctx, owner, slot, c);
|
|
270
|
+
}
|
|
271
|
+
#define js_store_ptr(ctx, owner, slot, p) \
|
|
272
|
+
do { *(slot) = (p); js_write_barrier_cell((ctx), (owner), (slot), (const JSCell *)(p)); } while (0)
|
|
273
|
+
|
|
274
|
+
/* Copies `n` values into `owner` (memmove: the ranges may overlap), then remembers the owner if
|
|
275
|
+
* it's old: one barrier for a bulk copy. */
|
|
276
|
+
static inline void js_store_range(JSContext *ctx, JSCell *owner, JSValue *dst, const JSValue *src, size_t n) {
|
|
277
|
+
memmove(dst, src, n * sizeof *dst);
|
|
278
|
+
if (JS_UNLIKELY(owner->gc >= ctx->barrier_threshold) && n) js_remember(ctx, owner, dst, n * sizeof *dst);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/* Allocation fast path: the lowest free cell of the class's window.
|
|
282
|
+
* Its cells are zeroed, and zeroed memory reads as JS_EMPTY, so a half-initialized cell is always
|
|
283
|
+
* safe to trace. Checking builds (JS_GC_VERIFY, implied by JS_GC_STRESS) always take the slow
|
|
284
|
+
* path, which checks the dead cell and, under stress, collects first. */
|
|
241
285
|
static inline void *js_alloc_small(JSContext *ctx, unsigned size_class) {
|
|
242
|
-
#
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
286
|
+
#ifndef JS_GC_VERIFY
|
|
287
|
+
JSAllocator *a = &ctx->rt->heap.alloc[size_class];
|
|
288
|
+
uint64_t free = a->free;
|
|
289
|
+
if (JS_LIKELY(free)) {
|
|
290
|
+
a->free = free & (free - 1);
|
|
291
|
+
return (void *)(a->base + js_ctz64(free) * a->cell_size);
|
|
292
|
+
}
|
|
249
293
|
#endif
|
|
250
|
-
|
|
251
|
-
return c;
|
|
294
|
+
return js_alloc_slow(ctx, size_class);
|
|
252
295
|
}
|
|
253
296
|
|
|
254
297
|
#endif /* JSCONTEXT_H */
|
package/runtime/include/jsnum.h
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* jsstring.h — strings
|
|
2
|
+
* jsstring.h — strings.
|
|
3
3
|
*
|
|
4
4
|
* A string is a sequence of UTF-16 code units. Cells are flat (characters
|
|
5
5
|
* inline, Latin-1 when every unit is <= 0xFF, else UTF-16), ropes (lazy
|
|
6
6
|
* concatenations, flattened on first read) or slices (long substrings, which
|
|
7
|
-
* share their parent's characters).
|
|
8
|
-
*
|
|
7
|
+
* share their parent's characters). Strings built by appending in a loop are
|
|
8
|
+
* slices of a buffer: a flat cell with room to grow (below). Everything that
|
|
9
|
+
* reads characters goes through a JSStrView.
|
|
9
10
|
*/
|
|
10
11
|
#ifndef JSSTRING_H
|
|
11
12
|
#define JSSTRING_H
|
|
@@ -23,12 +24,21 @@ typedef struct JSContext JSContext;
|
|
|
23
24
|
#define JS_STR_LATIN1 0x01u /* flat: 1 byte per unit; rope: both sides are Latin-1; slice: the parent is */
|
|
24
25
|
#define JS_STR_ATOM 0x02u /* the unique interned copy of its content */
|
|
25
26
|
#define JS_STR_PRIVATE 0x04u /* a private name (#x): a property key no key listing shows */
|
|
27
|
+
#define JS_STR_BUFFER 0x08u /* flat: an append buffer, only ever a slice's parent (below) */
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
/* V8's String::kMaxLength on 64-bit, which Node's buffer.constants.MAX_STRING_LENGTH reports */
|
|
30
|
+
#define JS_STRING_MAX_LENGTH ((UINT32_C(1) << 29) - 24)
|
|
28
31
|
#define JS_ROPE_MIN 13 /* shorter concatenations copy instead */
|
|
29
32
|
#define JS_ROPE_MAX_DEPTH 1024 /* deeper concatenations flatten eagerly */
|
|
30
33
|
#define JS_SLICE_MIN 13 /* shorter substrings copy instead */
|
|
31
34
|
#define JS_SLICE_MAX_WASTE 4 /* a slice is at least 1/4 of its parent; smaller ones copy */
|
|
35
|
+
#define JS_BUFFER_MIN_DEPTH 16 /* appending to a rope this deep continues in a buffer */
|
|
36
|
+
|
|
37
|
+
/* An append buffer is a STR_FLAT with JS_STR_BUFFER: `length` units are filled
|
|
38
|
+
* and never change again, `cell.aux` is its capacity. JS code never sees one,
|
|
39
|
+
* only slices of it at offset 0. Appending to the slice that ends at the fill
|
|
40
|
+
* mark (the newest string built in it) writes past the mark and returns a
|
|
41
|
+
* longer slice; any older one is a shorter prefix and stays valid. */
|
|
32
42
|
|
|
33
43
|
typedef struct JSString { /* kind = STR_FLAT */
|
|
34
44
|
JSCell cell; /* flags: STR_LATIN1, STR_ATOM, CELL_STATIC */
|
|
@@ -126,7 +136,10 @@ uint32_t js_string_hash(JSContext *ctx, JSValue s); /* cached in the cell (not
|
|
|
126
136
|
|
|
127
137
|
/* "" and every single code unit 0…255: static atoms, never allocated. */
|
|
128
138
|
JSValue js_empty_string(void);
|
|
129
|
-
|
|
139
|
+
typedef JS_STATIC_LATIN1_TYPE(1) JSStaticChar;
|
|
140
|
+
extern const JSStaticChar js_char_strings[256];
|
|
141
|
+
/* Inline: generated code names one-character keys (`o.x`) with it at every access. */
|
|
142
|
+
static inline JSValue js_char_string(uint8_t unit) { return js_cell((JSCell *)&js_char_strings[unit]); }
|
|
130
143
|
|
|
131
144
|
/* ---- Creating strings -------------------------------------------------- */
|
|
132
145
|
|
|
@@ -149,7 +162,7 @@ bool js_string_equals(JSContext *ctx, JSValue a, JSValue b);
|
|
|
149
162
|
/* <0, 0, >0 by code units (the relational operators on strings). */
|
|
150
163
|
int js_string_compare(JSContext *ctx, JSValue a, JSValue b);
|
|
151
164
|
|
|
152
|
-
/* Number::toString(n) as a string cell
|
|
165
|
+
/* Number::toString(n) as a string cell. `n` is an int32 or a double. */
|
|
153
166
|
JSValue js_number_to_string(JSContext *ctx, JSValue n);
|
|
154
167
|
|
|
155
168
|
/* ---- Output ------------------------------------------------------------ */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* jsvalue.h — JS value representation
|
|
2
|
+
* jsvalue.h — JS value representation.
|
|
3
3
|
*
|
|
4
4
|
* NaN-boxing with raw pointers (JavaScriptCore layout):
|
|
5
5
|
*
|
|
@@ -21,12 +21,16 @@
|
|
|
21
21
|
#if defined(__GNUC__) || defined(__clang__)
|
|
22
22
|
#define JS_LIKELY(x) __builtin_expect(!!(x), 1)
|
|
23
23
|
#define JS_UNLIKELY(x) __builtin_expect(!!(x), 0)
|
|
24
|
+
/* An inline cache's hit, at every site of a big function too (the compiler's size limits would
|
|
25
|
+
* otherwise leave a call there): only fast paths of a few instructions. */
|
|
26
|
+
#define JS_FAST_PATH inline __attribute__((always_inline))
|
|
24
27
|
#else
|
|
25
28
|
#define JS_LIKELY(x) (x)
|
|
26
29
|
#define JS_UNLIKELY(x) (x)
|
|
30
|
+
#define JS_FAST_PATH inline
|
|
27
31
|
#endif
|
|
28
32
|
|
|
29
|
-
/* On every runtime function that can fail
|
|
33
|
+
/* On every runtime function that can fail: ignoring its result is an error. */
|
|
30
34
|
#if defined(__GNUC__) || defined(__clang__)
|
|
31
35
|
#define JS_WARN_UNUSED __attribute__((warn_unused_result))
|
|
32
36
|
#elif defined(_MSC_VER)
|
|
@@ -59,7 +63,7 @@ typedef struct { uint64_t bits; } JSValue;
|
|
|
59
63
|
#define JS_TAG_FALSE UINT64_C(0x06)
|
|
60
64
|
#define JS_TAG_TRUE UINT64_C(0x07)
|
|
61
65
|
#define JS_TAG_UNDEFINED UINT64_C(0x0A)
|
|
62
|
-
#define JS_TAG_EXCEPTION UINT64_C(0x0E) /* internal: "an exception is pending"
|
|
66
|
+
#define JS_TAG_EXCEPTION UINT64_C(0x0E) /* internal: "an exception is pending" */
|
|
63
67
|
|
|
64
68
|
#define JS_EMPTY ((JSValue){ JS_TAG_EMPTY })
|
|
65
69
|
#define JS_NULL ((JSValue){ JS_TAG_NULL })
|
package/runtime/src/arguments.c
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* Arguments objects (ECMAScript §10.4.4
|
|
1
|
+
/* Arguments objects (ECMAScript §10.4.4).
|
|
2
2
|
*
|
|
3
3
|
* Unmapped (strict code, or a non-simple parameter list): an ordinary object of
|
|
4
4
|
* the Arguments class holding the argument values, `length`, and a `callee` that
|
|
@@ -94,7 +94,7 @@ JSValue js_new_arguments(JSContext *ctx, JSValue args, JSValue callee, JSValue e
|
|
|
94
94
|
js_define_data(ctx, o, JS_SYMBOL(iterator), ctx->intrinsics[JS_INTRINSIC_ARRAY_VALUES], JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
|
|
95
95
|
if (slots) {
|
|
96
96
|
/* mapped: only the parameters actually passed alias (§10.4.4.7 step 15), and at most 64 */
|
|
97
|
-
a->env
|
|
97
|
+
js_store_ptr(ctx, &a->obj.cell, &a->env, js_as_env(env));
|
|
98
98
|
a->slots = slots;
|
|
99
99
|
for (uint32_t i = 0; i < nmapped && i < argc && i < 64; i++)
|
|
100
100
|
if (slots[i] != UINT32_MAX) a->mapped |= (uint64_t)1 << i; /* duplicate names: only the last maps */
|
package/runtime/src/array.c
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* Array and Array.prototype (§23.1): core built-ins
|
|
1
|
+
/* Array and Array.prototype (§23.1): core built-ins. The methods are generic, as
|
|
2
2
|
* the spec makes them: they work on any array-like through Get/Set/HasProperty/Delete, so
|
|
3
3
|
* holes, getters and proxies-to-come behave as in V8. Methods that create arrays honour
|
|
4
4
|
* Symbol.species (ArraySpeciesCreate). */
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
#include <stdlib.h>
|
|
9
9
|
#include <string.h>
|
|
10
10
|
|
|
11
|
+
#include "elements.h"
|
|
11
12
|
#include "internal.h"
|
|
12
13
|
#include "js_atoms.h"
|
|
13
14
|
#include "js_convert.h"
|
|
@@ -502,6 +503,8 @@ CORE(array_proto_fill) {
|
|
|
502
503
|
double len, k, final;
|
|
503
504
|
if (receiver(ctx, this_val, "Array.prototype.fill", &len) < 0) return JS_EXCEPTION;
|
|
504
505
|
if (js_relative_index(ctx, ARG(1), len, 0, &k) < 0 || js_relative_index(ctx, ARG(2), len, len, &final) < 0) return JS_EXCEPTION;
|
|
506
|
+
/* an array's length is below 2^32: k and final are uint32s */
|
|
507
|
+
if (js_is_array(this_val) && k < final && js_elements_fill(ctx, js_as_object(this_val), (uint32_t)k, (uint32_t)final, ARG(0))) return this_val;
|
|
505
508
|
for (; k < final; k++)
|
|
506
509
|
if (set_index(ctx, this_val, k, ARG(0)) < 0) return JS_EXCEPTION;
|
|
507
510
|
return this_val;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
/* ArrayBuffer and DataView (ECMAScript §25.1, §25.3), the arraybuffer component
|
|
1
|
+
/* ArrayBuffer and DataView (ECMAScript §25.1, §25.3), the arraybuffer component:
|
|
2
2
|
* resizable buffers, transfer, and the immutable-ArrayBuffer proposal; DataView with Float16.
|
|
3
|
-
* The BigInt64 accessors exist when the bigint component does
|
|
3
|
+
* The BigInt64 accessors exist when the bigint component does.
|
|
4
4
|
*
|
|
5
|
-
* A buffer's bytes are malloc'd and freed by its finalizer
|
|
6
|
-
*
|
|
5
|
+
* A buffer's bytes are malloc'd and freed by its finalizer, and counted as the heap's external
|
|
6
|
+
* memory: byte_length of them while it has any. A detached buffer has no
|
|
7
|
+
* bytes and length 0. Views read the buffer's current data pointer and length on every access, since a
|
|
7
8
|
* resize or a transfer may move or drop the bytes. */
|
|
8
9
|
#include <math.h>
|
|
9
10
|
#include <stdio.h>
|
|
@@ -27,8 +28,9 @@
|
|
|
27
28
|
/* ---- ArrayBuffer objects --------------------------------------------------------------------- */
|
|
28
29
|
|
|
29
30
|
static void buffer_finalize(JSRuntime *rt, JSCell *c) {
|
|
30
|
-
(
|
|
31
|
-
|
|
31
|
+
JSArrayBuffer *b = (JSArrayBuffer *)c;
|
|
32
|
+
if (b->data) js_gc_external_sub(rt, b->byte_length);
|
|
33
|
+
free(b->data);
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
static const JSClass array_buffer_class = { "ArrayBuffer", sizeof(JSArrayBuffer), NULL, NULL, NULL, NULL, NULL, buffer_finalize, NULL };
|
|
@@ -64,6 +66,12 @@ static int alloc_bytes(JSContext *ctx, double length, uint8_t **out) {
|
|
|
64
66
|
return 0;
|
|
65
67
|
}
|
|
66
68
|
|
|
69
|
+
/* A buffer's bytes went from `from` to `to` (0: none). */
|
|
70
|
+
static void resize_external(JSContext *ctx, size_t from, size_t to) {
|
|
71
|
+
if (to > from) js_gc_external_add(ctx->rt, to - from);
|
|
72
|
+
else js_gc_external_sub(ctx->rt, from - to);
|
|
73
|
+
}
|
|
74
|
+
|
|
67
75
|
/* AllocateArrayBuffer (§25.1.3.1): the prototype first, then the bytes. max < 0: not resizable. */
|
|
68
76
|
static JSValue allocate(JSContext *ctx, JSValue new_target, double length, double max) {
|
|
69
77
|
if (max >= 0 && length > max) return js_throw_range_error(ctx, "Invalid array buffer max length");
|
|
@@ -75,6 +83,7 @@ static JSValue allocate(JSContext *ctx, JSValue new_target, double length, doubl
|
|
|
75
83
|
JSArrayBuffer *b = (JSArrayBuffer *)js_alloc_object(ctx, JS_CELL_OBJECT, js_shape_root(ctx, &array_buffer_class, proto, 0));
|
|
76
84
|
b->data = data;
|
|
77
85
|
b->byte_length = (size_t)length;
|
|
86
|
+
if (data) js_gc_external_add(ctx->rt, b->byte_length);
|
|
78
87
|
b->max_byte_length = max >= 0 ? (size_t)max : (size_t)length;
|
|
79
88
|
b->flags = max >= 0 ? JS_BUFFER_RESIZABLE : 0;
|
|
80
89
|
return js_object_value(&b->obj);
|
|
@@ -90,6 +99,7 @@ int js_array_buffer_detach(JSContext *ctx, JSValue buffer) {
|
|
|
90
99
|
js_discard(js_throw_type_error(ctx, "Cannot detach an immutable ArrayBuffer"));
|
|
91
100
|
return -1;
|
|
92
101
|
}
|
|
102
|
+
if (b->data) js_gc_external_sub(ctx->rt, b->byte_length);
|
|
93
103
|
free(b->data);
|
|
94
104
|
b->data = NULL;
|
|
95
105
|
b->byte_length = 0;
|
|
@@ -198,6 +208,7 @@ BUILTIN(array_buffer_resize) {
|
|
|
198
208
|
if (n > b->byte_length) memset(data + b->byte_length, 0, n - b->byte_length);
|
|
199
209
|
b->data = data;
|
|
200
210
|
}
|
|
211
|
+
resize_external(ctx, b->byte_length, n);
|
|
201
212
|
b->byte_length = n;
|
|
202
213
|
return JS_UNDEFINED;
|
|
203
214
|
}
|
|
@@ -295,6 +306,7 @@ static JSValue copy_and_detach(JSContext *ctx, JSValue this_val, JSValue new_len
|
|
|
295
306
|
if (!data) return js_throw_range_error(ctx, "Array buffer allocation failed");
|
|
296
307
|
if (n > b->byte_length) memset(data + b->byte_length, 0, n - b->byte_length);
|
|
297
308
|
}
|
|
309
|
+
resize_external(ctx, b->byte_length, n); /* counted for nb from here on */
|
|
298
310
|
b->data = NULL; /* allocate() may collect: b must not free them */
|
|
299
311
|
JSValue r = allocate(ctx, JS_UNDEFINED, 0, max);
|
|
300
312
|
JSArrayBuffer *nb = js_as_array_buffer(r);
|
|
@@ -575,7 +587,7 @@ static const JSBuiltin data_view_proto[] = {
|
|
|
575
587
|
JS_BUILTIN_SYMBOL_STRING(toStringTag, "DataView", JS_PROP_CONFIGURABLE),
|
|
576
588
|
};
|
|
577
589
|
|
|
578
|
-
/* with BigInt
|
|
590
|
+
/* with BigInt: the bigint component is installed first when the program reaches it */
|
|
579
591
|
static const JSBuiltin data_view_bigint_proto[] = {
|
|
580
592
|
JS_BUILTIN_FN("getBigInt64", data_view_get_BigInt64, 1),
|
|
581
593
|
JS_BUILTIN_FN("setBigInt64", data_view_set_BigInt64, 2),
|
package/runtime/src/async_iter.c
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* Async generators (ECMAScript §27.6) and async iteration (§27.1.4–6): the request queue
|
|
2
2
|
* and its driver, %AsyncIteratorPrototype%, the async-from-sync iterator, for await, and
|
|
3
|
-
* yield* in async generators (§15.5.5).
|
|
3
|
+
* yield* in async generators (§15.5.5). */
|
|
4
4
|
#include "internal.h"
|
|
5
5
|
#include "js_atoms.h"
|
|
6
6
|
#include "js_builtins.h"
|
|
@@ -55,7 +55,7 @@ static void request_visit(JSCell *c, JSTracer *trc) {
|
|
|
55
55
|
js_trace_value(trc, r->promise);
|
|
56
56
|
js_trace_value(trc, r->next);
|
|
57
57
|
}
|
|
58
|
-
static const JSCellClass request_class = { "AsyncGeneratorRequest", request_visit, NULL };
|
|
58
|
+
static const JSCellClass request_class = { "AsyncGeneratorRequest", request_visit, NULL, NULL };
|
|
59
59
|
|
|
60
60
|
static const JSClass async_generator_class = { "AsyncGenerator", sizeof(JSGenerator), NULL, NULL, NULL, NULL, js_generator_visit, NULL, NULL };
|
|
61
61
|
|
|
@@ -324,7 +324,7 @@ static void async_iter_visit(JSCell *c, JSTracer *trc) {
|
|
|
324
324
|
js_trace_value(trc, ((AsyncIter *)c)->iterator);
|
|
325
325
|
js_trace_value(trc, ((AsyncIter *)c)->next);
|
|
326
326
|
}
|
|
327
|
-
static const JSCellClass async_iter_class = { "AsyncIteratorRecord", async_iter_visit, NULL };
|
|
327
|
+
static const JSCellClass async_iter_class = { "AsyncIteratorRecord", async_iter_visit, NULL, NULL };
|
|
328
328
|
|
|
329
329
|
static AsyncIter *rec_of(JSValue rec) { return (AsyncIter *)js_as_cell(rec); }
|
|
330
330
|
|
|
@@ -473,6 +473,7 @@ static void install_async_iterator(JSContext *ctx, JSObject *global) {
|
|
|
473
473
|
JSObject *agp = js_as_object(in[JS_INTRINSIC_ASYNC_GENERATOR_PROTOTYPE]);
|
|
474
474
|
js_define_data(ctx, agfp, JS_ATOM(prototype), in[JS_INTRINSIC_ASYNC_GENERATOR_PROTOTYPE], JS_PROP_CONFIGURABLE);
|
|
475
475
|
js_define_data(ctx, agfp, JS_SYMBOL(toStringTag), js_atom_from_cstr(ctx, "AsyncGeneratorFunction"), JS_PROP_CONFIGURABLE);
|
|
476
|
+
js_define_function_kind_ctor(ctx, in[JS_INTRINSIC_ASYNC_GENERATOR_FUNCTION_PROTOTYPE], 2);
|
|
476
477
|
js_define_data(ctx, agp, JS_ATOM(constructor), in[JS_INTRINSIC_ASYNC_GENERATOR_FUNCTION_PROTOTYPE], JS_PROP_CONFIGURABLE);
|
|
477
478
|
(void)js_define_method(ctx, agp, "next", async_generator_next, 1);
|
|
478
479
|
(void)js_define_method(ctx, agp, "return", async_generator_return, 1);
|
package/runtime/src/atoms.c
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* Atoms: interned strings, held weakly
|
|
1
|
+
/* Atoms: interned strings, held weakly. */
|
|
2
2
|
#include "js_atoms.h"
|
|
3
3
|
|
|
4
4
|
#include <stdlib.h>
|
|
@@ -63,6 +63,24 @@ static void insert(JSAtomTable *t, JSString *s, uint32_t hash) {
|
|
|
63
63
|
t->count++;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
/* Removes `s`, which is in the table. Linear probing: later entries of its probe run move back
|
|
67
|
+
* into the hole, so that every lookup still finds them. */
|
|
68
|
+
static void remove_atom(JSAtomTable *t, const JSString *s) {
|
|
69
|
+
size_t mask = t->cap - 1, i = s->hash & mask;
|
|
70
|
+
while (t->entries[i].str != s) i = (i + 1) & mask;
|
|
71
|
+
t->entries[i].str = NULL;
|
|
72
|
+
t->count--;
|
|
73
|
+
for (size_t j = (i + 1) & mask; t->entries[j].str; j = (j + 1) & mask) {
|
|
74
|
+
size_t home = t->entries[j].hash & mask;
|
|
75
|
+
bool stays = i <= j ? (i < home && home <= j) : (i < home || home <= j);
|
|
76
|
+
if (!stays) {
|
|
77
|
+
t->entries[i] = t->entries[j]; /* barrier: none, the table is malloc'd and weak */
|
|
78
|
+
t->entries[j].str = NULL;
|
|
79
|
+
i = j;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
66
84
|
/* ---- Lifecycle --------------------------------------------------------- */
|
|
67
85
|
|
|
68
86
|
void js_register_static_atoms(JSRuntime *rt, const JSString *const *cells, size_t n) {
|
|
@@ -96,10 +114,18 @@ void js_atoms_init(JSRuntime *rt) {
|
|
|
96
114
|
|
|
97
115
|
static bool survives(const JSString *s) { return js_gc_is_marked(&s->cell); }
|
|
98
116
|
|
|
99
|
-
/* Drops unmarked atoms
|
|
100
|
-
*
|
|
101
|
-
|
|
117
|
+
/* Drops unmarked atoms. A young collection checks only the atoms added since the last one, and
|
|
118
|
+
* removes the dead ones in place. A full collection checks every atom, and resizes for the
|
|
119
|
+
* survivors: load <= 1/2, shrinking after mass death (dynamic keys), never below 512 entries. */
|
|
120
|
+
void js_atoms_sweep(JSRuntime *rt, bool full) {
|
|
102
121
|
JSAtomTable *t = &rt->atoms;
|
|
122
|
+
if (!full) {
|
|
123
|
+
for (size_t i = 0; i < t->young_count; i++)
|
|
124
|
+
if (!survives(t->young[i])) remove_atom(t, t->young[i]);
|
|
125
|
+
t->young_count = 0;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
t->young_count = 0;
|
|
103
129
|
size_t live = 0;
|
|
104
130
|
for (size_t i = 0; i < t->cap; i++) live += t->entries[i].str && survives(t->entries[i].str);
|
|
105
131
|
size_t cap = 512;
|
|
@@ -110,6 +136,8 @@ void js_atoms_sweep(JSRuntime *rt) {
|
|
|
110
136
|
void js_atoms_free(JSRuntime *rt) {
|
|
111
137
|
free(rt->atoms.entries);
|
|
112
138
|
rt->atoms.entries = NULL;
|
|
139
|
+
free(rt->atoms.young);
|
|
140
|
+
rt->atoms.young = NULL;
|
|
113
141
|
}
|
|
114
142
|
|
|
115
143
|
size_t js_atom_count(const JSRuntime *rt) {
|
|
@@ -137,6 +165,12 @@ JSValue js_atomize(JSContext *ctx, JSValue s) {
|
|
|
137
165
|
flat->cell.flags |= JS_STR_ATOM; /* immutable content: becoming the atom changes nothing else */
|
|
138
166
|
flat->hash = hash;
|
|
139
167
|
insert(t, flat, hash);
|
|
168
|
+
if (t->young_count == t->young_cap) {
|
|
169
|
+
t->young_cap = t->young_cap ? t->young_cap * 2 : 256;
|
|
170
|
+
t->young = realloc(t->young, t->young_cap * sizeof *t->young);
|
|
171
|
+
if (!t->young) js_fatal("out of memory growing the atom table");
|
|
172
|
+
}
|
|
173
|
+
t->young[t->young_count++] = flat;
|
|
140
174
|
return js_cell(&flat->cell);
|
|
141
175
|
}
|
|
142
176
|
|
package/runtime/src/base64.c
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/* atob and btoa (HTML §8.3, forgiving-base64 in Infra §4.7), the base64 component
|
|
2
|
-
*
|
|
1
|
+
/* atob and btoa (HTML §8.3, forgiving-base64 in Infra §4.7), the base64 component,
|
|
2
|
+
* which needs domexception: Node's checks, in Node's order, and its DOMExceptions. */
|
|
3
3
|
#include <stdlib.h>
|
|
4
4
|
|
|
5
5
|
#include "builtins_util.h"
|
package/runtime/src/bigint.c
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* BigInt (ECMAScript §6.1.6.2, §21.2), the bigint component
|
|
1
|
+
/* BigInt (ECMAScript §6.1.6.2, §21.2), the bigint component.
|
|
2
2
|
*
|
|
3
3
|
* The arithmetic is ported from QuickJS (https://github.com/bellard/quickjs, upstream commit
|
|
4
4
|
* a38171d37357edff256c28a73eaeb41d2466d1d5, the one runtime/third_party/quickjs-dtoa comes from):
|