@scriptc/runtime 0.0.0 → 0.0.1
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 +202 -0
- package/package.json +16 -6
- package/src/scr_array.c +488 -0
- package/src/scr_assert.c +1393 -0
- package/src/scr_async.c +2593 -0
- package/src/scr_async_dyn.c +607 -0
- package/src/scr_bytes.c +1425 -0
- package/src/scr_bytes_io.c +161 -0
- package/src/scr_child.c +3587 -0
- package/src/scr_closure.c +214 -0
- package/src/scr_console.c +143 -0
- package/src/scr_cycle.c +218 -0
- package/src/scr_dc.c +805 -0
- package/src/scr_dgram.c +1007 -0
- package/src/scr_dyn_handle.c +154 -0
- package/src/scr_dyn_invoke.c +644 -0
- package/src/scr_error.c +332 -0
- package/src/scr_events.c +714 -0
- package/src/scr_events_emitter.c +699 -0
- package/src/scr_exception.c +242 -0
- package/src/scr_fetch.c +1130 -0
- package/src/scr_fetch_curl.c +654 -0
- package/src/scr_http.c +3482 -0
- package/src/scr_http2.c +3030 -0
- package/src/scr_inspect.c +803 -0
- package/src/scr_inspect_island.c +51 -0
- package/src/scr_island.c +9363 -0
- package/src/scr_json.c +2151 -0
- package/src/scr_lib.c +3612 -0
- package/src/scr_loop_epoll.c +241 -0
- package/src/scr_loop_kqueue.c +121 -0
- package/src/scr_loop_wsapoll.c +208 -0
- package/src/scr_map.c +591 -0
- package/src/scr_net.c +3017 -0
- package/src/scr_net_island.c +458 -0
- package/src/scr_number.c +115 -0
- package/src/scr_object.c +25 -0
- package/src/scr_path.c +1266 -0
- package/src/scr_platform.h +119 -0
- package/src/scr_readline.c +287 -0
- package/src/scr_regex.c +1080 -0
- package/src/scr_runtime.h +5036 -0
- package/src/scr_stream.c +2877 -0
- package/src/scr_string.c +1176 -0
- package/src/scr_symbol.c +132 -0
- package/src/scr_test.c +662 -0
- package/src/scr_tls.c +1520 -0
- package/src/scr_union.c +105 -0
- package/src/scr_url.c +911 -0
- package/src/scr_url_internal.h +29 -0
- package/src/scr_url_params.c +561 -0
- package/src/scr_watch.c +568 -0
- package/src/scr_web.c +1778 -0
- package/src/scr_win.c +76 -0
- package/src/scr_zlib.c +197 -0
- package/src/scr_zlib_island.c +15 -0
- package/vendor/README.md +52 -0
- package/vendor/curl/COPYRIGHT +534 -0
- package/vendor/curl/include/curl/curl.h +3214 -0
- package/vendor/curl/include/curl/curlver.h +79 -0
- package/vendor/curl/include/curl/easy.h +125 -0
- package/vendor/curl/include/curl/header.h +74 -0
- package/vendor/curl/include/curl/mprintf.h +52 -0
- package/vendor/curl/include/curl/multi.h +460 -0
- package/vendor/curl/include/curl/options.h +70 -0
- package/vendor/curl/include/curl/stdcheaders.h +35 -0
- package/vendor/curl/include/curl/system.h +508 -0
- package/vendor/curl/include/curl/typecheck-gcc.h +716 -0
- package/vendor/curl/include/curl/urlapi.h +149 -0
- package/vendor/curl/include/curl/websockets.h +84 -0
- package/vendor/mbedtls/LICENSE +553 -0
- package/vendor/mbedtls/include/CMakeLists.txt +22 -0
- package/vendor/mbedtls/include/mbedtls/aes.h +631 -0
- package/vendor/mbedtls/include/mbedtls/aria.h +343 -0
- package/vendor/mbedtls/include/mbedtls/asn1.h +642 -0
- package/vendor/mbedtls/include/mbedtls/asn1write.h +390 -0
- package/vendor/mbedtls/include/mbedtls/base64.h +82 -0
- package/vendor/mbedtls/include/mbedtls/bignum.h +1088 -0
- package/vendor/mbedtls/include/mbedtls/block_cipher.h +76 -0
- package/vendor/mbedtls/include/mbedtls/build_info.h +194 -0
- package/vendor/mbedtls/include/mbedtls/camellia.h +305 -0
- package/vendor/mbedtls/include/mbedtls/ccm.h +526 -0
- package/vendor/mbedtls/include/mbedtls/chacha20.h +209 -0
- package/vendor/mbedtls/include/mbedtls/chachapoly.h +351 -0
- package/vendor/mbedtls/include/mbedtls/check_config.h +1149 -0
- package/vendor/mbedtls/include/mbedtls/cipher.h +1250 -0
- package/vendor/mbedtls/include/mbedtls/cmac.h +246 -0
- package/vendor/mbedtls/include/mbedtls/compat-2.x.h +46 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_legacy_crypto.h +578 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_legacy_from_psa.h +873 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_psa_from_legacy.h +359 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_psa_superset_legacy.h +145 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_ssl.h +91 -0
- package/vendor/mbedtls/include/mbedtls/config_adjust_x509.h +35 -0
- package/vendor/mbedtls/include/mbedtls/config_psa.h +61 -0
- package/vendor/mbedtls/include/mbedtls/constant_time.h +36 -0
- package/vendor/mbedtls/include/mbedtls/ctr_drbg.h +596 -0
- package/vendor/mbedtls/include/mbedtls/debug.h +156 -0
- package/vendor/mbedtls/include/mbedtls/des.h +385 -0
- package/vendor/mbedtls/include/mbedtls/dhm.h +972 -0
- package/vendor/mbedtls/include/mbedtls/ecdh.h +455 -0
- package/vendor/mbedtls/include/mbedtls/ecdsa.h +674 -0
- package/vendor/mbedtls/include/mbedtls/ecjpake.h +298 -0
- package/vendor/mbedtls/include/mbedtls/ecp.h +1517 -0
- package/vendor/mbedtls/include/mbedtls/entropy.h +274 -0
- package/vendor/mbedtls/include/mbedtls/error.h +201 -0
- package/vendor/mbedtls/include/mbedtls/gcm.h +387 -0
- package/vendor/mbedtls/include/mbedtls/hkdf.h +124 -0
- package/vendor/mbedtls/include/mbedtls/hmac_drbg.h +434 -0
- package/vendor/mbedtls/include/mbedtls/lms.h +440 -0
- package/vendor/mbedtls/include/mbedtls/mbedtls_config.h +4446 -0
- package/vendor/mbedtls/include/mbedtls/md.h +526 -0
- package/vendor/mbedtls/include/mbedtls/md5.h +190 -0
- package/vendor/mbedtls/include/mbedtls/memory_buffer_alloc.h +142 -0
- package/vendor/mbedtls/include/mbedtls/net_sockets.h +299 -0
- package/vendor/mbedtls/include/mbedtls/nist_kw.h +166 -0
- package/vendor/mbedtls/include/mbedtls/oid.h +727 -0
- package/vendor/mbedtls/include/mbedtls/pem.h +160 -0
- package/vendor/mbedtls/include/mbedtls/pk.h +1303 -0
- package/vendor/mbedtls/include/mbedtls/pkcs12.h +186 -0
- package/vendor/mbedtls/include/mbedtls/pkcs5.h +198 -0
- package/vendor/mbedtls/include/mbedtls/pkcs7.h +252 -0
- package/vendor/mbedtls/include/mbedtls/platform.h +516 -0
- package/vendor/mbedtls/include/mbedtls/platform_time.h +79 -0
- package/vendor/mbedtls/include/mbedtls/platform_util.h +247 -0
- package/vendor/mbedtls/include/mbedtls/poly1305.h +168 -0
- package/vendor/mbedtls/include/mbedtls/private_access.h +20 -0
- package/vendor/mbedtls/include/mbedtls/psa_util.h +207 -0
- package/vendor/mbedtls/include/mbedtls/ripemd160.h +136 -0
- package/vendor/mbedtls/include/mbedtls/rsa.h +1170 -0
- package/vendor/mbedtls/include/mbedtls/sha1.h +219 -0
- package/vendor/mbedtls/include/mbedtls/sha256.h +200 -0
- package/vendor/mbedtls/include/mbedtls/sha3.h +172 -0
- package/vendor/mbedtls/include/mbedtls/sha512.h +208 -0
- package/vendor/mbedtls/include/mbedtls/ssl.h +5887 -0
- package/vendor/mbedtls/include/mbedtls/ssl_cache.h +187 -0
- package/vendor/mbedtls/include/mbedtls/ssl_ciphersuites.h +482 -0
- package/vendor/mbedtls/include/mbedtls/ssl_cookie.h +106 -0
- package/vendor/mbedtls/include/mbedtls/ssl_ticket.h +199 -0
- package/vendor/mbedtls/include/mbedtls/threading.h +167 -0
- package/vendor/mbedtls/include/mbedtls/timing.h +94 -0
- package/vendor/mbedtls/include/mbedtls/version.h +78 -0
- package/vendor/mbedtls/include/mbedtls/x509.h +500 -0
- package/vendor/mbedtls/include/mbedtls/x509_crl.h +184 -0
- package/vendor/mbedtls/include/mbedtls/x509_crt.h +1208 -0
- package/vendor/mbedtls/include/mbedtls/x509_csr.h +382 -0
- package/vendor/mbedtls/include/psa/build_info.h +20 -0
- package/vendor/mbedtls/include/psa/crypto.h +4998 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_auto_enabled.h +31 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_dependencies.h +51 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_key_pair_types.h +101 -0
- package/vendor/mbedtls/include/psa/crypto_adjust_config_synonyms.h +49 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_composites.h +214 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_key_derivation.h +118 -0
- package/vendor/mbedtls/include/psa/crypto_builtin_primitives.h +114 -0
- package/vendor/mbedtls/include/psa/crypto_compat.h +230 -0
- package/vendor/mbedtls/include/psa/crypto_config.h +145 -0
- package/vendor/mbedtls/include/psa/crypto_driver_common.h +44 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_composites.h +151 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_key_derivation.h +52 -0
- package/vendor/mbedtls/include/psa/crypto_driver_contexts_primitives.h +105 -0
- package/vendor/mbedtls/include/psa/crypto_extra.h +2145 -0
- package/vendor/mbedtls/include/psa/crypto_legacy.h +88 -0
- package/vendor/mbedtls/include/psa/crypto_platform.h +102 -0
- package/vendor/mbedtls/include/psa/crypto_se_driver.h +1383 -0
- package/vendor/mbedtls/include/psa/crypto_sizes.h +1319 -0
- package/vendor/mbedtls/include/psa/crypto_struct.h +527 -0
- package/vendor/mbedtls/include/psa/crypto_types.h +508 -0
- package/vendor/mbedtls/include/psa/crypto_values.h +2782 -0
- package/vendor/mbedtls/library/aes.c +2294 -0
- package/vendor/mbedtls/library/aesce.c +624 -0
- package/vendor/mbedtls/library/aesce.h +136 -0
- package/vendor/mbedtls/library/aesni.c +846 -0
- package/vendor/mbedtls/library/aesni.h +162 -0
- package/vendor/mbedtls/library/alignment.h +704 -0
- package/vendor/mbedtls/library/aria.c +969 -0
- package/vendor/mbedtls/library/asn1parse.c +468 -0
- package/vendor/mbedtls/library/asn1write.c +440 -0
- package/vendor/mbedtls/library/base64.c +322 -0
- package/vendor/mbedtls/library/base64_internal.h +45 -0
- package/vendor/mbedtls/library/bignum.c +2583 -0
- package/vendor/mbedtls/library/bignum_core.c +1240 -0
- package/vendor/mbedtls/library/bignum_core.h +872 -0
- package/vendor/mbedtls/library/bignum_core_invasive.h +38 -0
- package/vendor/mbedtls/library/bignum_internal.h +122 -0
- package/vendor/mbedtls/library/bignum_mod.c +394 -0
- package/vendor/mbedtls/library/bignum_mod.h +452 -0
- package/vendor/mbedtls/library/bignum_mod_raw.c +276 -0
- package/vendor/mbedtls/library/bignum_mod_raw.h +416 -0
- package/vendor/mbedtls/library/bignum_mod_raw_invasive.h +34 -0
- package/vendor/mbedtls/library/block_cipher.c +207 -0
- package/vendor/mbedtls/library/block_cipher_internal.h +99 -0
- package/vendor/mbedtls/library/bn_mul.h +1094 -0
- package/vendor/mbedtls/library/camellia.c +1058 -0
- package/vendor/mbedtls/library/ccm.c +777 -0
- package/vendor/mbedtls/library/chacha20.c +563 -0
- package/vendor/mbedtls/library/chacha20_internal.h +23 -0
- package/vendor/mbedtls/library/chachapoly.c +487 -0
- package/vendor/mbedtls/library/check_crypto_config.h +136 -0
- package/vendor/mbedtls/library/cipher.c +1712 -0
- package/vendor/mbedtls/library/cipher_invasive.h +28 -0
- package/vendor/mbedtls/library/cipher_wrap.c +2482 -0
- package/vendor/mbedtls/library/cipher_wrap.h +178 -0
- package/vendor/mbedtls/library/cmac.c +1067 -0
- package/vendor/mbedtls/library/common.h +487 -0
- package/vendor/mbedtls/library/constant_time.c +247 -0
- package/vendor/mbedtls/library/constant_time_impl.h +541 -0
- package/vendor/mbedtls/library/constant_time_internal.h +579 -0
- package/vendor/mbedtls/library/ctr.h +35 -0
- package/vendor/mbedtls/library/ctr_drbg.c +1016 -0
- package/vendor/mbedtls/library/debug.c +475 -0
- package/vendor/mbedtls/library/debug_internal.h +185 -0
- package/vendor/mbedtls/library/des.c +1042 -0
- package/vendor/mbedtls/library/dhm.c +700 -0
- package/vendor/mbedtls/library/ecdh.c +696 -0
- package/vendor/mbedtls/library/ecdsa.c +858 -0
- package/vendor/mbedtls/library/ecjpake.c +1216 -0
- package/vendor/mbedtls/library/ecp.c +3674 -0
- package/vendor/mbedtls/library/ecp_curves.c +6125 -0
- package/vendor/mbedtls/library/ecp_curves_new.c +9 -0
- package/vendor/mbedtls/library/ecp_internal_alt.h +287 -0
- package/vendor/mbedtls/library/ecp_invasive.h +305 -0
- package/vendor/mbedtls/library/entropy.c +680 -0
- package/vendor/mbedtls/library/entropy_poll.c +233 -0
- package/vendor/mbedtls/library/entropy_poll.h +64 -0
- package/vendor/mbedtls/library/error.c +878 -0
- package/vendor/mbedtls/library/gcm.c +1330 -0
- package/vendor/mbedtls/library/hkdf.c +161 -0
- package/vendor/mbedtls/library/hmac_drbg.c +633 -0
- package/vendor/mbedtls/library/lmots.c +789 -0
- package/vendor/mbedtls/library/lmots.h +288 -0
- package/vendor/mbedtls/library/lms.c +778 -0
- package/vendor/mbedtls/library/md.c +1108 -0
- package/vendor/mbedtls/library/md5.c +426 -0
- package/vendor/mbedtls/library/md_psa.h +26 -0
- package/vendor/mbedtls/library/md_wrap.h +46 -0
- package/vendor/mbedtls/library/memory_buffer_alloc.c +751 -0
- package/vendor/mbedtls/library/mps_common.h +181 -0
- package/vendor/mbedtls/library/mps_error.h +89 -0
- package/vendor/mbedtls/library/mps_reader.c +538 -0
- package/vendor/mbedtls/library/mps_reader.h +366 -0
- package/vendor/mbedtls/library/mps_trace.c +112 -0
- package/vendor/mbedtls/library/mps_trace.h +154 -0
- package/vendor/mbedtls/library/net_sockets.c +694 -0
- package/vendor/mbedtls/library/nist_kw.c +729 -0
- package/vendor/mbedtls/library/oid.c +1166 -0
- package/vendor/mbedtls/library/padlock.c +157 -0
- package/vendor/mbedtls/library/padlock.h +111 -0
- package/vendor/mbedtls/library/pem.c +554 -0
- package/vendor/mbedtls/library/pk.c +1602 -0
- package/vendor/mbedtls/library/pk_ecc.c +261 -0
- package/vendor/mbedtls/library/pk_internal.h +241 -0
- package/vendor/mbedtls/library/pk_wrap.c +1618 -0
- package/vendor/mbedtls/library/pk_wrap.h +138 -0
- package/vendor/mbedtls/library/pkcs12.c +437 -0
- package/vendor/mbedtls/library/pkcs5.c +500 -0
- package/vendor/mbedtls/library/pkcs7.c +787 -0
- package/vendor/mbedtls/library/pkparse.c +1392 -0
- package/vendor/mbedtls/library/pkwrite.c +631 -0
- package/vendor/mbedtls/library/pkwrite.h +121 -0
- package/vendor/mbedtls/library/platform.c +402 -0
- package/vendor/mbedtls/library/platform_util.c +258 -0
- package/vendor/mbedtls/library/poly1305.c +492 -0
- package/vendor/mbedtls/library/psa_crypto.c +9532 -0
- package/vendor/mbedtls/library/psa_crypto_aead.c +646 -0
- package/vendor/mbedtls/library/psa_crypto_aead.h +499 -0
- package/vendor/mbedtls/library/psa_crypto_cipher.c +747 -0
- package/vendor/mbedtls/library/psa_crypto_cipher.h +316 -0
- package/vendor/mbedtls/library/psa_crypto_client.c +22 -0
- package/vendor/mbedtls/library/psa_crypto_core.h +983 -0
- package/vendor/mbedtls/library/psa_crypto_core_common.h +52 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers.h +2896 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers_no_static.c +256 -0
- package/vendor/mbedtls/library/psa_crypto_driver_wrappers_no_static.h +31 -0
- package/vendor/mbedtls/library/psa_crypto_ecp.c +594 -0
- package/vendor/mbedtls/library/psa_crypto_ecp.h +267 -0
- package/vendor/mbedtls/library/psa_crypto_ffdh.c +361 -0
- package/vendor/mbedtls/library/psa_crypto_ffdh.h +131 -0
- package/vendor/mbedtls/library/psa_crypto_hash.c +470 -0
- package/vendor/mbedtls/library/psa_crypto_hash.h +211 -0
- package/vendor/mbedtls/library/psa_crypto_invasive.h +92 -0
- package/vendor/mbedtls/library/psa_crypto_its.h +131 -0
- package/vendor/mbedtls/library/psa_crypto_mac.c +505 -0
- package/vendor/mbedtls/library/psa_crypto_mac.h +264 -0
- package/vendor/mbedtls/library/psa_crypto_pake.c +571 -0
- package/vendor/mbedtls/library/psa_crypto_pake.h +159 -0
- package/vendor/mbedtls/library/psa_crypto_random.c +181 -0
- package/vendor/mbedtls/library/psa_crypto_random.h +72 -0
- package/vendor/mbedtls/library/psa_crypto_random_impl.h +200 -0
- package/vendor/mbedtls/library/psa_crypto_rsa.c +714 -0
- package/vendor/mbedtls/library/psa_crypto_rsa.h +321 -0
- package/vendor/mbedtls/library/psa_crypto_se.c +373 -0
- package/vendor/mbedtls/library/psa_crypto_se.h +192 -0
- package/vendor/mbedtls/library/psa_crypto_slot_management.c +1137 -0
- package/vendor/mbedtls/library/psa_crypto_slot_management.h +344 -0
- package/vendor/mbedtls/library/psa_crypto_storage.c +481 -0
- package/vendor/mbedtls/library/psa_crypto_storage.h +392 -0
- package/vendor/mbedtls/library/psa_its_file.c +254 -0
- package/vendor/mbedtls/library/psa_util.c +614 -0
- package/vendor/mbedtls/library/psa_util_internal.h +100 -0
- package/vendor/mbedtls/library/ripemd160.c +490 -0
- package/vendor/mbedtls/library/rsa.c +3121 -0
- package/vendor/mbedtls/library/rsa_alt_helpers.c +455 -0
- package/vendor/mbedtls/library/rsa_alt_helpers.h +209 -0
- package/vendor/mbedtls/library/rsa_internal.h +188 -0
- package/vendor/mbedtls/library/sha1.c +480 -0
- package/vendor/mbedtls/library/sha256.c +983 -0
- package/vendor/mbedtls/library/sha3.c +721 -0
- package/vendor/mbedtls/library/sha512.c +1115 -0
- package/vendor/mbedtls/library/ssl_cache.c +410 -0
- package/vendor/mbedtls/library/ssl_ciphersuites.c +2050 -0
- package/vendor/mbedtls/library/ssl_ciphersuites_internal.h +154 -0
- package/vendor/mbedtls/library/ssl_client.c +1023 -0
- package/vendor/mbedtls/library/ssl_client.h +22 -0
- package/vendor/mbedtls/library/ssl_cookie.c +384 -0
- package/vendor/mbedtls/library/ssl_debug_helpers.h +85 -0
- package/vendor/mbedtls/library/ssl_debug_helpers_generated.c +251 -0
- package/vendor/mbedtls/library/ssl_misc.h +3198 -0
- package/vendor/mbedtls/library/ssl_msg.c +6619 -0
- package/vendor/mbedtls/library/ssl_ticket.c +556 -0
- package/vendor/mbedtls/library/ssl_tls.c +10234 -0
- package/vendor/mbedtls/library/ssl_tls12_client.c +3688 -0
- package/vendor/mbedtls/library/ssl_tls12_server.c +4311 -0
- package/vendor/mbedtls/library/ssl_tls13_client.c +3208 -0
- package/vendor/mbedtls/library/ssl_tls13_generic.c +1793 -0
- package/vendor/mbedtls/library/ssl_tls13_invasive.h +23 -0
- package/vendor/mbedtls/library/ssl_tls13_keys.c +1918 -0
- package/vendor/mbedtls/library/ssl_tls13_keys.h +668 -0
- package/vendor/mbedtls/library/ssl_tls13_server.c +3624 -0
- package/vendor/mbedtls/library/threading.c +193 -0
- package/vendor/mbedtls/library/threading_internal.h +28 -0
- package/vendor/mbedtls/library/timing.c +152 -0
- package/vendor/mbedtls/library/version.c +32 -0
- package/vendor/mbedtls/library/version_features.c +856 -0
- package/vendor/mbedtls/library/x509.c +1776 -0
- package/vendor/mbedtls/library/x509_create.c +570 -0
- package/vendor/mbedtls/library/x509_crl.c +708 -0
- package/vendor/mbedtls/library/x509_crt.c +3311 -0
- package/vendor/mbedtls/library/x509_csr.c +648 -0
- package/vendor/mbedtls/library/x509_internal.h +101 -0
- package/vendor/mbedtls/library/x509write.c +174 -0
- package/vendor/mbedtls/library/x509write_crt.c +688 -0
- package/vendor/mbedtls/library/x509write_csr.c +336 -0
- package/vendor/quickjs-ng/CMakeLists.txt +566 -0
- package/vendor/quickjs-ng/LICENSE +24 -0
- package/vendor/quickjs-ng/README.md +24 -0
- package/vendor/quickjs-ng/api-test.c +1195 -0
- package/vendor/quickjs-ng/builtin-array-fromasync.h +119 -0
- package/vendor/quickjs-ng/builtin-iterator-zip-keyed.h +332 -0
- package/vendor/quickjs-ng/builtin-iterator-zip.h +337 -0
- package/vendor/quickjs-ng/cutils.h +1998 -0
- package/vendor/quickjs-ng/dtoa.c +1619 -0
- package/vendor/quickjs-ng/dtoa.h +87 -0
- package/vendor/quickjs-ng/gen/function_source.c +81 -0
- package/vendor/quickjs-ng/gen/hello.c +53 -0
- package/vendor/quickjs-ng/gen/hello_module.c +106 -0
- package/vendor/quickjs-ng/gen/repl.c +3036 -0
- package/vendor/quickjs-ng/gen/standalone.c +323 -0
- package/vendor/quickjs-ng/gen/test_fib.c +81 -0
- package/vendor/quickjs-ng/libregexp-opcode.h +73 -0
- package/vendor/quickjs-ng/libregexp.c +3474 -0
- package/vendor/quickjs-ng/libregexp.h +101 -0
- package/vendor/quickjs-ng/libunicode-table.h +5173 -0
- package/vendor/quickjs-ng/libunicode.c +2069 -0
- package/vendor/quickjs-ng/libunicode.h +172 -0
- package/vendor/quickjs-ng/list.h +107 -0
- package/vendor/quickjs-ng/lre-test.c +52 -0
- package/vendor/quickjs-ng/qjs.c +762 -0
- package/vendor/quickjs-ng/qjsc.c +673 -0
- package/vendor/quickjs-ng/quickjs-atom.h +280 -0
- package/vendor/quickjs-ng/quickjs-c-atomics.h +54 -0
- package/vendor/quickjs-ng/quickjs-libc.c +5037 -0
- package/vendor/quickjs-ng/quickjs-libc.h +87 -0
- package/vendor/quickjs-ng/quickjs-opcode.h +377 -0
- package/vendor/quickjs-ng/quickjs.c +64041 -0
- package/vendor/quickjs-ng/quickjs.h +1447 -0
- package/vendor/quickjs-ng/run-test262.c +2374 -0
- package/vendor/quickjs-ng/unicode_gen.c +3121 -0
- package/vendor/quickjs-ng/unicode_gen_def.h +310 -0
- package/vendor/ryu/LICENSE-Boost +23 -0
- package/vendor/ryu/common.h +114 -0
- package/vendor/ryu/d2s.c +509 -0
- package/vendor/ryu/d2s_full_table.h +367 -0
- package/vendor/ryu/d2s_intrinsics.h +357 -0
- package/vendor/ryu/d2s_small_table.h +186 -0
- package/vendor/ryu/digit_table.h +35 -0
- package/vendor/ryu/ryu.h +46 -0
- package/vendor/zlib/LICENSE +22 -0
- package/vendor/zlib/adler32.c +164 -0
- package/vendor/zlib/compress.c +75 -0
- package/vendor/zlib/crc32.c +1049 -0
- package/vendor/zlib/crc32.h +9446 -0
- package/vendor/zlib/deflate.c +2139 -0
- package/vendor/zlib/deflate.h +377 -0
- package/vendor/zlib/gzclose.c +23 -0
- package/vendor/zlib/gzguts.h +214 -0
- package/vendor/zlib/gzlib.c +582 -0
- package/vendor/zlib/gzread.c +602 -0
- package/vendor/zlib/gzwrite.c +631 -0
- package/vendor/zlib/infback.c +628 -0
- package/vendor/zlib/inffast.c +320 -0
- package/vendor/zlib/inffast.h +11 -0
- package/vendor/zlib/inffixed.h +94 -0
- package/vendor/zlib/inflate.c +1526 -0
- package/vendor/zlib/inflate.h +126 -0
- package/vendor/zlib/inftrees.c +299 -0
- package/vendor/zlib/inftrees.h +62 -0
- package/vendor/zlib/trees.c +1117 -0
- package/vendor/zlib/trees.h +128 -0
- package/vendor/zlib/uncompr.c +85 -0
- package/vendor/zlib/zconf.h +543 -0
- package/vendor/zlib/zlib.h +1938 -0
- package/vendor/zlib/zutil.c +299 -0
- package/vendor/zlib/zutil.h +254 -0
- package/README.md +0 -3
- package/index.js +0 -2
package/src/scr_map.c
ADDED
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
/* ES Map<K, V> — the compact-dict design (see scr_runtime.h for the API
|
|
2
|
+
* contract): a dense, insertion-ordered entries array plus an open-addressing
|
|
3
|
+
* bucket table of entry indices. Deletions tombstone their entry (key and
|
|
4
|
+
* value released immediately; the bucket slot keeps pointing at the dead
|
|
5
|
+
* entry so probe chains stay intact); tombstones are compacted away when the
|
|
6
|
+
* entries array grows — but never while an iteration is active (iter_depth),
|
|
7
|
+
* which is what keeps the forEach desugar's plain indices stable under
|
|
8
|
+
* arbitrary mutation from the callback.
|
|
9
|
+
*
|
|
10
|
+
* Cycle capability is per-map, decided at construction: val_trace non-NULL
|
|
11
|
+
* means the value type carries a collector header, so records/objects stored
|
|
12
|
+
* as values could point back at this map — the map allocates with the hidden
|
|
13
|
+
* cycle header, its trace visits every live value, and the collector
|
|
14
|
+
* teardown releases the complement (string keys) per the trace/teardown
|
|
15
|
+
* contract in scr_runtime.h. Scalar-, string- and array-valued maps keep the
|
|
16
|
+
* lean 1-word header and never touch the collector.
|
|
17
|
+
*/
|
|
18
|
+
#include "scr_runtime.h"
|
|
19
|
+
|
|
20
|
+
#include <stdio.h>
|
|
21
|
+
#include <stdlib.h>
|
|
22
|
+
#include <string.h>
|
|
23
|
+
|
|
24
|
+
/* Live heap-map count for the RC audit lane (-DSCR_RC_AUDIT); same contract
|
|
25
|
+
* as scr_str_live_count in scr_string.c. */
|
|
26
|
+
#ifdef SCR_RC_AUDIT
|
|
27
|
+
static long scr_live_maps = 0;
|
|
28
|
+
long scr_map_live_count(void) { return scr_live_maps; }
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
#define SCR_MAP_EMPTY SIZE_MAX
|
|
32
|
+
|
|
33
|
+
static void scr_map_oom(void) {
|
|
34
|
+
fputs("scriptc: out of memory\n", stderr);
|
|
35
|
+
abort();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* ── key normalization + hashing (SameValueZero) ───────────────────────
|
|
39
|
+
* -0 normalizes to +0 (JS Map stores the +0 key: [...m.keys()] shows 0
|
|
40
|
+
* after set(-0)) and every NaN collapses to one canonical bit pattern, so
|
|
41
|
+
* hashing the bit pattern IS SameValueZero hashing. */
|
|
42
|
+
|
|
43
|
+
static uint64_t scr_map_f64_bits(double k) {
|
|
44
|
+
if (k != k) return UINT64_C(0x7ff8000000000000); /* canonical NaN */
|
|
45
|
+
if (k == 0) k = 0; /* -0 -> +0 */
|
|
46
|
+
uint64_t bits;
|
|
47
|
+
memcpy(&bits, &k, sizeof bits);
|
|
48
|
+
return bits;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static uint64_t scr_map_fnv1a(const unsigned char *bytes, size_t n) {
|
|
52
|
+
uint64_t h = UINT64_C(0xcbf29ce484222325);
|
|
53
|
+
for (size_t i = 0; i < n; i++) {
|
|
54
|
+
h ^= bytes[i];
|
|
55
|
+
h *= UINT64_C(0x100000001b3);
|
|
56
|
+
}
|
|
57
|
+
return h;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static uint64_t scr_map_hash_str(const ScrStr *k) {
|
|
61
|
+
return scr_map_fnv1a((const unsigned char *)k->data, k->len);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ── slot packing (8-byte slots, like ScrArr) ──────────────────────────── */
|
|
65
|
+
|
|
66
|
+
static uint64_t scr_map_slot_from_f64(double v) {
|
|
67
|
+
uint64_t s;
|
|
68
|
+
memcpy(&s, &v, sizeof s);
|
|
69
|
+
return s;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
static double scr_map_slot_to_f64(uint64_t s) {
|
|
73
|
+
double v;
|
|
74
|
+
memcpy(&v, &s, sizeof v);
|
|
75
|
+
return v;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static uint64_t scr_map_slot_from_ptr(void *p) { return (uint64_t)(uintptr_t)p; }
|
|
79
|
+
|
|
80
|
+
static void *scr_map_slot_to_ptr(uint64_t s) { return (void *)(uintptr_t)s; }
|
|
81
|
+
|
|
82
|
+
/* Stored keys are pre-normalized, so bit equality IS SameValueZero for f64
|
|
83
|
+
* keys (probe keys normalize through the same function). */
|
|
84
|
+
static bool scr_map_key_eq(const ScrMap *m, uint64_t stored, uint64_t probe) {
|
|
85
|
+
/* f64 keys are pre-normalized and REF keys are pointers, so bit equality
|
|
86
|
+
* IS the honest compare for both (SameValueZero; reference identity). */
|
|
87
|
+
if (m->key_kind != SCR_MAP_KEY_STR) return stored == probe;
|
|
88
|
+
return scr_str_eq((ScrStr *)scr_map_slot_to_ptr(stored),
|
|
89
|
+
(ScrStr *)scr_map_slot_to_ptr(probe));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* ── lookup ────────────────────────────────────────────────────────────
|
|
93
|
+
* Returns the LIVE entry index holding the key, or SCR_MAP_EMPTY. Probes
|
|
94
|
+
* skip tombstoned entries (their bucket slots keep chains intact). */
|
|
95
|
+
static size_t scr_map_find(const ScrMap *m, uint64_t hash, uint64_t key) {
|
|
96
|
+
if (m->nbuckets == 0) return SCR_MAP_EMPTY;
|
|
97
|
+
size_t mask = m->nbuckets - 1;
|
|
98
|
+
for (size_t i = hash & mask;; i = (i + 1) & mask) {
|
|
99
|
+
size_t b = m->buckets[i];
|
|
100
|
+
if (b == SCR_MAP_EMPTY) return SCR_MAP_EMPTY;
|
|
101
|
+
if (m->entries[b].live && scr_map_key_eq(m, m->entries[b].key, key)) return b;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Rebuild the bucket table (size must be a power of two >= 2 * nentries):
|
|
106
|
+
* only live entries are inserted, in dense order — dead markers vanish. */
|
|
107
|
+
static void scr_map_rebuild_buckets(ScrMap *m, size_t nbuckets) {
|
|
108
|
+
size_t *buckets = malloc(nbuckets * sizeof *buckets);
|
|
109
|
+
if (!buckets) scr_map_oom();
|
|
110
|
+
for (size_t i = 0; i < nbuckets; i++) buckets[i] = SCR_MAP_EMPTY;
|
|
111
|
+
free(m->buckets);
|
|
112
|
+
m->buckets = buckets;
|
|
113
|
+
m->nbuckets = nbuckets;
|
|
114
|
+
size_t mask = nbuckets - 1;
|
|
115
|
+
for (size_t e = 0; e < m->nentries; e++) {
|
|
116
|
+
if (!m->entries[e].live) continue;
|
|
117
|
+
uint64_t hash = m->key_kind != SCR_MAP_KEY_STR
|
|
118
|
+
? scr_map_fnv1a((const unsigned char *)&m->entries[e].key, 8)
|
|
119
|
+
: scr_map_hash_str((ScrStr *)scr_map_slot_to_ptr(m->entries[e].key));
|
|
120
|
+
size_t i = hash & mask;
|
|
121
|
+
while (buckets[i] != SCR_MAP_EMPTY) i = (i + 1) & mask;
|
|
122
|
+
buckets[i] = e;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Drop tombstones, preserving insertion order. Only legal when no iteration
|
|
127
|
+
* is active (the forEach desugar's indices would shift). */
|
|
128
|
+
static void scr_map_compact(ScrMap *m) {
|
|
129
|
+
size_t w = 0;
|
|
130
|
+
for (size_t r = 0; r < m->nentries; r++) {
|
|
131
|
+
if (m->entries[r].live) m->entries[w++] = m->entries[r];
|
|
132
|
+
}
|
|
133
|
+
m->nentries = w;
|
|
134
|
+
if (m->nbuckets > 0) scr_map_rebuild_buckets(m, m->nbuckets);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* Make room to append one entry. Prefers compaction (tombstone-heavy maps
|
|
138
|
+
* reuse their storage) and grows otherwise; while an iteration is active it
|
|
139
|
+
* ONLY grows — indices must stay stable under callback mutation. */
|
|
140
|
+
static void scr_map_reserve_append(ScrMap *m) {
|
|
141
|
+
if (m->nentries < m->ecap && m->nbuckets >= 2 * (m->nentries + 1)) return;
|
|
142
|
+
if (m->iter_depth == 0 && m->nlive <= m->nentries / 2 && m->nentries > 0) {
|
|
143
|
+
scr_map_compact(m);
|
|
144
|
+
}
|
|
145
|
+
if (m->nentries == m->ecap) {
|
|
146
|
+
size_t cap = m->ecap ? m->ecap : 8;
|
|
147
|
+
while (cap < m->nentries + 1) {
|
|
148
|
+
if (cap > SIZE_MAX / 2 / sizeof(ScrMapEntry)) scr_map_oom();
|
|
149
|
+
cap *= 2;
|
|
150
|
+
}
|
|
151
|
+
ScrMapEntry *entries = realloc(m->entries, cap * sizeof *entries);
|
|
152
|
+
if (!entries) scr_map_oom();
|
|
153
|
+
m->entries = entries;
|
|
154
|
+
m->ecap = cap;
|
|
155
|
+
}
|
|
156
|
+
if (m->nbuckets < 2 * (m->nentries + 1)) {
|
|
157
|
+
size_t nbuckets = m->nbuckets ? m->nbuckets : 16;
|
|
158
|
+
while (nbuckets < 2 * (m->nentries + 1)) {
|
|
159
|
+
if (nbuckets > SIZE_MAX / 2 / sizeof(size_t)) scr_map_oom();
|
|
160
|
+
nbuckets *= 2;
|
|
161
|
+
}
|
|
162
|
+
scr_map_rebuild_buckets(m, nbuckets);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* ── entry release helpers ─────────────────────────────────────────────── */
|
|
167
|
+
|
|
168
|
+
static void scr_map_release_key(ScrMap *m, uint64_t key) {
|
|
169
|
+
if (m->key_kind == SCR_MAP_KEY_STR) {
|
|
170
|
+
scr_str_release((ScrStr *)scr_map_slot_to_ptr(key));
|
|
171
|
+
} else if (m->key_kind == SCR_MAP_KEY_REF) {
|
|
172
|
+
m->key_release(scr_map_slot_to_ptr(key));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
static void scr_map_release_val(ScrMap *m, uint64_t val) {
|
|
177
|
+
if (m->val_kind == SCR_MAP_VAL_REF) m->val_release(scr_map_slot_to_ptr(val));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* ── lifecycle ─────────────────────────────────────────────────────────── */
|
|
181
|
+
|
|
182
|
+
static void scr_map_trace(void *o, ScrTraceVisit visit, void *ctx) {
|
|
183
|
+
ScrMap *m = (ScrMap *)o;
|
|
184
|
+
for (size_t e = 0; e < m->nentries; e++) {
|
|
185
|
+
if (m->entries[e].live) visit(scr_map_slot_to_ptr(m->entries[e].val), ctx);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* Collector teardown: the trace visits every live VALUE (traced edges were
|
|
190
|
+
* already accounted), so the complement released here is the keys. */
|
|
191
|
+
static void scr_map_gcfree(void *o) {
|
|
192
|
+
ScrMap *m = (ScrMap *)o;
|
|
193
|
+
for (size_t e = 0; e < m->nentries; e++) {
|
|
194
|
+
if (m->entries[e].live) scr_map_release_key(m, m->entries[e].key);
|
|
195
|
+
}
|
|
196
|
+
free(m->entries);
|
|
197
|
+
free(m->buckets);
|
|
198
|
+
#ifdef SCR_RC_AUDIT
|
|
199
|
+
scr_live_maps--;
|
|
200
|
+
#endif
|
|
201
|
+
scr_cyc_free(m);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
ScrMap *scr_map_new(ScrMapKeyKind key_kind, ScrMapValKind val_kind,
|
|
205
|
+
void *(*val_retain)(void *), void (*val_release)(void *),
|
|
206
|
+
ScrTraceFn val_trace) {
|
|
207
|
+
ScrMap *m;
|
|
208
|
+
if (val_trace) {
|
|
209
|
+
/* Cycle-capable values can point back: collector header + trace. */
|
|
210
|
+
m = scr_cyc_alloc(sizeof *m, &scr_map_trace, &scr_map_gcfree);
|
|
211
|
+
} else {
|
|
212
|
+
m = calloc(1, sizeof *m);
|
|
213
|
+
if (!m) scr_map_oom();
|
|
214
|
+
}
|
|
215
|
+
m->rc = 1;
|
|
216
|
+
m->key_kind = key_kind;
|
|
217
|
+
m->val_kind = val_kind;
|
|
218
|
+
m->val_retain = val_retain;
|
|
219
|
+
m->val_release = val_release;
|
|
220
|
+
m->val_trace = val_trace;
|
|
221
|
+
#ifdef SCR_RC_AUDIT
|
|
222
|
+
scr_live_maps++;
|
|
223
|
+
#endif
|
|
224
|
+
return m;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
ScrMap *scr_map_retain(ScrMap *m) {
|
|
228
|
+
if (m->rc != SIZE_MAX) {
|
|
229
|
+
m->rc++;
|
|
230
|
+
if (m->val_trace) scr_cyc_mark_live(m);
|
|
231
|
+
}
|
|
232
|
+
return m;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
void scr_map_release(ScrMap *m) {
|
|
236
|
+
if (!m || m->rc == SIZE_MAX) return; /* NULL: an uninitialized `let` local */
|
|
237
|
+
if (--m->rc == 0) {
|
|
238
|
+
if (m->val_trace) scr_cyc_on_dead(m);
|
|
239
|
+
for (size_t e = 0; e < m->nentries; e++) {
|
|
240
|
+
if (!m->entries[e].live) continue;
|
|
241
|
+
scr_map_release_key(m, m->entries[e].key);
|
|
242
|
+
scr_map_release_val(m, m->entries[e].val);
|
|
243
|
+
}
|
|
244
|
+
free(m->entries);
|
|
245
|
+
free(m->buckets);
|
|
246
|
+
#ifdef SCR_RC_AUDIT
|
|
247
|
+
scr_live_maps--;
|
|
248
|
+
#endif
|
|
249
|
+
if (m->val_trace) scr_cyc_free(m);
|
|
250
|
+
else free(m);
|
|
251
|
+
} else if (m->val_trace) {
|
|
252
|
+
scr_cyc_on_release(m); /* possible cycle root; may collect — m is done */
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
void *scr_map_retain_v(void *m) { return scr_map_retain((ScrMap *)m); }
|
|
257
|
+
void scr_map_release_v(void *m) { scr_map_release((ScrMap *)m); }
|
|
258
|
+
void scr_map_trace_v(void *m, ScrTraceVisit visit, void *ctx) {
|
|
259
|
+
scr_map_trace(m, visit, ctx);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
double scr_map_size(const ScrMap *m) { return (double)m->nlive; }
|
|
263
|
+
|
|
264
|
+
void scr_map_clear(ScrMap *m) {
|
|
265
|
+
for (size_t e = 0; e < m->nentries; e++) {
|
|
266
|
+
if (!m->entries[e].live) continue;
|
|
267
|
+
m->entries[e].live = false;
|
|
268
|
+
scr_map_release_key(m, m->entries[e].key);
|
|
269
|
+
scr_map_release_val(m, m->entries[e].val);
|
|
270
|
+
}
|
|
271
|
+
m->nlive = 0;
|
|
272
|
+
if (m->iter_depth == 0) {
|
|
273
|
+
/* Full reset; an active iteration instead keeps the (now all-dead)
|
|
274
|
+
* entries so its indices stay stable — entries added by the callback
|
|
275
|
+
* after the clear append past them and ARE visited (Node-exact). */
|
|
276
|
+
m->nentries = 0;
|
|
277
|
+
}
|
|
278
|
+
for (size_t i = 0; i < m->nbuckets; i++) m->buckets[i] = SCR_MAP_EMPTY;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/* ── has / delete ──────────────────────────────────────────────────────── */
|
|
282
|
+
|
|
283
|
+
bool scr_map_has_f64(const ScrMap *m, double key) {
|
|
284
|
+
uint64_t k = scr_map_f64_bits(key);
|
|
285
|
+
return scr_map_find(m, scr_map_fnv1a((const unsigned char *)&k, 8), k) != SCR_MAP_EMPTY;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
bool scr_map_has_str(const ScrMap *m, const ScrStr *key) {
|
|
289
|
+
uint64_t k = scr_map_slot_from_ptr((void *)key);
|
|
290
|
+
return scr_map_find(m, scr_map_hash_str(key), k) != SCR_MAP_EMPTY;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
static bool scr_map_delete_found(ScrMap *m, size_t e) {
|
|
294
|
+
if (e == SCR_MAP_EMPTY) return false;
|
|
295
|
+
m->entries[e].live = false; /* bucket slot stays: probe chains intact */
|
|
296
|
+
m->nlive--;
|
|
297
|
+
scr_map_release_key(m, m->entries[e].key);
|
|
298
|
+
scr_map_release_val(m, m->entries[e].val);
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
bool scr_map_delete_f64(ScrMap *m, double key) {
|
|
303
|
+
uint64_t k = scr_map_f64_bits(key);
|
|
304
|
+
return scr_map_delete_found(m, scr_map_find(m, scr_map_fnv1a((const unsigned char *)&k, 8), k));
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
bool scr_map_delete_str(ScrMap *m, const ScrStr *key) {
|
|
308
|
+
uint64_t k = scr_map_slot_from_ptr((void *)key);
|
|
309
|
+
return scr_map_delete_found(m, scr_map_find(m, scr_map_hash_str(key), k));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/* REF keys: identity hashing over the pointer bits (see the header's
|
|
313
|
+
* SCR_MAP_KEY_REF note). Probes never retain; storage does. */
|
|
314
|
+
static size_t scr_map_find_ref(const ScrMap *m, const void *key) {
|
|
315
|
+
uint64_t k = scr_map_slot_from_ptr((void *)key);
|
|
316
|
+
return scr_map_find(m, scr_map_fnv1a((const unsigned char *)&k, 8), k);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
bool scr_map_has_ref(const ScrMap *m, const void *key) {
|
|
320
|
+
return scr_map_find_ref(m, key) != SCR_MAP_EMPTY;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
bool scr_map_delete_ref(ScrMap *m, const void *key) {
|
|
324
|
+
return scr_map_delete_found(m, scr_map_find_ref(m, key));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/* ── set ───────────────────────────────────────────────────────────────
|
|
328
|
+
* Overwrite keeps the entry (insertion position preserved, stored key kept
|
|
329
|
+
* — only the value is replaced-and-released). A new key appends: reserve
|
|
330
|
+
* space FIRST (compaction/growth may rebuild buckets), then probe for the
|
|
331
|
+
* insertion slot. */
|
|
332
|
+
|
|
333
|
+
static void scr_map_set(ScrMap *m, uint64_t hash, uint64_t key, uint64_t val) {
|
|
334
|
+
size_t e = scr_map_find(m, hash, key);
|
|
335
|
+
if (e != SCR_MAP_EMPTY) {
|
|
336
|
+
uint64_t old = m->entries[e].val;
|
|
337
|
+
m->entries[e].val = val; /* unlink before releasing (cycle collector) */
|
|
338
|
+
scr_map_release_val(m, old);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
scr_map_reserve_append(m);
|
|
342
|
+
size_t idx = m->nentries++;
|
|
343
|
+
m->entries[idx].key = key;
|
|
344
|
+
m->entries[idx].val = val;
|
|
345
|
+
m->entries[idx].live = true;
|
|
346
|
+
m->nlive++;
|
|
347
|
+
if (m->key_kind == SCR_MAP_KEY_STR) {
|
|
348
|
+
scr_str_retain((ScrStr *)scr_map_slot_to_ptr(key)); /* key is borrowed */
|
|
349
|
+
} else if (m->key_kind == SCR_MAP_KEY_REF) {
|
|
350
|
+
m->key_retain(scr_map_slot_to_ptr(key)); /* key is borrowed */
|
|
351
|
+
}
|
|
352
|
+
size_t mask = m->nbuckets - 1;
|
|
353
|
+
size_t i = hash & mask;
|
|
354
|
+
while (m->buckets[i] != SCR_MAP_EMPTY) i = (i + 1) & mask;
|
|
355
|
+
m->buckets[i] = idx;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
static void scr_map_set_f64_key(ScrMap *m, double key, uint64_t val) {
|
|
359
|
+
uint64_t k = scr_map_f64_bits(key); /* stores +0 for -0, canonical NaN */
|
|
360
|
+
scr_map_set(m, scr_map_fnv1a((const unsigned char *)&k, 8), k, val);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
static void scr_map_set_str_key(ScrMap *m, ScrStr *key, uint64_t val) {
|
|
364
|
+
scr_map_set(m, scr_map_hash_str(key), scr_map_slot_from_ptr(key), val);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
void scr_map_set_f64_f64(ScrMap *m, double key, double v) {
|
|
368
|
+
scr_map_set_f64_key(m, key, scr_map_slot_from_f64(v));
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
void scr_map_set_f64_bool(ScrMap *m, double key, bool v) {
|
|
372
|
+
scr_map_set_f64_key(m, key, (uint64_t)(v ? 1 : 0));
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
void scr_map_set_f64_ref(ScrMap *m, double key, void *v) {
|
|
376
|
+
scr_map_set_f64_key(m, key, scr_map_slot_from_ptr(v));
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
void scr_map_set_str_f64(ScrMap *m, ScrStr *key, double v) {
|
|
380
|
+
scr_map_set_str_key(m, key, scr_map_slot_from_f64(v));
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
void scr_map_set_str_bool(ScrMap *m, ScrStr *key, bool v) {
|
|
384
|
+
scr_map_set_str_key(m, key, (uint64_t)(v ? 1 : 0));
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
void scr_map_set_str_ref(ScrMap *m, ScrStr *key, void *v) {
|
|
388
|
+
scr_map_set_str_key(m, key, scr_map_slot_from_ptr(v));
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
void scr_map_set_ref_f64(ScrMap *m, void *key, double v) {
|
|
392
|
+
uint64_t k = scr_map_slot_from_ptr(key);
|
|
393
|
+
scr_map_set(m, scr_map_fnv1a((const unsigned char *)&k, 8), k, scr_map_slot_from_f64(v));
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
ScrMap *scr_set_new_ref(void *(*elem_retain)(void *), void (*elem_release)(void *)) {
|
|
397
|
+
ScrMap *m = scr_map_new(SCR_MAP_KEY_REF, SCR_MAP_VAL_F64, NULL, NULL, NULL);
|
|
398
|
+
m->key_retain = elem_retain;
|
|
399
|
+
m->key_release = elem_release;
|
|
400
|
+
return m;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/* ── get ───────────────────────────────────────────────────────────────── */
|
|
404
|
+
|
|
405
|
+
static size_t scr_map_find_f64(const ScrMap *m, double key) {
|
|
406
|
+
uint64_t k = scr_map_f64_bits(key);
|
|
407
|
+
return scr_map_find(m, scr_map_fnv1a((const unsigned char *)&k, 8), k);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
static size_t scr_map_find_str(const ScrMap *m, const ScrStr *key) {
|
|
411
|
+
return scr_map_find(m, scr_map_hash_str(key), scr_map_slot_from_ptr((void *)key));
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
bool scr_map_get_f64_f64(const ScrMap *m, double key, double *out) {
|
|
415
|
+
size_t e = scr_map_find_f64(m, key);
|
|
416
|
+
if (e == SCR_MAP_EMPTY) return false;
|
|
417
|
+
*out = scr_map_slot_to_f64(m->entries[e].val);
|
|
418
|
+
return true;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
bool scr_map_get_f64_bool(const ScrMap *m, double key, bool *out) {
|
|
422
|
+
size_t e = scr_map_find_f64(m, key);
|
|
423
|
+
if (e == SCR_MAP_EMPTY) return false;
|
|
424
|
+
*out = m->entries[e].val != 0;
|
|
425
|
+
return true;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
void *scr_map_get_f64_ref(const ScrMap *m, double key) {
|
|
429
|
+
size_t e = scr_map_find_f64(m, key);
|
|
430
|
+
if (e == SCR_MAP_EMPTY) return NULL;
|
|
431
|
+
return m->val_retain(scr_map_slot_to_ptr(m->entries[e].val)); /* +1 */
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
bool scr_map_get_str_f64(const ScrMap *m, const ScrStr *key, double *out) {
|
|
435
|
+
size_t e = scr_map_find_str(m, key);
|
|
436
|
+
if (e == SCR_MAP_EMPTY) return false;
|
|
437
|
+
*out = scr_map_slot_to_f64(m->entries[e].val);
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
bool scr_map_get_str_bool(const ScrMap *m, const ScrStr *key, bool *out) {
|
|
442
|
+
size_t e = scr_map_find_str(m, key);
|
|
443
|
+
if (e == SCR_MAP_EMPTY) return false;
|
|
444
|
+
*out = m->entries[e].val != 0;
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
void *scr_map_get_str_ref(const ScrMap *m, const ScrStr *key) {
|
|
449
|
+
size_t e = scr_map_find_str(m, key);
|
|
450
|
+
if (e == SCR_MAP_EMPTY) return NULL;
|
|
451
|
+
return m->val_retain(scr_map_slot_to_ptr(m->entries[e].val)); /* +1 */
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/* ── iteration primitives (the forEach desugar) ────────────────────────── */
|
|
455
|
+
|
|
456
|
+
double scr_map_iter_count(const ScrMap *m) { return (double)m->nentries; }
|
|
457
|
+
|
|
458
|
+
bool scr_map_iter_live(const ScrMap *m, double i) {
|
|
459
|
+
if (!(i >= 0) || i >= (double)m->nentries) return false;
|
|
460
|
+
return m->entries[(size_t)i].live;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
static const ScrMapEntry *scr_map_iter_at(const ScrMap *m, double i) {
|
|
464
|
+
if (!(i >= 0) || i >= (double)m->nentries || !m->entries[(size_t)i].live) {
|
|
465
|
+
fputs("scriptc: internal error: map iteration index out of range\n", stderr);
|
|
466
|
+
abort();
|
|
467
|
+
}
|
|
468
|
+
return &m->entries[(size_t)i];
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
double scr_map_iter_key_f64(const ScrMap *m, double i) {
|
|
472
|
+
return scr_map_slot_to_f64(scr_map_iter_at(m, i)->key);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
ScrStr *scr_map_iter_key_str(const ScrMap *m, double i) {
|
|
476
|
+
return scr_str_retain((ScrStr *)scr_map_slot_to_ptr(scr_map_iter_at(m, i)->key));
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
void *scr_map_iter_key_ref(const ScrMap *m, double i) {
|
|
480
|
+
return m->key_retain(scr_map_slot_to_ptr(scr_map_iter_at(m, i)->key)); /* +1 */
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
double scr_map_iter_val_f64(const ScrMap *m, double i) {
|
|
484
|
+
return scr_map_slot_to_f64(scr_map_iter_at(m, i)->val);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
bool scr_map_iter_val_bool(const ScrMap *m, double i) {
|
|
488
|
+
return scr_map_iter_at(m, i)->val != 0;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
void *scr_map_iter_val_ref(const ScrMap *m, double i) {
|
|
492
|
+
return m->val_retain(scr_map_slot_to_ptr(scr_map_iter_at(m, i)->val)); /* +1 */
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
void scr_map_iter_enter(ScrMap *m) { m->iter_depth++; }
|
|
496
|
+
|
|
497
|
+
void scr_map_iter_exit(ScrMap *m) {
|
|
498
|
+
if (m->iter_depth > 0) m->iter_depth--;
|
|
499
|
+
/* A churny callback may have left many tombstones; with no iteration
|
|
500
|
+
* active they are safe to drop now (bounds memory under forEach-heavy
|
|
501
|
+
* add/delete workloads). */
|
|
502
|
+
if (m->iter_depth == 0 && m->nlive <= m->nentries / 2 && m->nentries >= 16) {
|
|
503
|
+
scr_map_compact(m);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/* ── seeded Set construction ───────────────────────────────────────────── */
|
|
508
|
+
|
|
509
|
+
/* `new Set(values)`: add() every element of one borrowed T[] in order —
|
|
510
|
+
* duplicates overwrite the unit value in place, so first insertion
|
|
511
|
+
* position wins (SameValueZero, exactly JS). The map is a set (value kind
|
|
512
|
+
* pinned to f64, every stored value 0); elements are the set's key kind —
|
|
513
|
+
* f64 or string, matching the array's element kind. */
|
|
514
|
+
void scr_set_add_all(ScrMap *set, ScrArr *values) {
|
|
515
|
+
size_t n = values->len;
|
|
516
|
+
for (size_t i = 0; i < n; i++) {
|
|
517
|
+
if (values->elem == SCR_ELEM_STR) {
|
|
518
|
+
ScrStr *s = (ScrStr *)scr_arr_get_ref(values, (double)i); /* +1 */
|
|
519
|
+
scr_map_set_str_f64(set, s, 0); /* borrows; retains stored copy */
|
|
520
|
+
scr_str_release(s);
|
|
521
|
+
} else if (set->key_kind == SCR_MAP_KEY_REF) {
|
|
522
|
+
void *p = scr_arr_get_ref(values, (double)i); /* +1 */
|
|
523
|
+
scr_map_set_ref_f64(set, p, 0); /* borrows; retains stored copy */
|
|
524
|
+
set->key_release(p);
|
|
525
|
+
} else {
|
|
526
|
+
scr_map_set_f64_f64(set, scr_arr_get_f64(values, (double)i), 0);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/* ── JS own-key ordering over the overflow map ─────────────────────────── */
|
|
532
|
+
|
|
533
|
+
/* Canonical array index test: "0".."4294967294" — digits only, no leading
|
|
534
|
+
* zero (except "0" itself), value <= 2^32 - 2. JS orders these OWN keys
|
|
535
|
+
* first, ascending numerically, before every other string key. */
|
|
536
|
+
static bool scr_map_key_array_index(const ScrStr *k, uint32_t *out) {
|
|
537
|
+
size_t n = k->len;
|
|
538
|
+
if (n == 0 || n > 10) return false;
|
|
539
|
+
const char *s = k->data;
|
|
540
|
+
if (s[0] == '0' && n > 1) return false;
|
|
541
|
+
uint64_t v = 0;
|
|
542
|
+
for (size_t i = 0; i < n; i++) {
|
|
543
|
+
if (s[i] < '0' || s[i] > '9') return false;
|
|
544
|
+
v = v * 10 + (uint64_t)(s[i] - '0');
|
|
545
|
+
}
|
|
546
|
+
if (v > UINT64_C(4294967294)) return false;
|
|
547
|
+
*out = (uint32_t)v;
|
|
548
|
+
return true;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/* The live STRING keys of `m` in JS OWN-KEY ORDER (Object.keys over the
|
|
552
|
+
* index-signature overflow): integer-like keys (canonical array indices)
|
|
553
|
+
* first in ascending numeric order, then the rest in insertion order.
|
|
554
|
+
* Returns a fresh ScrStr* array (+1); the map is borrowed. Insertion sort
|
|
555
|
+
* over the integer-like subset — overflow maps are small, and ties are
|
|
556
|
+
* impossible (keys are unique). */
|
|
557
|
+
ScrArr *scr_map_keys_js_order(const ScrMap *m) {
|
|
558
|
+
size_t n = m->nentries;
|
|
559
|
+
ScrArr *out = scr_arr_new(SCR_ELEM_STR, m->nlive);
|
|
560
|
+
size_t nidx = 0;
|
|
561
|
+
struct { uint32_t v; ScrStr *k; } *idx = NULL;
|
|
562
|
+
for (size_t i = 0; i < n; i++) {
|
|
563
|
+
if (!m->entries[i].live) continue;
|
|
564
|
+
ScrStr *k = (ScrStr *)scr_map_slot_to_ptr(m->entries[i].key);
|
|
565
|
+
uint32_t v;
|
|
566
|
+
if (!scr_map_key_array_index(k, &v)) continue;
|
|
567
|
+
if (nidx % 16 == 0) {
|
|
568
|
+
idx = realloc(idx, (nidx + 16) * sizeof *idx);
|
|
569
|
+
if (!idx) scr_map_oom();
|
|
570
|
+
}
|
|
571
|
+
size_t j = nidx++;
|
|
572
|
+
while (j > 0 && idx[j - 1].v > v) {
|
|
573
|
+
idx[j] = idx[j - 1];
|
|
574
|
+
j--;
|
|
575
|
+
}
|
|
576
|
+
idx[j].v = v;
|
|
577
|
+
idx[j].k = k;
|
|
578
|
+
}
|
|
579
|
+
for (size_t i = 0; i < nidx; i++) {
|
|
580
|
+
scr_arr_push_ref(out, scr_str_retain(idx[i].k));
|
|
581
|
+
}
|
|
582
|
+
free(idx);
|
|
583
|
+
for (size_t i = 0; i < n; i++) {
|
|
584
|
+
if (!m->entries[i].live) continue;
|
|
585
|
+
ScrStr *k = (ScrStr *)scr_map_slot_to_ptr(m->entries[i].key);
|
|
586
|
+
uint32_t v;
|
|
587
|
+
if (scr_map_key_array_index(k, &v)) continue;
|
|
588
|
+
scr_arr_push_ref(out, scr_str_retain(k));
|
|
589
|
+
}
|
|
590
|
+
return out;
|
|
591
|
+
}
|