Skip to content

Commit f67c586

Browse files
committed
docs(list_moreutils): record RC1-RC5 completion and defer RC6 to weaken branch
1 parent 96c4f92 commit f67c586

1 file changed

Lines changed: 44 additions & 10 deletions

File tree

dev/modules/list_moreutils.md

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -187,18 +187,52 @@ All 4492 subtests must pass. Rerun `make` to ensure no unit-test regressions.
187187
## Progress tracking
188188

189189
### Current status
190-
Planning complete. Starting Step 1.
190+
191+
`./jcpan -t List::MoreUtils` goes from 7 failing subtests (8 test files) on master down to **1 failing subtest (`indexes.t` test 18) in 1 test file**, and that remaining failure is deferred to the parallel weaken branch (see RC6 below).
191192

192193
### Completed phases
193-
_none yet_
194194

195-
### Next steps
196-
1. RC1 — numeric scalar strict refs (Step 1)
197-
2. RC3 — POSIX stubs (Step 2)
198-
3. RC2 — my-in-modifier (Step 3)
199-
4. RC4 — split zero-width alternation (Step 4)
200-
5. Final verification (Step 5)
195+
- [x] **RC1** — numeric scalar strict-refs (2026-04-20) — commit `db94a5ae1`
196+
- `RuntimeScalar.arrayDeref()` / `hashDeref()` now throw `Can't use string ("N") as an ARRAY|HASH ref while "strict refs" in use` for `INTEGER` / `DOUBLE`.
197+
- `RuntimeScalarReadOnly` gains the same behavior for read-only scalars holding numeric values, while keeping `1->[0]` / `1->{a}` silent via new `arrayDerefGet` / `hashDerefGet` overrides.
198+
- Fixes: `binsert.t`, `bremove.t`, `mesh.t`, `zip6.t` (4 tests).
199+
- [x] **RC3** — POSIX stubs (2026-04-20) — commit `a161fa284`
200+
- Adds `setlocale`, `localeconv`, `LC_ALL` / `LC_COLLATE` / `LC_CTYPE` / `LC_MONETARY` / `LC_NUMERIC` / `LC_TIME` / `LC_MESSAGES` as Perl stubs in `src/main/perl/lib/POSIX.pm`.
201+
- Fixes: `minmaxstr.t`.
202+
- [x] **RC2**`my` hoist in statement-modifier loops (2026-04-20) — commit `3bfaffda3`
203+
- `StatementResolver.parseStatement` for `for` / `foreach` / `while` / `until` now detects `my DECL = RHS for LIST` / `my DECL = RHS while COND` and emits a bare `my DECL;` in the enclosing scope, wrapping the loop body in a BlockNode for `while`/`until` so the inner `my` shadows the outer on each iteration (matching perl: the outer variable stays empty/undef).
204+
- Fixes: compile-time `Global symbol @long_list …` error in `part.t`.
205+
- [x] **RC4** — split with zero-width vs consuming alternation (2026-04-20) — commit `c9b8e05dd`
206+
- `Operator.split` now probes each zero-width match via `Matcher.matches()` on progressively larger regions. When a consuming alternative also matches at the same offset, an extra empty field is emitted between the two separators and the consumed characters are skipped, matching perl's `REG_NOTEMPTY_ATSTART` retry loop.
207+
- Fixes: `mode.t` tests 2 and 4.
208+
- [x] **RC5** — undef-as-subscript warning (2026-04-20) — commit `96c4f92d5`
209+
- `RuntimeArray.get` / `RuntimeHash.get` now emit `Use of uninitialized value in array|hash element` (category `uninitialized`) when called with an `UNDEF` index. This was exposed after RC2 unblocked the later leak-free tests in `part.t`.
210+
- Fixes: `part.t` tests 12 and 13.
211+
212+
### Deferred
213+
214+
- **RC6 — `Scalar::Util::weaken` on a reference to a temporary** (`indexes.t` test 18). The test does
215+
```perl
216+
my $ref = \(indexes(sub { 1 }, 123));
217+
Scalar::Util::weaken($ref);
218+
is($ref, undef, "weakened away");
219+
```
220+
In real perl the temporary returned by `indexes(...)` has a refcount of 1 held by `$ref`; weakening that ref drops the refcount to 0 and the temporary is freed, so `$ref` becomes undef. PerlOnJava's cooperative-refcount overlay (see `dev/architecture/weaken-destroy.md`) only tracks objects blessed into a class with `DESTROY`. For an unblessed numeric scalar like this one, weaken transitions it to `WEAKLY_TRACKED` but does not clear the weak ref at scope exit because we can't distinguish "last strong ref was this one" from "symbol table still holds a ref" without full refcounting. This is a known architectural limitation being addressed on a separate branch; this PR does not touch it.
221+
222+
### Final summary
223+
224+
- `binsert.t` ok
225+
- `bremove.t` ok
226+
- `mesh.t` ok
227+
- `zip6.t` ok
228+
- `minmaxstr.t` ok
229+
- `mode.t` ok
230+
- `part.t` ok
231+
- `indexes.t` — 1 subtest still fails (RC6, deferred to weaken branch)
232+
233+
Run `./jcpan -t List::MoreUtils` and observe: `Files=61, Tests=4533. Failed 1/61 test programs. 1/4533 subtests failed.` (was 8 / 7 before this branch).
201234

202235
### Open questions
203-
- RC3: do we need `POSIX::localeconv` to return locale-sensitive values, or is the stub enough for the Perl distribution tests we care about? Starting with the stub.
204-
- RC4: is the split bug specific to alternations containing `\b`, or does it also affect `\s` alone at odd positions? Will be answered by the harness.
236+
- None open for RC1–RC5.
237+
- RC6 is tracked on the separate weaken branch.
238+

0 commit comments

Comments
 (0)