BBS:      TELESC.NET.BR
Assunto:  get_all_msg_headers(): cold *_NULL fields read undefined via dot-acces
De:       Rob Swindell
Data:     Fri, 22 May 2026 13:38:46 -0700
-----------------------------------------------------------
https://gitlab.synchro.net/main/sbbs/-/issues/1143#note_9009

**Correction to my Q1 above: the symptom is on Windows _and_ Linux, not Linux-only**

Rob clarified the history: this was **originally discovered on Windows** (MSVC build) and then **reproduced on both Windows and Linux**. My note above said "Not Windows"  that was wrong, and I'm glad it's wrong, because it makes the picture cleaner, not muddier.

Both the Windows (MSVC) and Linux (gcc 14.2) builds compile `JS_TRACER`. Your FreeBSD/Clang build does not. So the reproduce/no-reproduce split lines up **exactly** with "is TraceMonkey compiled in," across **three** different compilers:

| build | compiler | `JS_TRACER` | reproduces? |
|-------|----------|-------------|-------------|
| Windows | MSVC | compiled in | **yes** (original discovery) |
| Linux | gcc 14.2 | compiled in | **yes** (the A/B above) |
| FreeBSD | Clang 19 | not compiled | **no** (your runs) |

This **removes** the "gcc-vs-clang codegen quirk" hypothesis I floated. It isn't a per-compiler codegen accident  MSVC and gcc are very different backends and both reproduce. The single common factor is the trace JIT being present and enabled (`JSOPTION_JIT`, bit 11, in the active `0x810`), and the single factor on your side is its absence. The decisive A/B stands: flipping only that bit on one build (`js.options 0x810  0x10`) turns the 7268 spurious-undefineds to 0.

So: TraceMonkey's trace-recorded GETPROP over the shared-shape headers with conditionally-resolved `*_NULL` fields, confirmed across two independent toolchains. The fix candidates in my previous note are unchanged.
n
---
  mSynchronetn  hgVertrauen n hHome of Synchronet n gh[vert/cvs/bbs].synchro.net

-----------------------------------------------------------
[Voltar]