@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,699 @@
|
|
|
1
|
+
/* The node:events EventEmitter — the runtime-provided BASE CLASS behind
|
|
2
|
+
* `new EventEmitter()` and `class My extends EventEmitter` (the ScrError
|
|
3
|
+
* precedent: ScrEmitter lays out exactly like a compiler-emitted hierarchy
|
|
4
|
+
* class — rc, vt, then the prefix fields — so user subclasses embed it and
|
|
5
|
+
* every vtable mechanism applies unchanged). This translation unit links
|
|
6
|
+
* ONLY into binaries whose IR touches the emitter surface
|
|
7
|
+
* (moduleUsesEmitter — the scr_events.c gating precedent); emitter-free
|
|
8
|
+
* binaries keep their exact link line. Pure data structure: no event loop,
|
|
9
|
+
* no poller — emits are synchronous calls on the caller's stack, exactly
|
|
10
|
+
* Node's contract.
|
|
11
|
+
*
|
|
12
|
+
* Listener lists are name-keyed buckets in first-registration order
|
|
13
|
+
* (eventNames order; a bucket emptied by removal DROPS, and a later add
|
|
14
|
+
* re-appends — Node deletes the _events key the same way). Entries are
|
|
15
|
+
* small shared heap nodes so an emit's SNAPSHOT and the live list agree on
|
|
16
|
+
* the once-fired flag: Node emits over a copy (a listener removed
|
|
17
|
+
* mid-emit still runs for that emit; one added waits), and a once wrapper
|
|
18
|
+
* skips only when it already FIRED — mid-emit removal of a not-yet-run
|
|
19
|
+
* once listener does not skip it, matching the wrapper's `fired` check.
|
|
20
|
+
*
|
|
21
|
+
* Dispatch is C-variadic: the emit call site passes the event tuple as
|
|
22
|
+
* typed C values, and each listener invokes through a compiler-EMITTED
|
|
23
|
+
* adapter `void inv(ScrClosure *cb, va_list ap)` that va_args exactly the
|
|
24
|
+
* listener's own parameter prefix, retains the +1 the callee owns per the
|
|
25
|
+
* universal convention, and calls cb->fn. The frontend's per-event tuple
|
|
26
|
+
* unification is what makes every adapter's reads agree with every emit
|
|
27
|
+
* site's writes. Internal (meta-event) emits reuse the same variadic
|
|
28
|
+
* entry, passing the event NAME as the one argument — meta listeners are
|
|
29
|
+
* fenced to arity <= 1, so no adapter ever reads the listener argument
|
|
30
|
+
* Node would pass second.
|
|
31
|
+
*
|
|
32
|
+
* The special 'error' event routes through scr_emitter_emit_error: with no
|
|
33
|
+
* 'error' listener the Error payload THROWS through the exception cell
|
|
34
|
+
* (catchable; uncaught exits 1), Node's unhandled-'error' contract.
|
|
35
|
+
*
|
|
36
|
+
* The maxListeners leak warning prints Node's message shape on stderr,
|
|
37
|
+
* once per (emitter, event name), plus the once-per-process
|
|
38
|
+
* --trace-warnings hint line. Documented divergences: the pid in
|
|
39
|
+
* "(node:pid)" is this process's (it can never equal the oracle's), and
|
|
40
|
+
* the warning prints synchronously at the add (Node defers it a tick). */
|
|
41
|
+
#include "scr_runtime.h"
|
|
42
|
+
|
|
43
|
+
#include <stdarg.h>
|
|
44
|
+
#include <stdio.h>
|
|
45
|
+
#include <stdlib.h>
|
|
46
|
+
#include <string.h>
|
|
47
|
+
|
|
48
|
+
#ifdef _WIN32
|
|
49
|
+
#include <process.h>
|
|
50
|
+
#define SCR_EE_PID() ((long)_getpid())
|
|
51
|
+
#else
|
|
52
|
+
#include <unistd.h>
|
|
53
|
+
#define SCR_EE_PID() ((long)getpid())
|
|
54
|
+
#endif
|
|
55
|
+
|
|
56
|
+
static void scr_ee_oom(void) {
|
|
57
|
+
fputs("scriptc: out of memory\n", stderr);
|
|
58
|
+
abort();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* One registered listener. Shared between the live list and emit
|
|
62
|
+
* snapshots via `refs` (never the closure's own rc: the node owns ONE cb
|
|
63
|
+
* reference, released when the last holder lets go). */
|
|
64
|
+
typedef struct ScrEeEntry {
|
|
65
|
+
ScrClosure *cb; /* owned by the node — what emit INVOKES */
|
|
66
|
+
/* NULL for direct registrations. A dyn-adapted registration (the JS
|
|
67
|
+
* lane's checked-dynamic listeners) invokes through a compiler-built
|
|
68
|
+
* adapter closure (cb) but keeps the ORIGINAL function here (owned):
|
|
69
|
+
* removeListener/off match it, listenerCount(name, fn) counts it, and
|
|
70
|
+
* listeners()/rawListeners() answer it — Node's identity semantics. */
|
|
71
|
+
ScrClosure *orig;
|
|
72
|
+
ScrEeInvoke inv;
|
|
73
|
+
bool once;
|
|
74
|
+
bool fired; /* a once entry that already ran (snapshot skip rule) */
|
|
75
|
+
uint32_t refs;
|
|
76
|
+
} ScrEeEntry;
|
|
77
|
+
|
|
78
|
+
typedef struct ScrEeBucket {
|
|
79
|
+
ScrStr *name; /* owned */
|
|
80
|
+
ScrEeEntry **ls;
|
|
81
|
+
size_t n, cap;
|
|
82
|
+
bool warned; /* leak warning printed for this name already */
|
|
83
|
+
struct ScrEeBucket *next;
|
|
84
|
+
} ScrEeBucket;
|
|
85
|
+
|
|
86
|
+
struct ScrEeReg {
|
|
87
|
+
ScrEeBucket *head; /* singly linked, first-registration order */
|
|
88
|
+
double max; /* -1 = unset (follows the default), 0 = unlimited */
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/* The vtable of BARE `new EventEmitter()` instances; the emitted main()
|
|
92
|
+
* stamps pre/post from the program's preorder numbering (the
|
|
93
|
+
* scr_error_vts precedent). release is the direct teardown below. */
|
|
94
|
+
static void scr_emitter_release_direct(void *obj);
|
|
95
|
+
ScrVt scr_emitter_vt = {0, 0, &scr_emitter_release_direct};
|
|
96
|
+
|
|
97
|
+
double scr_emitter_default_max = 10; /* EventEmitter.defaultMaxListeners */
|
|
98
|
+
|
|
99
|
+
static bool scr_ee_trace_hint_shown = false;
|
|
100
|
+
|
|
101
|
+
/* Post-registration hook (scr_runtime.h): the stream unit's flow kick.
|
|
102
|
+
* NULL in stream-free builds — behavior byte-identical. */
|
|
103
|
+
void (*scr_emitter_on_hook)(ScrEmitter *em, ScrStr *name) = NULL;
|
|
104
|
+
|
|
105
|
+
/* ── entries and buckets ──────────────────────────────────────────────── */
|
|
106
|
+
|
|
107
|
+
static void scr_ee_entry_unref(ScrEeEntry *e) {
|
|
108
|
+
if (--e->refs > 0) return;
|
|
109
|
+
scr_closure_release(e->cb);
|
|
110
|
+
scr_closure_release(e->orig); /* NULL-tolerant */
|
|
111
|
+
free(e);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* The entry's IDENTITY closure — what Node would see as the listener. */
|
|
115
|
+
static ScrClosure *scr_ee_entry_fn(const ScrEeEntry *e) {
|
|
116
|
+
return e->orig ? e->orig : e->cb;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
static ScrEeReg *scr_ee_reg_ensure(ScrEmitter *em) {
|
|
120
|
+
if (!em->reg) {
|
|
121
|
+
em->reg = calloc(1, sizeof *em->reg);
|
|
122
|
+
if (!em->reg) scr_ee_oom();
|
|
123
|
+
em->reg->max = -1;
|
|
124
|
+
}
|
|
125
|
+
return em->reg;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static ScrEeBucket *scr_ee_bucket_find(ScrEeReg *reg, const char *name, size_t len) {
|
|
129
|
+
if (!reg) return NULL;
|
|
130
|
+
for (ScrEeBucket *b = reg->head; b; b = b->next) {
|
|
131
|
+
if (b->name->len == len && memcmp(b->name->data, name, len) == 0) return b;
|
|
132
|
+
}
|
|
133
|
+
return NULL;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
static ScrEeBucket *scr_ee_bucket_ensure(ScrEeReg *reg, ScrStr *name) {
|
|
137
|
+
ScrEeBucket *b = scr_ee_bucket_find(reg, name->data, name->len);
|
|
138
|
+
if (b) return b;
|
|
139
|
+
b = calloc(1, sizeof *b);
|
|
140
|
+
if (!b) scr_ee_oom();
|
|
141
|
+
b->name = scr_str_retain(name);
|
|
142
|
+
/* Append: bucket order IS eventNames() order. */
|
|
143
|
+
ScrEeBucket **link = ®->head;
|
|
144
|
+
while (*link) link = &(*link)->next;
|
|
145
|
+
*link = b;
|
|
146
|
+
return b;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Drops an emptied bucket from the list (Node deletes the _events key; a
|
|
150
|
+
* later add re-appends at the end). */
|
|
151
|
+
static void scr_ee_bucket_drop(ScrEeReg *reg, ScrEeBucket *b) {
|
|
152
|
+
ScrEeBucket **link = ®->head;
|
|
153
|
+
while (*link != b) link = &(*link)->next;
|
|
154
|
+
*link = b->next;
|
|
155
|
+
scr_str_release(b->name);
|
|
156
|
+
free(b->ls);
|
|
157
|
+
free(b);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
static bool scr_ee_has(ScrEeReg *reg, const char *name) {
|
|
161
|
+
ScrEeBucket *b = scr_ee_bucket_find(reg, name, strlen(name));
|
|
162
|
+
return b != NULL && b->n > 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* ── the emitter object (hierarchy prefix helpers) ────────────────────── */
|
|
166
|
+
|
|
167
|
+
/* rc-0 teardown of the registry: releases EVERYTHING (closures included)
|
|
168
|
+
* and frees the storage. The emitted subclass DIRECT releases call this
|
|
169
|
+
* for their embedded prefix, exactly like a string field's release. */
|
|
170
|
+
void scr_emitter_reg_drop(ScrEeReg *reg) {
|
|
171
|
+
if (!reg) return;
|
|
172
|
+
ScrEeBucket *b = reg->head;
|
|
173
|
+
while (b) {
|
|
174
|
+
ScrEeBucket *next = b->next;
|
|
175
|
+
for (size_t i = 0; i < b->n; i++) scr_ee_entry_unref(b->ls[i]);
|
|
176
|
+
scr_str_release(b->name);
|
|
177
|
+
free(b->ls);
|
|
178
|
+
free(b);
|
|
179
|
+
b = next;
|
|
180
|
+
}
|
|
181
|
+
free(reg);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* Collector trace: the listener closures are the registry's only
|
|
185
|
+
* cycle-headered children (bucket names are strings — acyclic). */
|
|
186
|
+
void scr_emitter_reg_trace(ScrEeReg *reg, ScrTraceVisit visit, void *ctx) {
|
|
187
|
+
if (!reg) return;
|
|
188
|
+
for (ScrEeBucket *b = reg->head; b; b = b->next) {
|
|
189
|
+
for (size_t i = 0; i < b->n; i++) {
|
|
190
|
+
visit(b->ls[i]->cb, ctx);
|
|
191
|
+
if (b->ls[i]->orig) visit(b->ls[i]->orig, ctx);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* Collector teardown: the complement of the trace — releases the names,
|
|
197
|
+
* frees vectors/entries/registry, but NOT the closures (traced edges were
|
|
198
|
+
* already accounted by the collector). */
|
|
199
|
+
void scr_emitter_reg_gcfree(ScrEeReg *reg) {
|
|
200
|
+
if (!reg) return;
|
|
201
|
+
ScrEeBucket *b = reg->head;
|
|
202
|
+
while (b) {
|
|
203
|
+
ScrEeBucket *next = b->next;
|
|
204
|
+
for (size_t i = 0; i < b->n; i++) {
|
|
205
|
+
if (--b->ls[i]->refs == 0) free(b->ls[i]);
|
|
206
|
+
}
|
|
207
|
+
scr_str_release(b->name);
|
|
208
|
+
free(b->ls);
|
|
209
|
+
free(b);
|
|
210
|
+
b = next;
|
|
211
|
+
}
|
|
212
|
+
free(reg);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
void scr_emitter_trace(void *obj, ScrTraceVisit visit, void *ctx) {
|
|
216
|
+
scr_emitter_reg_trace(((ScrEmitter *)obj)->reg, visit, ctx);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
static void scr_emitter_gcfree(void *obj) {
|
|
220
|
+
scr_emitter_reg_gcfree(((ScrEmitter *)obj)->reg);
|
|
221
|
+
scr_obj_free_note();
|
|
222
|
+
scr_cyc_free(obj);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
static void scr_emitter_release_direct(void *obj) {
|
|
226
|
+
ScrEmitter *em = obj;
|
|
227
|
+
if (--em->rc == 0) {
|
|
228
|
+
scr_cyc_on_dead(em);
|
|
229
|
+
scr_emitter_reg_drop(em->reg);
|
|
230
|
+
scr_obj_free_note();
|
|
231
|
+
scr_cyc_free(em);
|
|
232
|
+
} else {
|
|
233
|
+
scr_cyc_on_release(em); /* possible cycle root; may collect */
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
ScrEmitter *scr_emitter_new(void) {
|
|
238
|
+
/* Always collector-headered: the registry holds closures, so the
|
|
239
|
+
* emitter hierarchy is unconditionally cycle-capable (the canonical
|
|
240
|
+
* capture cycle is `e.on('x', () => e.emit(...))`). */
|
|
241
|
+
ScrEmitter *em = scr_cyc_alloc(sizeof *em, &scr_emitter_trace, &scr_emitter_gcfree);
|
|
242
|
+
em->rc = 1;
|
|
243
|
+
em->vt = &scr_emitter_vt;
|
|
244
|
+
em->reg = NULL;
|
|
245
|
+
em->cls = "EventEmitter";
|
|
246
|
+
scr_obj_alloc_note();
|
|
247
|
+
return em;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/* super() into the emitter prefix of an emitted subclass: the allocation
|
|
251
|
+
* already zeroed reg and stamped the concrete class's display name, so
|
|
252
|
+
* construction has nothing left to do — the call exists so the super()
|
|
253
|
+
* statement lowers to a real site (and may grow options later). */
|
|
254
|
+
void scr_emitter_init(void *obj) { (void)obj; }
|
|
255
|
+
|
|
256
|
+
ScrEmitter *scr_emitter_retain(ScrEmitter *em) {
|
|
257
|
+
if (em && em->rc != SIZE_MAX) {
|
|
258
|
+
em->rc++;
|
|
259
|
+
scr_cyc_mark_live(em);
|
|
260
|
+
}
|
|
261
|
+
return em;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
void scr_emitter_release(ScrEmitter *em) {
|
|
265
|
+
if (!em || em->rc == SIZE_MAX) return;
|
|
266
|
+
em->vt->release(em); /* the DYNAMIC class's teardown */
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
void *scr_emitter_retain_v(void *em) { return scr_emitter_retain(em); }
|
|
270
|
+
void scr_emitter_release_v(void *em) { scr_emitter_release(em); }
|
|
271
|
+
|
|
272
|
+
/* ── the meta events ('newListener' / 'removeListener') ──────────────── */
|
|
273
|
+
|
|
274
|
+
static bool scr_ee_emit_va(ScrEmitter *em, ScrStr *name, ...);
|
|
275
|
+
|
|
276
|
+
/* Fires a meta event with the affected event's NAME as the argument
|
|
277
|
+
* (listeners are fenced to arity <= 1, so the listener-function argument
|
|
278
|
+
* Node passes second is never read). */
|
|
279
|
+
static void scr_ee_emit_meta(ScrEmitter *em, const char *meta, ScrStr *name) {
|
|
280
|
+
if (!scr_ee_has(em->reg, meta)) return;
|
|
281
|
+
ScrStr *m = scr_str_new(meta, strlen(meta));
|
|
282
|
+
scr_ee_emit_va(em, m, name);
|
|
283
|
+
scr_str_release(m);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* ── add / remove ─────────────────────────────────────────────────────── */
|
|
287
|
+
|
|
288
|
+
static void scr_ee_warn_maybe(ScrEmitter *em, ScrEeBucket *b) {
|
|
289
|
+
ScrEeReg *reg = em->reg;
|
|
290
|
+
double max = reg->max >= 0 ? reg->max : scr_emitter_default_max;
|
|
291
|
+
if (b->warned || max <= 0 || (double)b->n <= max) return;
|
|
292
|
+
b->warned = true;
|
|
293
|
+
/* Node's message byte for byte — except the pid, which is OURS (it can
|
|
294
|
+
* never match another process's), and the synchronous timing (Node
|
|
295
|
+
* defers the print by a tick). SEMANTICS.md documents both. */
|
|
296
|
+
fprintf(stderr,
|
|
297
|
+
"(node:%ld) MaxListenersExceededWarning: Possible EventEmitter memory leak "
|
|
298
|
+
"detected. %zu %s listeners added to [%s]. MaxListeners is %g. Use "
|
|
299
|
+
"emitter.setMaxListeners() to increase limit\n",
|
|
300
|
+
SCR_EE_PID(), b->n, b->name->data, em->cls, max);
|
|
301
|
+
if (!scr_ee_trace_hint_shown) {
|
|
302
|
+
scr_ee_trace_hint_shown = true;
|
|
303
|
+
fputs("(Use `node --trace-warnings ...` to show where the warning was created)\n",
|
|
304
|
+
stderr);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* Registers a listener. cb and orig MOVE in; name is borrowed. Returns em
|
|
309
|
+
* +1 (the `return this` chaining value). 'newListener' fires BEFORE the
|
|
310
|
+
* add, like Node. A listener throw inside the meta emit leaves the
|
|
311
|
+
* exception pending; the add still happens (Node's addListener has no
|
|
312
|
+
* try). */
|
|
313
|
+
static ScrEmitter *scr_ee_add(ScrEmitter *em, ScrStr *name, ScrClosure *cb /*moves*/,
|
|
314
|
+
ScrClosure *orig /*moves; may be NULL*/,
|
|
315
|
+
ScrEeInvoke inv, bool once, bool prepend) {
|
|
316
|
+
scr_ee_reg_ensure(em);
|
|
317
|
+
scr_ee_emit_meta(em, "newListener", name);
|
|
318
|
+
ScrEeBucket *b = scr_ee_bucket_ensure(em->reg, name);
|
|
319
|
+
ScrEeEntry *e = calloc(1, sizeof *e);
|
|
320
|
+
if (!e) scr_ee_oom();
|
|
321
|
+
e->cb = cb;
|
|
322
|
+
e->orig = orig;
|
|
323
|
+
e->inv = inv;
|
|
324
|
+
e->once = once;
|
|
325
|
+
e->refs = 1;
|
|
326
|
+
if (b->n == b->cap) {
|
|
327
|
+
b->cap = b->cap ? b->cap * 2 : 2;
|
|
328
|
+
b->ls = realloc(b->ls, b->cap * sizeof *b->ls);
|
|
329
|
+
if (!b->ls) scr_ee_oom();
|
|
330
|
+
}
|
|
331
|
+
if (prepend) {
|
|
332
|
+
memmove(b->ls + 1, b->ls, b->n * sizeof *b->ls);
|
|
333
|
+
b->ls[0] = e;
|
|
334
|
+
} else {
|
|
335
|
+
b->ls[b->n] = e;
|
|
336
|
+
}
|
|
337
|
+
b->n++;
|
|
338
|
+
scr_ee_warn_maybe(em, b);
|
|
339
|
+
if (scr_emitter_on_hook != NULL) scr_emitter_on_hook(em, name);
|
|
340
|
+
return scr_emitter_retain(em);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
ScrEmitter *scr_emitter_on(ScrEmitter *em, ScrStr *name, ScrClosure *cb /*moves*/,
|
|
344
|
+
ScrEeInvoke inv, bool once, bool prepend) {
|
|
345
|
+
return scr_ee_add(em, name, cb, NULL, inv, once, prepend);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/* The dyn-adapted registration (JS-lane checked-dynamic listeners): the
|
|
349
|
+
* ADAPTER closure (compiler-built — boxes the event tuple to dyn and
|
|
350
|
+
* calls the original through the checked-dynamic machinery) is what emit
|
|
351
|
+
* invokes; the ORIGINAL function (the dyn box's underlying closure) is
|
|
352
|
+
* the entry's identity. cb must be a SCR_DYN_FUNC (the emitted
|
|
353
|
+
* scr_emitter_check_listener ran first); adapter MOVES in, cb is
|
|
354
|
+
* borrowed. */
|
|
355
|
+
ScrEmitter *scr_emitter_on_dyn(ScrEmitter *em, ScrStr *name, const ScrDyn *cb,
|
|
356
|
+
ScrClosure *adapter /*moves*/,
|
|
357
|
+
ScrEeInvoke inv, bool once, bool prepend) {
|
|
358
|
+
return scr_ee_add(em, name, adapter, scr_closure_retain(cb->v.fn.clo), inv, once,
|
|
359
|
+
prepend);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/* The adapter-mediated registration (the LLVM backend): adapter is what
|
|
363
|
+
* emit invokes, orig is the entry's identity — the on_dyn split with a
|
|
364
|
+
* plain-closure identity. Both move in. */
|
|
365
|
+
ScrEmitter *scr_emitter_on_via(ScrEmitter *em, ScrStr *name, ScrClosure *orig /*moves*/,
|
|
366
|
+
ScrClosure *adapter /*moves*/,
|
|
367
|
+
ScrEeInvoke inv, bool once, bool prepend) {
|
|
368
|
+
return scr_ee_add(em, name, adapter, orig, inv, once, prepend);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/* ── fixed-arity invoke shims (scr_runtime.h's contract) ──────────────
|
|
372
|
+
* Read k pointer-size slots and call the fixed-signature adapter behind
|
|
373
|
+
* cb->fn. The LLVM lane's emit sites pass every tuple argument pointer-
|
|
374
|
+
* classed (f64 as its i64 bit pattern, bool zero-extended) and the
|
|
375
|
+
* runtime's own emits are pointer-only, so va_arg(ap, void *) reads every
|
|
376
|
+
* tuple a fixed-registered listener can observe. */
|
|
377
|
+
void scr_ee_inv_fixed0(ScrClosure *cb, va_list ap) {
|
|
378
|
+
(void)ap;
|
|
379
|
+
((void (*)(ScrClosure *))cb->fn)(cb);
|
|
380
|
+
}
|
|
381
|
+
void scr_ee_inv_fixed1(ScrClosure *cb, va_list ap) {
|
|
382
|
+
void *a0 = va_arg(ap, void *);
|
|
383
|
+
((void (*)(ScrClosure *, void *))cb->fn)(cb, a0);
|
|
384
|
+
}
|
|
385
|
+
void scr_ee_inv_fixed2(ScrClosure *cb, va_list ap) {
|
|
386
|
+
void *a0 = va_arg(ap, void *);
|
|
387
|
+
void *a1 = va_arg(ap, void *);
|
|
388
|
+
((void (*)(ScrClosure *, void *, void *))cb->fn)(cb, a0, a1);
|
|
389
|
+
}
|
|
390
|
+
void scr_ee_inv_fixed3(ScrClosure *cb, va_list ap) {
|
|
391
|
+
void *a0 = va_arg(ap, void *);
|
|
392
|
+
void *a1 = va_arg(ap, void *);
|
|
393
|
+
void *a2 = va_arg(ap, void *);
|
|
394
|
+
((void (*)(ScrClosure *, void *, void *, void *))cb->fn)(cb, a0, a1, a2);
|
|
395
|
+
}
|
|
396
|
+
void scr_ee_inv_fixed4(ScrClosure *cb, va_list ap) {
|
|
397
|
+
void *a0 = va_arg(ap, void *);
|
|
398
|
+
void *a1 = va_arg(ap, void *);
|
|
399
|
+
void *a2 = va_arg(ap, void *);
|
|
400
|
+
void *a3 = va_arg(ap, void *);
|
|
401
|
+
((void (*)(ScrClosure *, void *, void *, void *, void *))cb->fn)(cb, a0, a1, a2, a3);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/* Removes one entry (by index) from a bucket's live list and fires the
|
|
405
|
+
* 'removeListener' meta event AFTER the removal, Node's order. Drops the
|
|
406
|
+
* bucket when emptied. */
|
|
407
|
+
static void scr_ee_remove_at(ScrEmitter *em, ScrEeBucket *b, size_t i) {
|
|
408
|
+
ScrEeEntry *e = b->ls[i];
|
|
409
|
+
memmove(b->ls + i, b->ls + i + 1, (b->n - i - 1) * sizeof *b->ls);
|
|
410
|
+
b->n--;
|
|
411
|
+
ScrStr *name = scr_str_retain(b->name);
|
|
412
|
+
if (b->n == 0) scr_ee_bucket_drop(em->reg, b);
|
|
413
|
+
scr_ee_entry_unref(e);
|
|
414
|
+
scr_ee_emit_meta(em, "removeListener", name);
|
|
415
|
+
scr_str_release(name);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/* removeListener/off: the LAST matching occurrence leaves (Node searches
|
|
419
|
+
* from the end). cb is borrowed. Returns em +1. */
|
|
420
|
+
ScrEmitter *scr_emitter_off(ScrEmitter *em, ScrStr *name, ScrClosure *cb) {
|
|
421
|
+
ScrEeBucket *b = em->reg ? scr_ee_bucket_find(em->reg, name->data, name->len) : NULL;
|
|
422
|
+
if (b) {
|
|
423
|
+
for (size_t i = b->n; i-- > 0;) {
|
|
424
|
+
if (scr_ee_entry_fn(b->ls[i]) == cb) {
|
|
425
|
+
scr_ee_remove_at(em, b, i);
|
|
426
|
+
break;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
return scr_emitter_retain(em);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/* off/removeListener with a checked-dynamic listener: the identity is the
|
|
434
|
+
* dyn box's underlying closure (check_listener ran first — the kind IS
|
|
435
|
+
* function). cb borrowed; returns em +1. */
|
|
436
|
+
ScrEmitter *scr_emitter_off_dyn(ScrEmitter *em, ScrStr *name, const ScrDyn *cb) {
|
|
437
|
+
return scr_emitter_off(em, name, cb->v.fn.clo);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/* The listener-argument type check Node runs first in the whole
|
|
441
|
+
* registration family (on, once, the prepend forms, removeListener): a
|
|
442
|
+
* non-function throws the catchable ERR_INVALID_ARG_TYPE TypeError,
|
|
443
|
+
* message shaped by errors.js's determineSpecificType (scalars render
|
|
444
|
+
* inspected and truncate at 28 rendered chars to 25 + "..."; strings take
|
|
445
|
+
* the simple '-quoted spelling — listener mistakes are words, not escape
|
|
446
|
+
* zoos). */
|
|
447
|
+
void scr_emitter_check_listener(const ScrDyn *cb) {
|
|
448
|
+
/* The shared gate lives in the always-linked DOM core (scr_json.c) so
|
|
449
|
+
* the handle dispatchers' .on paths render the same shapes without
|
|
450
|
+
* linking this unit. */
|
|
451
|
+
scr_dyn_check_listener(cb, "listener");
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/* removeAllListeners(name?) — all = no name argument. With NO
|
|
455
|
+
* 'removeListener' listeners this is a plain wipe (no events, Node's fast
|
|
456
|
+
* path). With them, listeners leave ONE AT A TIME in LIFO order, each
|
|
457
|
+
* firing the meta event — and the whole-emitter form does every other
|
|
458
|
+
* event first (bucket order), 'removeListener' itself LAST. Returns em +1. */
|
|
459
|
+
static void scr_ee_remove_all_named(ScrEmitter *em, ScrEeBucket *b, bool meta) {
|
|
460
|
+
if (!meta) {
|
|
461
|
+
for (size_t i = 0; i < b->n; i++) scr_ee_entry_unref(b->ls[i]);
|
|
462
|
+
b->n = 0;
|
|
463
|
+
scr_ee_bucket_drop(em->reg, b);
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
/* Node snapshots the list and removeListener()s each entry from the
|
|
467
|
+
* END (LIFO): meta listeners run per removal, and anything they add
|
|
468
|
+
* survives. The bucket can drop (and even be recreated) under the
|
|
469
|
+
* pass, so every step re-finds it and matches entries by identity. */
|
|
470
|
+
ScrStr *name = scr_str_retain(b->name);
|
|
471
|
+
size_t n = b->n;
|
|
472
|
+
ScrEeEntry **snap = malloc(n * sizeof *snap);
|
|
473
|
+
if (!snap) scr_ee_oom();
|
|
474
|
+
for (size_t i = 0; i < n; i++) {
|
|
475
|
+
snap[i] = b->ls[i];
|
|
476
|
+
snap[i]->refs++;
|
|
477
|
+
}
|
|
478
|
+
for (size_t i = n; i-- > 0;) {
|
|
479
|
+
ScrEeEntry *e = snap[i];
|
|
480
|
+
ScrEeBucket *live = scr_ee_bucket_find(em->reg, name->data, name->len);
|
|
481
|
+
if (live) {
|
|
482
|
+
for (size_t j = live->n; j-- > 0;) {
|
|
483
|
+
if (live->ls[j] == e) {
|
|
484
|
+
scr_ee_remove_at(em, live, j);
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
scr_ee_entry_unref(e);
|
|
490
|
+
}
|
|
491
|
+
free(snap);
|
|
492
|
+
scr_str_release(name);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
ScrEmitter *scr_emitter_remove_all(ScrEmitter *em, ScrStr *name, bool all) {
|
|
496
|
+
ScrEeReg *reg = em->reg;
|
|
497
|
+
if (!reg) return scr_emitter_retain(em);
|
|
498
|
+
bool meta = scr_ee_has(reg, "removeListener");
|
|
499
|
+
if (!all) {
|
|
500
|
+
ScrEeBucket *b = scr_ee_bucket_find(reg, name->data, name->len);
|
|
501
|
+
if (b) scr_ee_remove_all_named(em, b, meta);
|
|
502
|
+
return scr_emitter_retain(em);
|
|
503
|
+
}
|
|
504
|
+
/* Every event except 'removeListener' first, in bucket order; then
|
|
505
|
+
* 'removeListener' itself. The bucket list mutates under us (drops,
|
|
506
|
+
* meta listeners may add), so restart the scan after each bucket. */
|
|
507
|
+
for (;;) {
|
|
508
|
+
ScrEeBucket *pick = NULL;
|
|
509
|
+
for (ScrEeBucket *b = reg->head; b; b = b->next) {
|
|
510
|
+
if (b->name->len == 14 && memcmp(b->name->data, "removeListener", 14) == 0) continue;
|
|
511
|
+
pick = b;
|
|
512
|
+
break;
|
|
513
|
+
}
|
|
514
|
+
if (!pick) break;
|
|
515
|
+
scr_ee_remove_all_named(em, pick, meta);
|
|
516
|
+
}
|
|
517
|
+
ScrEeBucket *rl = scr_ee_bucket_find(reg, "removeListener", 14);
|
|
518
|
+
if (rl) scr_ee_remove_all_named(em, rl, meta);
|
|
519
|
+
return scr_emitter_retain(em);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/* ── emit ─────────────────────────────────────────────────────────────── */
|
|
523
|
+
|
|
524
|
+
/* One dispatch pass over a SNAPSHOT of the bucket: entries invoke in list
|
|
525
|
+
* order through their emitted adapters, each with a fresh va_start over
|
|
526
|
+
* the emit site's typed tail. A once entry leaves the live list (firing
|
|
527
|
+
* 'removeListener', Node's wrapper calls removeListener) BEFORE its
|
|
528
|
+
* callback runs, and never runs twice even when a nested emit's snapshot
|
|
529
|
+
* still holds it (the shared fired flag — Node's wrapper.fired). A
|
|
530
|
+
* listener throw stops the pass (the exception stays pending for the
|
|
531
|
+
* caller). Returns whether the bucket had listeners. */
|
|
532
|
+
static bool scr_ee_emit_core(ScrEmitter *em, ScrStr *name, va_list *ap_template) {
|
|
533
|
+
ScrEeBucket *b = em->reg ? scr_ee_bucket_find(em->reg, name->data, name->len) : NULL;
|
|
534
|
+
if (!b || b->n == 0) return false;
|
|
535
|
+
size_t n = b->n;
|
|
536
|
+
ScrEeEntry **snap = malloc(n * sizeof *snap);
|
|
537
|
+
if (!snap) scr_ee_oom();
|
|
538
|
+
for (size_t i = 0; i < n; i++) {
|
|
539
|
+
snap[i] = b->ls[i];
|
|
540
|
+
snap[i]->refs++;
|
|
541
|
+
}
|
|
542
|
+
for (size_t i = 0; i < n; i++) {
|
|
543
|
+
ScrEeEntry *e = snap[i];
|
|
544
|
+
if (scr_exc_pending()) {
|
|
545
|
+
scr_ee_entry_unref(e);
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
if (e->once) {
|
|
549
|
+
if (e->fired) {
|
|
550
|
+
scr_ee_entry_unref(e);
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
e->fired = true;
|
|
554
|
+
/* Remove from the live list first (the wrapper's own removal). The
|
|
555
|
+
* bucket may have been dropped/recreated by earlier listeners —
|
|
556
|
+
* re-find it and match by entry identity. */
|
|
557
|
+
ScrEeBucket *live = scr_ee_bucket_find(em->reg, name->data, name->len);
|
|
558
|
+
if (live) {
|
|
559
|
+
for (size_t j = 0; j < live->n; j++) {
|
|
560
|
+
if (live->ls[j] == e) {
|
|
561
|
+
scr_ee_remove_at(em, live, j);
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
if (scr_exc_pending()) { /* a removeListener meta listener threw */
|
|
567
|
+
scr_ee_entry_unref(e);
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
va_list ap;
|
|
572
|
+
va_copy(ap, *ap_template);
|
|
573
|
+
e->inv(e->cb, ap);
|
|
574
|
+
va_end(ap);
|
|
575
|
+
scr_ee_entry_unref(e);
|
|
576
|
+
}
|
|
577
|
+
free(snap);
|
|
578
|
+
return true;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
static bool scr_ee_emit_va(ScrEmitter *em, ScrStr *name, ...) {
|
|
582
|
+
va_list ap;
|
|
583
|
+
va_start(ap, name);
|
|
584
|
+
bool had = scr_ee_emit_core(em, name, &ap);
|
|
585
|
+
va_end(ap);
|
|
586
|
+
return had;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/* emit(name, ...tuple) — the emitted call site passes the event's unified
|
|
590
|
+
* tuple as typed C variadics (doubles, pointers, ints for bools); every
|
|
591
|
+
* argument is BORROWED (adapters retain the +1 each callee owns). May
|
|
592
|
+
* leave an exception pending (a listener threw). */
|
|
593
|
+
bool scr_emitter_emit(ScrEmitter *em, ScrStr *name, ...) {
|
|
594
|
+
va_list ap;
|
|
595
|
+
va_start(ap, name);
|
|
596
|
+
bool had = scr_ee_emit_core(em, name, &ap);
|
|
597
|
+
va_end(ap);
|
|
598
|
+
return had;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/* emit('error', err) — Node's special event: with no 'error' listener the
|
|
602
|
+
* payload THROWS (catchable; uncaught exits 1 with the error report).
|
|
603
|
+
* err is borrowed; the throw takes its own +1. */
|
|
604
|
+
bool scr_emitter_emit_error(ScrEmitter *em, ScrStr *name, ScrError *err) {
|
|
605
|
+
if (!scr_ee_has(em->reg, "error")) {
|
|
606
|
+
scr_throw_obj(scr_error_retain(err), &scr_error_retain_v, &scr_error_release_v,
|
|
607
|
+
scr_error_trace_arg());
|
|
608
|
+
return false;
|
|
609
|
+
}
|
|
610
|
+
return scr_ee_emit_va(em, name, err);
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/* ── introspection ────────────────────────────────────────────────────── */
|
|
614
|
+
|
|
615
|
+
/* The stream unit's registration probe (any unit's, really). */
|
|
616
|
+
bool scr_emitter_has(ScrEmitter *em, const char *name) {
|
|
617
|
+
return scr_ee_has(em->reg, name);
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
double scr_emitter_listener_count(ScrEmitter *em, ScrStr *name) {
|
|
621
|
+
ScrEeBucket *b = em->reg ? scr_ee_bucket_find(em->reg, name->data, name->len) : NULL;
|
|
622
|
+
return b ? (double)b->n : 0;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/* listenerCount(name, fn): entries matching fn by identity. */
|
|
626
|
+
double scr_emitter_listener_count_fn(ScrEmitter *em, ScrStr *name, ScrClosure *fn) {
|
|
627
|
+
ScrEeBucket *b = em->reg ? scr_ee_bucket_find(em->reg, name->data, name->len) : NULL;
|
|
628
|
+
if (!b) return 0;
|
|
629
|
+
size_t count = 0;
|
|
630
|
+
for (size_t i = 0; i < b->n; i++) {
|
|
631
|
+
if (scr_ee_entry_fn(b->ls[i]) == fn) count++;
|
|
632
|
+
}
|
|
633
|
+
return (double)count;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
/* eventNames(): +1 string[] of the bucket names in first-registration
|
|
637
|
+
* order (exactly Node's _events key order). */
|
|
638
|
+
ScrArr *scr_emitter_event_names(ScrEmitter *em) {
|
|
639
|
+
ScrArr *out = scr_arr_new(SCR_ELEM_STR, 0);
|
|
640
|
+
if (em->reg) {
|
|
641
|
+
for (ScrEeBucket *b = em->reg->head; b; b = b->next) {
|
|
642
|
+
scr_arr_push_ref(out, scr_str_retain(b->name));
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return out;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/* listeners(name) / rawListeners(name): +1 closure array in list order.
|
|
649
|
+
* The once wrapper is runtime-internal here, so BOTH forms answer the
|
|
650
|
+
* original listeners (SEMANTICS.md documents the rawListeners
|
|
651
|
+
* divergence). */
|
|
652
|
+
ScrArr *scr_emitter_listeners(ScrEmitter *em, ScrStr *name) {
|
|
653
|
+
ScrArr *out = scr_arr_new_ref(&scr_closure_retain_v, &scr_closure_release_v,
|
|
654
|
+
&scr_closure_trace_v, 0);
|
|
655
|
+
ScrEeBucket *b = em->reg ? scr_ee_bucket_find(em->reg, name->data, name->len) : NULL;
|
|
656
|
+
if (b) {
|
|
657
|
+
for (size_t i = 0; i < b->n; i++) {
|
|
658
|
+
scr_arr_push_ref(out, scr_closure_retain(scr_ee_entry_fn(b->ls[i])));
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
return out;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
/* ── max listeners ────────────────────────────────────────────────────── */
|
|
665
|
+
|
|
666
|
+
ScrEmitter *scr_emitter_set_max(ScrEmitter *em, double n) {
|
|
667
|
+
if (!(n >= 0)) { /* negatives and NaN — Node's validateNumber */
|
|
668
|
+
char num[32];
|
|
669
|
+
size_t nlen = scr_f64_to_str(n, num);
|
|
670
|
+
char msg[128];
|
|
671
|
+
int len = snprintf(msg, sizeof msg,
|
|
672
|
+
"The value of \"setMaxListeners\" is out of range. It must be >= 0. Received %.*s",
|
|
673
|
+
(int)nlen, num);
|
|
674
|
+
scr_throw_error_msg_code(SCR_ERR_RANGE, msg, (size_t)len, "ERR_OUT_OF_RANGE");
|
|
675
|
+
return scr_emitter_retain(em); /* the pending check unwinds */
|
|
676
|
+
}
|
|
677
|
+
scr_ee_reg_ensure(em)->max = n;
|
|
678
|
+
return scr_emitter_retain(em);
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
double scr_emitter_get_max(ScrEmitter *em) {
|
|
682
|
+
if (em->reg && em->reg->max >= 0) return em->reg->max;
|
|
683
|
+
return scr_emitter_default_max;
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
void scr_emitter_set_default_max(double n) {
|
|
687
|
+
if (!(n >= 0)) { /* negatives and NaN — Node's validateNumber(n, "setMaxListeners", 0) */
|
|
688
|
+
char num[32];
|
|
689
|
+
size_t nlen = scr_f64_to_str(n, num);
|
|
690
|
+
char msg[128];
|
|
691
|
+
int len = snprintf(msg, sizeof msg,
|
|
692
|
+
"The value of \"setMaxListeners\" is out of range. It must be >= 0. Received %.*s",
|
|
693
|
+
(int)nlen, num);
|
|
694
|
+
scr_throw_error_msg_code(SCR_ERR_RANGE, msg, (size_t)len, "ERR_OUT_OF_RANGE");
|
|
695
|
+
return; /* the pending check unwinds */
|
|
696
|
+
}
|
|
697
|
+
scr_emitter_default_max = n;
|
|
698
|
+
}
|
|
699
|
+
double scr_emitter_get_default_max(void) { return scr_emitter_default_max; }
|