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) <
noreply@anthropic.com>
---
þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net