Category
php-in-php · refs #1492
Problem
lib/JIT/IteratorHelper.php (~725 lines) implements foreach iterator protocol, by-ref foreach guards, object-key traversal, and hashtable index slots directly in LLVM. VM already walks arrays/objects/generators in PHP (lib/VM.php opcode handlers + iterator state).
Duplicate logic causes foreach drift (by-ref on iterators, IteratorAggregate, generator re-entry) between VM and JIT.
php-src reference
Repro
test/repro/foreach_jit_vm_agree.php:
<?php
declare(strict_types=1);
class Agg implements IteratorAggregate {
public function getIterator(): Generator {
yield 'k' => 'v';
}
}
$out = [];
foreach (new Agg() as $k => $v) {
$out[] = "$k=$v";
}
echo implode(',', $out), "\n";
$g = (function (): Generator { yield 1; yield 2; })();
$sum = 0;
foreach ($g as $n) { $sum += $n; }
echo "sum=$sum\n";
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php bin/vm.php test/repro/foreach_jit_vm_agree.php
php bin/jit.php test/repro/foreach_jit_vm_agree.php'
Expected both: k=v and sum=3. JIT mismatch = bug.
Scope (PHP-in-PHP first)
| Path |
Work |
New/existing lib/VM/IteratorSupport.php |
Shared FE_FETCH semantics for VM + JIT callback |
lib/JIT/IteratorHelper.php |
Trampoline to compiled PHP helper; delete per-opcode LLVM |
lib/JIT/IteratorProtocolHelper.php |
Fold into PHP path where duplicated |
| Tests |
test/compliance/cases/language/foreach_jit_vm_agree.phpt |
Done when
Verification
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit --filter ForeachJit'
Related
Category
php-in-php· refs #1492Problem
lib/JIT/IteratorHelper.php(~725 lines) implements foreach iterator protocol, by-ref foreach guards, object-key traversal, and hashtable index slots directly in LLVM. VM already walks arrays/objects/generators in PHP (lib/VM.phpopcode handlers + iterator state).Duplicate logic causes foreach drift (by-ref on iterators,
IteratorAggregate, generator re-entry) between VM and JIT.php-src reference
Zend/zend_execute.c—ZEND_FE_FETCH_*, iterator opsZend/zend_iterators.c—zend_iterator_*Repro
test/repro/foreach_jit_vm_agree.php:Expected both:
k=vandsum=3. JIT mismatch = bug.Scope (PHP-in-PHP first)
lib/VM/IteratorSupport.phplib/JIT/IteratorHelper.phplib/JIT/IteratorProtocolHelper.phptest/compliance/cases/language/foreach_jit_vm_agree.phptDone when
Iteratorthrows before body (Language: property hook foreach by-reference on get-only hook — must Error before loop body (re-#6435, Zend/zend_property_hooks.c) #9761 pattern) via shared PHP guardIteratorHelper.php≤ ~100 lines (glue only)./script/ci-fast.sh --filter ForeachJitgreenVerification
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit --filter ForeachJit'Related