Parents: #473, #475\nRelated: #672, #697\n\n## Problem\n\nThe Iterator.zipKeyed result closure passes keys[k].asStr() to setProp. asStr() is the StringCell physical image, while property creation consumes canonical WTF-8 names. With flat-Latin-1 storage active, a non-ASCII Latin-1 input key can therefore be republished under different bytes instead of its original JavaScript property key.\n\n## Scope\n\n- Read each stored zipKeyed string key through the representation-aware canonical boundary before CreateDataProperty-style publication.\n- Preserve key order, null prototype, fresh result identity, symbol-key rejection/selection, iterator close ordering, strict/shortest/longest behavior, padding, and OOM propagation.\n- Keep canonical/ASCII keys on the borrowing fast path.\n\n## No-workaround rules\n\n- No lossy repair, ASCII restriction, key renaming, eager global canonicalization, alternate object path, suppressed allocation failure, or changes to shared Map/Set iterator cursor state.\n- No stacks, queues, jobs, Promise, Worker, or Map/Set iterator changes.\n\n## Acceptance\n\n- A non-ASCII Latin-1 key survives zipKeyed result publication exactly in canonical and forced-flat builds.\n- Focused Debug, forced-flat, ReleaseSafe, TSan, the nonzero Test262 Iterator/zipKeyed subtree, and full units pass with exact accounting.
Iterator.zipKeyed: preserve flat Latin-1 result keys
#698Landed in f843f8d8. Iterator.zipKeyed now canonicalizes stored keys at both longest-mode padding lookup and result-property publication, preserving the canonical/ASCII borrowing fast path and iterator-close behavior on conversion OOM. Focused Debug, forced-flat, ReleaseSafe, and TSan passed; full units passed 1,794 with 1 intentional skip, 0 failures, and 0 leaks. Exact Test262 Iterator/zipKeyed accounting is 0 fail / 44 pass → 0 / 44 with byte-identical transcripts.
Sign in to comment on this issue.