Subj : exec/tests/msgbase/get_all_msg_headers.js src/sbbs3/js_msgbase.cpp sbb To : Git commit to main/sbbs/master From : Rob Swindell (on Windows 11) Date : Sat May 23 2026 22:50:08 https://gitlab.synchro.net/main/sbbs/-/commit/edf75242977c665f506b8457 Modified Files: exec/tests/msgbase/get_all_msg_headers.js src/sbbs3/js_msgbase.cpp sbbsdefs.h Log Message: sbbsdefs: disable JSOPTION_JIT (TraceMonkey) by default -- fixes #1143 JAVASCRIPT_OPTIONS dropped from 0x810 to 0x10 (kept JSOPTION_COMPILE_N_GO, dropped JSOPTION_JIT / bit 0x800 / TraceMonkey). TraceMonkey is the true root cause of MsgBase.get_all_msg_headers() returning `undefined` on cold first access of LAZY_STRING_TRUNCSP_NULL fields (to_ext, from_ext, replyto, to_list, cc_list, summary, tags, from_org, ...) on bulk-fetched headers: the trace recorder's shape-guarded GETPROP over a hot for..in dot-access loop mis-replays `undefined` across the shared header shape, since the *_NULL fields are conditionally-resolved own properties (present on some headers, absent on others). Confirmed via A/B on the same build by flipping only this bit (js.options 0x810 -> 0x10) on a live ~7.7k-msg mail base: cold hdr.to_ext undefined collapses from thousands of spurious mispredicts to exactly the genuinely-NULL count (216 of 7698 headers, matching the primed count). Reproduced on Linux/gcc and Windows/MSVC (both compile JS_TRACER into libmozjs); does not reproduce on FreeBSD/Clang (which builds with --disable-tracejit per 3rdp/build/GNUmakefile:38-43). JSOPTION_METHODJIT (bit 0x4000) was already off and remains off. Its PolyIC has a similarly shape-guarded structure and would warrant a re-run of the issue's probe_to_ext.js / probe_enum.js before being enabled. Prior art: a0607c011 dropped METHODJIT for analogous reasons (xtrn_sec.js misbehavior). Reverts two prior workarounds, which both named the wrong cache (interpreter PropertyCache rather than the trace JIT): ca448cb8b - eager JS_DefineProperty("number") (ineffective on real bases) 666ff71ce - eager full js_get_msg_header_resolve(JSID_VOID) + defer_listing (effective but at the cost of laziness, on the wrong diagnosis) Tests: rewrites exec/tests/msgbase/get_all_msg_headers.js to (1) hard- assert JSOPTION_JIT is off in js.options, failing fast with a clear message if re-enabled, and (2) keep the behavioral bulk-fetch contract guard. Drops the now-stale single-message scenario. Co-Authored-By: Claude Opus 4.7 (1M context) --- þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net .