grid: a pending zero-width joiner survives a C0 control #412

Closed
opened 2026-09-25 03:15:28 +09:00 by natsukium · 0 comments
Owner

Split from #401 (noticed while pinning the batched print paths in #410).

A pending zero-width joiner is disarmed by printable ASCII (fixed in #410) but not by C0 controls handled in execute: after ZWJ, a TAB or CR followed by a joinable character still joins that character to the cluster written before the control. Both the per-byte and the batched print paths behave the same way, so the proptest added in #410 does not flag it.

Expected: any C0 control that moves the cursor or ends the run disarms the pending joiner, as a printable ASCII byte does. Pin it with a deterministic test per control (TAB, CR, LF, BS).

Split from #401 (noticed while pinning the batched print paths in #410). A pending zero-width joiner is disarmed by printable ASCII (fixed in #410) but not by C0 controls handled in `execute`: after `ZWJ`, a TAB or CR followed by a joinable character still joins that character to the cluster written before the control. Both the per-byte and the batched print paths behave the same way, so the proptest added in #410 does not flag it. Expected: any C0 control that moves the cursor or ends the run disarms the pending joiner, as a printable ASCII byte does. Pin it with a deterministic test per control (TAB, CR, LF, BS).
Commenting is not possible because the repository is archived.
No description provided.