diff --git a/internal/engine.cm b/internal/engine.cm index 8f6c3217..81815b53 100644 --- a/internal/engine.cm +++ b/internal/engine.cm @@ -331,7 +331,10 @@ var wildcard_sinks = [] var warned_channels = {} var stack_channels = {} +var log_quiet_channels = { shop: true } + function log(name, args) { + if (log_quiet_channels[name]) return var msg = args[0] if (msg == null) msg = "" os.print(`[${text(_cell.id, 0, 5)}] [${name}]: ${msg}\n`) @@ -559,13 +562,7 @@ log = function(name, args) { var stack = null var rec = null - if (!sinks && length(wildcard_sinks) == 0) { - if (!warned_channels[name]) { - warned_channels[name] = true - os.print(`[warn] log channel '${name}' has no sinks configured\n`) - } - return - } + if (!sinks && length(wildcard_sinks) == 0) return // C-provided stack (from JS_Log callback) overrides caller_info/os.stack if (c_stack && length(c_stack) > 0) { @@ -1247,17 +1244,21 @@ $_.clock(_ => { var pkg = file_info ? file_info.package : null - // Pre-build C modules for all transitive dependencies + // Verify all transitive dependency packages are present var _deps = null var _di = 0 - if (pkg && shop.ensure_package_dylibs) { + var _dep_dir = null + if (pkg) { _deps = package.gather_dependencies(pkg) _di = 0 while (_di < length(_deps)) { - shop.ensure_package_dylibs(_deps[_di]) + _dep_dir = package.get_dir(_deps[_di]) + if (!fd.is_dir(_dep_dir)) { + log.error('missing dependency package: ' + _deps[_di]) + disrupt + } _di = _di + 1 } - shop.ensure_package_dylibs(pkg) } env.use = function(path) { diff --git a/internal/os.c b/internal/os.c index d08083e0..3638c059 100644 --- a/internal/os.c +++ b/internal/os.c @@ -34,14 +34,10 @@ static JSClassID js_dylib_class_id; static void js_dylib_finalizer(JSRuntime *rt, JSValue val) { - void *handle = JS_GetOpaque(val, js_dylib_class_id); - if (handle) { -#ifdef _WIN32 - FreeLibrary((HMODULE)handle); -#else - dlclose(handle); -#endif - } + /* Do NOT dlclose here. Loaded dylibs contain finalizer functions for other + JS objects; if the dylib is freed before those objects during + JS_FreeContext teardown, calling their finalizers would SEGV. + The OS reclaims all loaded libraries on process exit. */ } static JSClassDef js_dylib_class = { diff --git a/source/cell_internal.h b/source/cell_internal.h index c46c1222..6f5d429c 100644 --- a/source/cell_internal.h +++ b/source/cell_internal.h @@ -27,7 +27,7 @@ typedef struct letter { // #define ACTOR_TRACE #define ACTOR_FAST_TIMER_NS (10ULL * 1000000) // 10ms per turn -#define ACTOR_SLOW_TIMER_NS (5000ULL * 1000000) // 5s for slow actors +#define ACTOR_SLOW_TIMER_NS (60000ULL * 1000000) // 60s for slow actors #define ACTOR_SLOW_STRIKES_MAX 3 // consecutive slow turns -> kill #define ACTOR_MEMORY_LIMIT (16ULL * 1024 * 1024) // 16MB heap cap diff --git a/source/wildmatch.c b/source/wildmatch.c index 62d48d51..591c8a30 100644 --- a/source/wildmatch.c +++ b/source/wildmatch.c @@ -54,6 +54,7 @@ static int rangematch(const char *, char, int, const char **); int wildmatch(const char *pattern, const char *string, int flags) { + const char *patternstart = pattern; const char *stringstart; const char *newp; const char *slash; @@ -87,7 +88,7 @@ int wildmatch(const char *pattern, const char *string, int flags) c = *pattern; wild = check_flag(flags, WM_WILDSTAR) && c == '*'; if (wild) { - prev = pattern[-2]; + prev = (pattern >= patternstart + 2) ? pattern[-2] : EOS; /* Collapse multiple stars and slash-** patterns, * e.g. "** / *** / **** / **" (without spaces) * is treated as a single ** wildstar. diff --git a/toolchains.cm b/toolchains.cm index d3e4e895..3b66d624 100644 --- a/toolchains.cm +++ b/toolchains.cm @@ -76,8 +76,8 @@ return { c_link_args: [] }, macos_arm64: { - c: 'clang -target arm64-apple-macos11', - cpp: 'clang++ -target arm64-apple-macos11', + c: 'clang -target arm64-apple-macos', + cpp: 'clang++ -target arm64-apple-macos', ar: 'ar', strip: 'strip', system: 'darwin',