Skip to content

Language: foreach over Iterator / IteratorAggregate objects (#3234)#3245

Merged
PurHur merged 1 commit into
masterfrom
agent/issue-3234-foreach-iterator
May 30, 2026
Merged

Language: foreach over Iterator / IteratorAggregate objects (#3234)#3245
PurHur merged 1 commit into
masterfrom
agent/issue-3234-foreach-iterator

Conversation

@PurHur
Copy link
Copy Markdown
Owner

@PurHur PurHur commented May 29, 2026

Summary

  • VM TYPE_ITER_* opcodes now drive user Iterator / IteratorAggregate objects via rewind() / valid() / current() / key() / next() (Zend zend_iterators.c parity).
  • IteratorAggregate::getIterator() is resolved on reset; non-iterable objects raise TypeError instead of LogicException.
  • Adds compliance PHPT fixtures and documents the construct in capabilities-syntax.md (VM-only; JIT deferred).

php-src reference

  • Zend/zend_iterators.c — iterator helpers
  • Zend/zend_execute.cZEND_FE_RESET_R, ZEND_FE_FETCH_R

Test plan

  • ./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit --filter foreach_iterator'
  • Issue repro: Iterator + IteratorAggregate print expected lines on VM
  • Non-iterable object exits 255 with TypeError
  • JIT lowering for object foreach (phase 2 — VM fallback acceptable v1)

Closes #3234

Made with Cursor

Merge Iterator protocol dispatch with object property foreach on master.

Co-authored-by: Cursor <cursoragent@cursor.com>
@PurHur PurHur force-pushed the agent/issue-3234-foreach-iterator branch from 405a009 to 86d06ec Compare May 30, 2026 16:45
@PurHur PurHur merged commit 6164d6b into master May 30, 2026
@PurHur PurHur deleted the agent/issue-3234-foreach-iterator branch May 30, 2026 16:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Language: foreach over Traversable / Iterator objects (Zend parity)

1 participant