@scriptc/runtime 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +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 +5046 -0
- package/src/scr_stream.c +2877 -0
- package/src/scr_string.c +1264 -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
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#include "scr_runtime.h"
|
|
2
|
+
|
|
3
|
+
#include <stdio.h>
|
|
4
|
+
#include <stdlib.h>
|
|
5
|
+
#include <string.h>
|
|
6
|
+
|
|
7
|
+
#ifdef SCR_RC_AUDIT
|
|
8
|
+
static long scr_live_boxes = 0;
|
|
9
|
+
static long scr_live_closures = 0;
|
|
10
|
+
long scr_box_live_count(void) { return scr_live_boxes; }
|
|
11
|
+
long scr_closure_live_count(void) { return scr_live_closures; }
|
|
12
|
+
#endif
|
|
13
|
+
|
|
14
|
+
/* ── boxes ──────────────────────────────────────────────────────────────
|
|
15
|
+
* Every box carries a cycle header (a captured binding can hold anything,
|
|
16
|
+
* including the closure that captures it — the canonical cycle). The box's
|
|
17
|
+
* trace visits its payload when the payload type itself carries a header:
|
|
18
|
+
* closures always do; SCR_BOX_OBJ payloads iff the compiler passed a trace
|
|
19
|
+
* (obj_trace doubles as that flag); strings/scalars never. SCR_BOX_ARR
|
|
20
|
+
* holds acyclic arrays only — a CYCLE-CAPABLE array (traced ref elements)
|
|
21
|
+
* rides a SCR_BOX_OBJ box with the array's `_v` adapters + scr_arr_trace_v,
|
|
22
|
+
* so its edge stays visible to the collector. */
|
|
23
|
+
|
|
24
|
+
static void *scr_box_ptr(const ScrBox *b) {
|
|
25
|
+
void *p;
|
|
26
|
+
memcpy(&p, &b->slot, sizeof p);
|
|
27
|
+
return p;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static void scr_box_trace(void *o, ScrTraceVisit visit, void *ctx) {
|
|
31
|
+
ScrBox *b = (ScrBox *)o;
|
|
32
|
+
void *p = scr_box_ptr(b);
|
|
33
|
+
if (!p) return; /* freshly-created boxes hold NULL until first write */
|
|
34
|
+
switch (b->kind) {
|
|
35
|
+
case SCR_BOX_FUNC:
|
|
36
|
+
visit(p, ctx);
|
|
37
|
+
break;
|
|
38
|
+
case SCR_BOX_OBJ:
|
|
39
|
+
if (b->obj_trace) visit(p, ctx);
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Teardown for the collector: release exactly the payloads the trace does
|
|
47
|
+
* NOT visit (the complement — see the contract in scr_runtime.h). */
|
|
48
|
+
static void scr_box_gcfree(void *o) {
|
|
49
|
+
ScrBox *b = (ScrBox *)o;
|
|
50
|
+
void *p = scr_box_ptr(b);
|
|
51
|
+
if (p) {
|
|
52
|
+
switch (b->kind) {
|
|
53
|
+
case SCR_BOX_STR:
|
|
54
|
+
scr_str_release((ScrStr *)p);
|
|
55
|
+
break;
|
|
56
|
+
case SCR_BOX_ARR:
|
|
57
|
+
scr_arr_release((ScrArr *)p);
|
|
58
|
+
break;
|
|
59
|
+
case SCR_BOX_OBJ:
|
|
60
|
+
if (!b->obj_trace) b->obj_release(p);
|
|
61
|
+
break;
|
|
62
|
+
default: /* FUNC is traced; scalars own nothing */
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
#ifdef SCR_RC_AUDIT
|
|
67
|
+
scr_live_boxes--;
|
|
68
|
+
#endif
|
|
69
|
+
scr_cyc_free(b);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
ScrBox *scr_box_new(ScrBoxKind kind) {
|
|
73
|
+
ScrBox *b = scr_cyc_alloc(sizeof(ScrBox), &scr_box_trace, &scr_box_gcfree);
|
|
74
|
+
b->rc = 1;
|
|
75
|
+
b->kind = kind;
|
|
76
|
+
#ifdef SCR_RC_AUDIT
|
|
77
|
+
scr_live_boxes++;
|
|
78
|
+
#endif
|
|
79
|
+
return b;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
ScrBox *scr_box_new_obj(void *(*retain)(void *), void (*release)(void *),
|
|
83
|
+
ScrTraceFn trace) {
|
|
84
|
+
ScrBox *b = scr_box_new(SCR_BOX_OBJ);
|
|
85
|
+
b->obj_retain = retain;
|
|
86
|
+
b->obj_release = release;
|
|
87
|
+
b->obj_trace = trace;
|
|
88
|
+
return b;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Release one payload pointer by the box's kind. Factored so set_ref can
|
|
92
|
+
* release the value it REPLACED after the slot is already overwritten
|
|
93
|
+
* (mutators must unlink before releasing — see scr_cycle.c). */
|
|
94
|
+
static void scr_box_release_payload(ScrBox *b, void *p) {
|
|
95
|
+
if (!p) return;
|
|
96
|
+
switch (b->kind) {
|
|
97
|
+
case SCR_BOX_STR:
|
|
98
|
+
scr_str_release((ScrStr *)p);
|
|
99
|
+
break;
|
|
100
|
+
case SCR_BOX_ARR:
|
|
101
|
+
scr_arr_release((ScrArr *)p);
|
|
102
|
+
break;
|
|
103
|
+
case SCR_BOX_FUNC:
|
|
104
|
+
scr_closure_release((ScrClosure *)p);
|
|
105
|
+
break;
|
|
106
|
+
case SCR_BOX_OBJ:
|
|
107
|
+
b->obj_release(p);
|
|
108
|
+
break;
|
|
109
|
+
case SCR_BOX_F64:
|
|
110
|
+
case SCR_BOX_BOOL:
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
void scr_box_release(ScrBox *b) {
|
|
116
|
+
if (!b || b->rc == SIZE_MAX) return; /* NULL: a switch jumped past the decl */
|
|
117
|
+
if (--b->rc == 0) {
|
|
118
|
+
scr_cyc_on_dead(b);
|
|
119
|
+
scr_box_release_payload(b, scr_box_ptr(b));
|
|
120
|
+
#ifdef SCR_RC_AUDIT
|
|
121
|
+
scr_live_boxes--;
|
|
122
|
+
#endif
|
|
123
|
+
scr_cyc_free(b);
|
|
124
|
+
} else {
|
|
125
|
+
scr_cyc_on_release(b); /* possible cycle root; may collect — b is done */
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
double scr_box_get_f64(ScrBox *b) {
|
|
130
|
+
double v;
|
|
131
|
+
memcpy(&v, &b->slot, sizeof v);
|
|
132
|
+
return v;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
bool scr_box_get_bool(ScrBox *b) { return b->slot != 0; }
|
|
136
|
+
|
|
137
|
+
void *scr_box_get_ref(ScrBox *b) {
|
|
138
|
+
void *p = scr_box_ptr(b);
|
|
139
|
+
switch (b->kind) {
|
|
140
|
+
case SCR_BOX_STR:
|
|
141
|
+
return scr_str_retain((ScrStr *)p);
|
|
142
|
+
case SCR_BOX_ARR:
|
|
143
|
+
return scr_arr_retain((ScrArr *)p);
|
|
144
|
+
case SCR_BOX_FUNC:
|
|
145
|
+
return scr_closure_retain((ScrClosure *)p);
|
|
146
|
+
case SCR_BOX_OBJ:
|
|
147
|
+
return b->obj_retain(p);
|
|
148
|
+
default:
|
|
149
|
+
fputs("scriptc: internal error: box_get_ref on a scalar box\n", stderr);
|
|
150
|
+
abort();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
void scr_box_set_f64(ScrBox *b, double v) { memcpy(&b->slot, &v, sizeof v); }
|
|
155
|
+
|
|
156
|
+
void scr_box_set_bool(ScrBox *b, bool v) { b->slot = v ? 1 : 0; }
|
|
157
|
+
|
|
158
|
+
void scr_box_set_ref(ScrBox *b, void *v) {
|
|
159
|
+
/* Unlink-then-release: the slot must already hold the new value when the
|
|
160
|
+
* old one's release runs (it can trigger a collection, which must not
|
|
161
|
+
* walk the b→old edge whose count was just given up). */
|
|
162
|
+
void *old = scr_box_ptr(b);
|
|
163
|
+
memcpy(&b->slot, &v, sizeof v);
|
|
164
|
+
scr_box_release_payload(b, old);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* ── closures ─────────────────────────────────────────────────────────── */
|
|
168
|
+
|
|
169
|
+
static void scr_closure_trace(void *o, ScrTraceVisit visit, void *ctx) {
|
|
170
|
+
ScrClosure *c = (ScrClosure *)o;
|
|
171
|
+
for (size_t i = 0; i < c->ncaps; i++) visit(c->caps[i], ctx);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
static void scr_closure_gcfree(void *o) {
|
|
175
|
+
/* Caps are all boxes — all traced. The own-property table (props) is
|
|
176
|
+
* an untraced box: released here like any external owned edge. */
|
|
177
|
+
scr_box_release(((ScrClosure *)o)->props);
|
|
178
|
+
#ifdef SCR_RC_AUDIT
|
|
179
|
+
scr_live_closures--;
|
|
180
|
+
#endif
|
|
181
|
+
scr_cyc_free(o);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
ScrClosure *scr_closure_new(void *fn, size_t ncaps) {
|
|
185
|
+
ScrClosure *c = scr_cyc_alloc(sizeof(ScrClosure) + ncaps * sizeof(ScrBox *),
|
|
186
|
+
&scr_closure_trace, &scr_closure_gcfree);
|
|
187
|
+
c->rc = 1;
|
|
188
|
+
c->fn = fn;
|
|
189
|
+
c->ncaps = ncaps;
|
|
190
|
+
c->props = NULL; /* lazily allocated by Object.defineProperties */
|
|
191
|
+
#ifdef SCR_RC_AUDIT
|
|
192
|
+
scr_live_closures++;
|
|
193
|
+
#endif
|
|
194
|
+
return c;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
void scr_closure_release(ScrClosure *c) {
|
|
198
|
+
if (!c || c->rc == SIZE_MAX) return; /* NULL: an uninitialized `let` local */
|
|
199
|
+
if (--c->rc == 0) {
|
|
200
|
+
scr_cyc_on_dead(c);
|
|
201
|
+
for (size_t i = 0; i < c->ncaps; i++) scr_box_release(c->caps[i]);
|
|
202
|
+
scr_box_release(c->props); /* NULL-tolerant */
|
|
203
|
+
#ifdef SCR_RC_AUDIT
|
|
204
|
+
scr_live_closures--;
|
|
205
|
+
#endif
|
|
206
|
+
scr_cyc_free(c);
|
|
207
|
+
} else {
|
|
208
|
+
scr_cyc_on_release(c); /* possible cycle root; may collect — c is done */
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
void scr_closure_trace_v(void *c, ScrTraceVisit visit, void *ctx) {
|
|
213
|
+
scr_closure_trace(c, visit, ctx);
|
|
214
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#include "scr_runtime.h"
|
|
2
|
+
|
|
3
|
+
#include <math.h>
|
|
4
|
+
#include <stdio.h>
|
|
5
|
+
#include <stdlib.h>
|
|
6
|
+
#ifdef _WIN32
|
|
7
|
+
#include <fcntl.h> /* _O_BINARY */
|
|
8
|
+
#include <io.h> /* _setmode, _fileno */
|
|
9
|
+
#endif
|
|
10
|
+
|
|
11
|
+
/* Set by scr_async.c at loop exhaustion; lives here (unconditionally) so
|
|
12
|
+
* binaries that link the console without the async runtime still link, and
|
|
13
|
+
* plain builds satisfy scr_async's reference. */
|
|
14
|
+
static long scr_abandoned_fibers = 0;
|
|
15
|
+
void scr_note_abandoned_fibers(long n) { scr_abandoned_fibers = n; }
|
|
16
|
+
|
|
17
|
+
#ifdef SCR_RC_AUDIT
|
|
18
|
+
extern long scr_str_live_count(void); /* scr_string.c */
|
|
19
|
+
extern long scr_arr_live_count(void); /* scr_array.c */
|
|
20
|
+
extern long scr_map_live_count(void); /* scr_map.c */
|
|
21
|
+
extern long scr_box_live_count(void); /* scr_closure.c */
|
|
22
|
+
extern long scr_closure_live_count(void); /* scr_closure.c */
|
|
23
|
+
extern long scr_obj_live_count(void); /* scr_object.c */
|
|
24
|
+
extern long scr_union_live_count(void); /* scr_union.c */
|
|
25
|
+
extern long scr_dyn_live_count(void); /* scr_json.c */
|
|
26
|
+
extern long scr_bytes_live_count(void); /* scr_bytes.c */
|
|
27
|
+
#ifdef SCR_DYNAMIC
|
|
28
|
+
extern long scr_jsval_live_count(void); /* scr_island.c */
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
static void scr_rc_audit_at_exit(void) {
|
|
32
|
+
/* Fibers suspended forever at loop exhaustion (awaits nobody resolves —
|
|
33
|
+
* Node exits 0 there too) still hold their stacks and owned values by
|
|
34
|
+
* design; a strict audit would only report that deliberate abandonment. */
|
|
35
|
+
if (scr_abandoned_fibers > 0) {
|
|
36
|
+
fprintf(stderr, "scriptc RC audit skipped: %ld fiber(s) never resumed\n",
|
|
37
|
+
scr_abandoned_fibers);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
long strings = scr_str_live_count();
|
|
41
|
+
long arrays = scr_arr_live_count();
|
|
42
|
+
long maps = scr_map_live_count();
|
|
43
|
+
long boxes = scr_box_live_count();
|
|
44
|
+
long closures = scr_closure_live_count();
|
|
45
|
+
long objects = scr_obj_live_count();
|
|
46
|
+
long unions = scr_union_live_count();
|
|
47
|
+
long dyns = scr_dyn_live_count();
|
|
48
|
+
long bytes = scr_bytes_live_count();
|
|
49
|
+
#ifdef SCR_DYNAMIC
|
|
50
|
+
long jsvals = scr_jsval_live_count();
|
|
51
|
+
#else
|
|
52
|
+
long jsvals = 0;
|
|
53
|
+
#endif
|
|
54
|
+
if (strings != 0 || arrays != 0 || maps != 0 || boxes != 0 || closures != 0 ||
|
|
55
|
+
objects != 0 || unions != 0 || dyns != 0 || bytes != 0 || jsvals != 0) {
|
|
56
|
+
fflush(stdout);
|
|
57
|
+
fprintf(stderr,
|
|
58
|
+
"scriptc RC AUDIT FAILED: %ld heap string(s), %ld array(s), "
|
|
59
|
+
"%ld map(s), %ld box(es), %ld closure(s), %ld object(s), "
|
|
60
|
+
"%ld union(s), %ld dyn value(s), %ld bytes value(s), "
|
|
61
|
+
"%ld island value(s) live at exit\n",
|
|
62
|
+
strings, arrays, maps, boxes, closures, objects, unions, dyns,
|
|
63
|
+
bytes, jsvals);
|
|
64
|
+
_Exit(99);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
#endif
|
|
68
|
+
|
|
69
|
+
static void scr_flush_at_exit(void) { fflush(stdout); }
|
|
70
|
+
|
|
71
|
+
static void scr_collect_cycles_at_exit(void) { scr_collect_cycles(); }
|
|
72
|
+
|
|
73
|
+
void scr_init(void) {
|
|
74
|
+
#ifdef _WIN32
|
|
75
|
+
/* The CRT opens std streams in TEXT mode, which writes \n as \r\n. Node
|
|
76
|
+
* on Windows does NOT translate — console.log emits \n whether stdout is
|
|
77
|
+
* a pipe or the console (libuv writes the bytes as given) — so the
|
|
78
|
+
* streams switch to binary here or every line would differ from the
|
|
79
|
+
* oracle by a byte. stdin too: readFileSync(0) must see the bytes on the
|
|
80
|
+
* pipe, not a CRLF-collapsed view. */
|
|
81
|
+
_setmode(_fileno(stdout), _O_BINARY);
|
|
82
|
+
_setmode(_fileno(stderr), _O_BINARY);
|
|
83
|
+
_setmode(_fileno(stdin), _O_BINARY);
|
|
84
|
+
#endif
|
|
85
|
+
/* Full buffering matches Node writing to a pipe (the differential harness
|
|
86
|
+
* never runs either side on a TTY) and makes output-heavy programs fast. */
|
|
87
|
+
static char outbuf[1 << 16];
|
|
88
|
+
setvbuf(stdout, outbuf, _IOFBF, sizeof outbuf);
|
|
89
|
+
/* atexit is LIFO; registration order makes exit run: library cleanup
|
|
90
|
+
* (registered later, in scr_lib_init) → cycle collection → RC audit →
|
|
91
|
+
* flush. The final collection frees cycles the program dropped, so the
|
|
92
|
+
* audit (and ASan's leak check) see them as freed, not leaked. */
|
|
93
|
+
atexit(scr_flush_at_exit);
|
|
94
|
+
#ifdef SCR_RC_AUDIT
|
|
95
|
+
atexit(scr_rc_audit_at_exit);
|
|
96
|
+
#endif
|
|
97
|
+
atexit(scr_collect_cycles_at_exit);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* ONE formatter for both console streams — console.error/warn print
|
|
101
|
+
* byte-identically to console.log in Node (same inspect rendering), only
|
|
102
|
+
* the stream differs. */
|
|
103
|
+
static void scr_console_write(FILE *out, size_t n, const ScrLogArg *args) {
|
|
104
|
+
char numbuf[32];
|
|
105
|
+
for (size_t i = 0; i < n; i++) {
|
|
106
|
+
if (i > 0) fputc(' ', out);
|
|
107
|
+
const ScrLogArg *a = &args[i];
|
|
108
|
+
switch (a->tag) {
|
|
109
|
+
case SCR_ARG_F64: {
|
|
110
|
+
/* console.log renders numbers via inspect, which distinguishes -0
|
|
111
|
+
* (String(-0) is "0", but console.log(-0) prints "-0"). */
|
|
112
|
+
if (a->v.f == 0 && signbit(a->v.f)) {
|
|
113
|
+
fputs("-0", out);
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
size_t len = scr_f64_to_str(a->v.f, numbuf);
|
|
117
|
+
fwrite(numbuf, 1, len, out);
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case SCR_ARG_STR:
|
|
121
|
+
fwrite(a->v.s->data, 1, a->v.s->len, out);
|
|
122
|
+
break;
|
|
123
|
+
case SCR_ARG_BOOL:
|
|
124
|
+
fputs(a->v.b ? "true" : "false", out);
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
fputc('\n', out);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
void scr_console_log(size_t n, const ScrLogArg *args) {
|
|
132
|
+
scr_console_write(stdout, n, args);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* console.error and console.warn. stderr is UNBUFFERED (C's default; Node
|
|
136
|
+
* writes stderr synchronously too), and stdout FLUSHES first so a merged
|
|
137
|
+
* redirection (2>&1) sees writes in source order despite stdout's full
|
|
138
|
+
* buffering — Node's piped stdout/stderr preserve write order the same
|
|
139
|
+
* way. */
|
|
140
|
+
void scr_console_error(size_t n, const ScrLogArg *args) {
|
|
141
|
+
fflush(stdout);
|
|
142
|
+
scr_console_write(stderr, n, args);
|
|
143
|
+
}
|
package/src/scr_cycle.c
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/* Reference-cycle collector: synchronous Bacon–Rajan trial deletion (see
|
|
2
|
+
* "Concurrent Cycle Collection in Reference Counted Systems", the
|
|
3
|
+
* synchronous algorithm) over cycle-headered objects only — the object
|
|
4
|
+
* model and the trace/teardown contract live in scr_runtime.h.
|
|
5
|
+
*
|
|
6
|
+
* Life of a candidate: a release that leaves rc > 0 buffers the object
|
|
7
|
+
* (purple). Collection walks the buffer in three phases over the graph
|
|
8
|
+
* reachable from it:
|
|
9
|
+
* markGray trial-delete: decrement rc once per internal edge;
|
|
10
|
+
* scan nodes still rc > 0 are externally referenced — re-blacken
|
|
11
|
+
* their subgraph and restore the trial decrements;
|
|
12
|
+
* collectWhite everything left white is a dead cycle: free it, releasing
|
|
13
|
+
* only edges that LEAVE the white set (each member's
|
|
14
|
+
* teardown releases its untraced children; traced edges were
|
|
15
|
+
* already accounted by markGray).
|
|
16
|
+
* The white set is gathered first and freed after the walk — freeing
|
|
17
|
+
* during the walk would leave dangling sibling edges for later visits.
|
|
18
|
+
*
|
|
19
|
+
* Correctness leans on two global invariants (docs/memory.md):
|
|
20
|
+
* - every strong reference is counted: stacks, locals, and runtime-owned
|
|
21
|
+
* buffers (timer callbacks, unhandled-rejection tracking) all hold +1,
|
|
22
|
+
* so trial deletion can never free something a root still reaches;
|
|
23
|
+
* - mutators unlink before they release: a heap object's stored pointer is
|
|
24
|
+
* overwritten BEFORE the old value's release runs, so a threshold
|
|
25
|
+
* collection triggered inside that release never sees an edge whose
|
|
26
|
+
* count was already given up (which would over-decrement and free live
|
|
27
|
+
* data).
|
|
28
|
+
*
|
|
29
|
+
* Recursion depth equals the traced structure's depth — same property as
|
|
30
|
+
* the existing recursive releases (deep lists recurse deeply; acceptable
|
|
31
|
+
* for now, revisit with an explicit stack if it ever traps).
|
|
32
|
+
*/
|
|
33
|
+
#include "scr_runtime.h"
|
|
34
|
+
|
|
35
|
+
#include <stdio.h>
|
|
36
|
+
#include <stdlib.h>
|
|
37
|
+
|
|
38
|
+
/* Every heap object's first member is `size_t rc`. */
|
|
39
|
+
#define SCR_RC(obj) (*(size_t *)(obj))
|
|
40
|
+
|
|
41
|
+
static void scr_cyc_oom(void) {
|
|
42
|
+
fputs("scriptc: out of memory\n", stderr);
|
|
43
|
+
abort();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
void *scr_cyc_alloc(size_t size, ScrTraceFn trace, ScrCycFreeFn free_fn) {
|
|
47
|
+
ScrCycHdr *h = calloc(1, sizeof(ScrCycHdr) + size);
|
|
48
|
+
if (!h) scr_cyc_oom();
|
|
49
|
+
h->trace = trace;
|
|
50
|
+
h->free_fn = free_fn;
|
|
51
|
+
h->color = SCR_CYC_BLACK;
|
|
52
|
+
return h + 1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
void scr_cyc_free(void *obj) { free(scr_cyc_hdr(obj)); }
|
|
56
|
+
|
|
57
|
+
/* ── the candidate-root buffer ────────────────────────────────────────── */
|
|
58
|
+
|
|
59
|
+
static void **scr_roots = NULL;
|
|
60
|
+
static size_t scr_nroots = 0, scr_roots_cap = 0;
|
|
61
|
+
static bool scr_collecting = false;
|
|
62
|
+
|
|
63
|
+
static size_t scr_cyc_threshold(void) {
|
|
64
|
+
static size_t cached = 0;
|
|
65
|
+
if (cached == 0) {
|
|
66
|
+
const char *env = getenv("SCR_CYCLE_THRESHOLD");
|
|
67
|
+
long v = env ? strtol(env, NULL, 10) : 0;
|
|
68
|
+
cached = v > 0 ? (size_t)v : 256;
|
|
69
|
+
}
|
|
70
|
+
return cached;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
void scr_cyc_on_dead(void *obj) {
|
|
74
|
+
ScrCycHdr *h = scr_cyc_hdr(obj);
|
|
75
|
+
if (!h->buffered) return;
|
|
76
|
+
/* O(1) removal: swap the last entry into the hole. */
|
|
77
|
+
size_t i = h->buf_index;
|
|
78
|
+
void *last = scr_roots[--scr_nroots];
|
|
79
|
+
scr_roots[i] = last;
|
|
80
|
+
if (last != obj) scr_cyc_hdr(last)->buf_index = i;
|
|
81
|
+
h->buffered = 0;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void scr_cyc_on_release(void *obj) {
|
|
85
|
+
ScrCycHdr *h = scr_cyc_hdr(obj);
|
|
86
|
+
h->color = SCR_CYC_PURPLE;
|
|
87
|
+
if (!h->buffered) {
|
|
88
|
+
if (scr_nroots == scr_roots_cap) {
|
|
89
|
+
scr_roots_cap = scr_roots_cap ? scr_roots_cap * 2 : 64;
|
|
90
|
+
scr_roots = realloc(scr_roots, scr_roots_cap * sizeof *scr_roots);
|
|
91
|
+
if (!scr_roots) scr_cyc_oom();
|
|
92
|
+
}
|
|
93
|
+
h->buffered = 1;
|
|
94
|
+
h->buf_index = scr_nroots;
|
|
95
|
+
scr_roots[scr_nroots++] = obj;
|
|
96
|
+
}
|
|
97
|
+
/* Threshold trigger. Never re-entered: a teardown's releases of untraced
|
|
98
|
+
* children can buffer new candidates mid-collection, but they only wait
|
|
99
|
+
* for the next pass. */
|
|
100
|
+
if (!scr_collecting && scr_nroots >= scr_cyc_threshold()) {
|
|
101
|
+
scr_collect_cycles();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* ── trial deletion ───────────────────────────────────────────────────── */
|
|
106
|
+
|
|
107
|
+
/* Child filter shared by every phase: nothing to do for NULL (unassigned
|
|
108
|
+
* slots) or immortal (interned statics have no header at all). */
|
|
109
|
+
#define SCR_CYC_SKIP(child) ((child) == NULL || SCR_RC(child) == SIZE_MAX)
|
|
110
|
+
|
|
111
|
+
static void scr_mark_gray(void *obj);
|
|
112
|
+
static void scr_mg_visit(void *child, void *ctx) {
|
|
113
|
+
(void)ctx;
|
|
114
|
+
if (SCR_CYC_SKIP(child)) return;
|
|
115
|
+
SCR_RC(child) -= 1; /* trial-delete this internal edge */
|
|
116
|
+
scr_mark_gray(child);
|
|
117
|
+
}
|
|
118
|
+
static void scr_mark_gray(void *obj) {
|
|
119
|
+
ScrCycHdr *h = scr_cyc_hdr(obj);
|
|
120
|
+
if (h->color == SCR_CYC_GRAY) return;
|
|
121
|
+
h->color = SCR_CYC_GRAY;
|
|
122
|
+
h->trace(obj, scr_mg_visit, NULL);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static void scr_scan_black(void *obj);
|
|
126
|
+
static void scr_sb_visit(void *child, void *ctx) {
|
|
127
|
+
(void)ctx;
|
|
128
|
+
if (SCR_CYC_SKIP(child)) return;
|
|
129
|
+
SCR_RC(child) += 1; /* restore the trial decrement */
|
|
130
|
+
if (scr_cyc_hdr(child)->color != SCR_CYC_BLACK) scr_scan_black(child);
|
|
131
|
+
}
|
|
132
|
+
static void scr_scan_black(void *obj) {
|
|
133
|
+
scr_cyc_hdr(obj)->color = SCR_CYC_BLACK;
|
|
134
|
+
scr_cyc_hdr(obj)->trace(obj, scr_sb_visit, NULL);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
static void scr_scan(void *obj);
|
|
138
|
+
static void scr_scan_visit(void *child, void *ctx) {
|
|
139
|
+
(void)ctx;
|
|
140
|
+
if (SCR_CYC_SKIP(child)) return;
|
|
141
|
+
scr_scan(child);
|
|
142
|
+
}
|
|
143
|
+
static void scr_scan(void *obj) {
|
|
144
|
+
ScrCycHdr *h = scr_cyc_hdr(obj);
|
|
145
|
+
if (h->color != SCR_CYC_GRAY) return;
|
|
146
|
+
if (SCR_RC(obj) > 0) {
|
|
147
|
+
/* Externally referenced: this whole subgraph stays. */
|
|
148
|
+
scr_scan_black(obj);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
h->color = SCR_CYC_WHITE;
|
|
152
|
+
h->trace(obj, scr_scan_visit, NULL);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* The gathered white set (freed after the walk completes). */
|
|
156
|
+
static void **scr_white = NULL;
|
|
157
|
+
static size_t scr_nwhite = 0, scr_white_cap = 0;
|
|
158
|
+
|
|
159
|
+
static void scr_collect_white(void *obj);
|
|
160
|
+
static void scr_cw_visit(void *child, void *ctx) {
|
|
161
|
+
(void)ctx;
|
|
162
|
+
if (SCR_CYC_SKIP(child)) return;
|
|
163
|
+
scr_collect_white(child);
|
|
164
|
+
}
|
|
165
|
+
static void scr_collect_white(void *obj) {
|
|
166
|
+
ScrCycHdr *h = scr_cyc_hdr(obj);
|
|
167
|
+
if (h->color != SCR_CYC_WHITE || h->buffered) return;
|
|
168
|
+
h->color = SCR_CYC_BLACK; /* visited marker — prevents re-gathering */
|
|
169
|
+
h->trace(obj, scr_cw_visit, NULL);
|
|
170
|
+
if (scr_nwhite == scr_white_cap) {
|
|
171
|
+
scr_white_cap = scr_white_cap ? scr_white_cap * 2 : 64;
|
|
172
|
+
scr_white = realloc(scr_white, scr_white_cap * sizeof *scr_white);
|
|
173
|
+
if (!scr_white) scr_cyc_oom();
|
|
174
|
+
}
|
|
175
|
+
scr_white[scr_nwhite++] = obj;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
void scr_collect_cycles(void) {
|
|
179
|
+
if (scr_collecting || scr_nroots == 0) return;
|
|
180
|
+
scr_collecting = true;
|
|
181
|
+
|
|
182
|
+
/* markRoots: keep live candidates (still purple), drop the rest — an
|
|
183
|
+
* object re-retained since buffering is black; one grayed by an earlier
|
|
184
|
+
* candidate's walk is already covered by that candidate's subgraph. */
|
|
185
|
+
size_t out = 0;
|
|
186
|
+
for (size_t i = 0; i < scr_nroots; i++) {
|
|
187
|
+
void *obj = scr_roots[i];
|
|
188
|
+
ScrCycHdr *h = scr_cyc_hdr(obj);
|
|
189
|
+
if (h->color == SCR_CYC_PURPLE) {
|
|
190
|
+
scr_mark_gray(obj);
|
|
191
|
+
h->buf_index = out;
|
|
192
|
+
scr_roots[out++] = obj;
|
|
193
|
+
} else {
|
|
194
|
+
h->buffered = 0;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
scr_nroots = out;
|
|
198
|
+
|
|
199
|
+
for (size_t i = 0; i < scr_nroots; i++) scr_scan(scr_roots[i]);
|
|
200
|
+
|
|
201
|
+
/* collectWhite over a drained buffer: clear every buffered flag first so
|
|
202
|
+
* the recursion can gather buffered members of an earlier root's cycle. */
|
|
203
|
+
size_t n = scr_nroots;
|
|
204
|
+
scr_nroots = 0;
|
|
205
|
+
for (size_t i = 0; i < n; i++) scr_cyc_hdr(scr_roots[i])->buffered = 0;
|
|
206
|
+
scr_nwhite = 0;
|
|
207
|
+
for (size_t i = 0; i < n; i++) scr_collect_white(scr_roots[i]);
|
|
208
|
+
/* Teardowns run after the full walk. They may release untraced children
|
|
209
|
+
* (plain RC) — which can re-buffer survivors for the NEXT pass — but
|
|
210
|
+
* never touch traced (white, already-accounted) edges. */
|
|
211
|
+
for (size_t i = 0; i < scr_nwhite; i++) {
|
|
212
|
+
void *obj = scr_white[i];
|
|
213
|
+
scr_cyc_hdr(obj)->free_fn(obj);
|
|
214
|
+
}
|
|
215
|
+
scr_nwhite = 0;
|
|
216
|
+
|
|
217
|
+
scr_collecting = false;
|
|
218
|
+
}
|