Repository navigation
Stdlib: SPL iterator wrappers — FilterIterator, LimitIterator, AppendIterator, … (ext/spl parity) #4546
Copy link
Copy link
Closed
Labels
area:vmVirtual machineVirtual machineimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claimphase-4:stdlibPhase 4 – stdlib for web appsPhase 4 – stdlib for web apps
Description
Category
stdlib | runtime
Problem
Zend ships a family of SPL iterator wrapper classes used throughout frameworks and the standard library:
FilterIterator/RecursiveFilterIteratorLimitIteratorAppendIteratorInfiniteIteratorNoRewindIteratorParentIteratorMultipleIteratorGlobIteratorCachingIterator
This compiler has partial SPL coverage (SplFileObject, RecursiveIteratorIterator, ArrayIterator, … per #3330) but none of the wrapper classes above are registered. User code calling new FilterIterator(...) fails with unknown class.
php-src reference
- php/php-src
ext/spl/spl_iterators.c - php/php-src
ext/spl/spl_iterators.stub.php - Iterator protocol:
Zend/zend_iterators.c
Repro (failure today)
<?php
declare(strict_types=1);
$it = new ArrayIterator([1, 2, 3, 4, 5]);
$limited = new LimitIterator($it, 1, 2);
foreach ($limited as $v) {
echo $v, "\n";
}./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php repro.php
php bin/vm.php repro.php'| Runtime | Output |
|---|---|
| Zend PHP 8.x | 2 then 3 (two lines) |
| This compiler | fatal: class LimitIterator not found |
Scope (this repo)
| Piece | Path / notes |
|---|---|
| Builtin classes | new handlers under lib/VM/Builtin/ or ext/spl/ |
| Iterator protocol | reuse lib/VM.php foreach / VmIteratorWalk.php |
| v1 surface | LimitIterator, FilterIterator, AppendIterator, NoRewindIterator, InfiniteIterator |
| v2 follow-ups | MultipleIterator, GlobIterator, CachingIterator, recursive variants |
| Tests | test/compliance/cases/stdlib/spl_limit_iterator.phpt, spl_filter_iterator.phpt |
| JIT/AOT | VM-only v1 acceptable; document in capability matrix |
Implement real Iterator protocol delegation — no permanent internal_* shims.
Done when
- Repro
LimitIteratorforeach output matches Zend on VM -
FilterIteratorwith useraccept()method filters elements like Zend -
AppendIteratorchains two iterators in order -
./script/ci-fast.sh --filter 'LimitIterator|FilterIterator|AppendIterator'green - Rows added via
script/capability-matrix.php
Related
- Stdlib: SPL core structures — ArrayObject / SplQueue / SplStack / SplObjectStorage (ext/spl parity) #3330 / Stdlib: SplFileObject / SplFileInfo — SPL file iteration OOP (ext/spl parity) #3293 (SplFileObject / SplFileInfo)
- Language: foreach — array/Traversable iteration semantics parity (Zend/zend_vm_def.h, zend_compile.c) #4431 (foreach Traversable semantics)
- Stdlib: iterator_to_array() — materialize Traversable/Generator (ext/spl parity) #3100 / Stdlib: iterator_to_array() — Iterator/IteratorAggregate Traversable objects (phase 2 of #3100) #4244 (iterator_to_array Traversable phase 2)
- North star: Epic: Self-host critical path — compiler compiles itself (M3→M5) #1492
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:vmVirtual machineVirtual machineimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claimphase-4:stdlibPhase 4 – stdlib for web appsPhase 4 – stdlib for web apps
Activity
PurHur commentedon Jul 15, 2026
Verified green on master (2026-07-15): FilterIterator, LimitIterator, AppendIterator, InfiniteIterator, ParentIterator, MultipleIterator, CachingIterator, GlobIterator, NoRewindIterator all
class_existstrue. Closing meta wrappers issue — use child tickets for remaining method-level gaps.