On 01/22/2016 10:29 PM, Bob Weinand wrote:
Am 22.01.2016 um 15:43 schrieb Dmitry Stogov <dmi...@zend.com
<mailto:dmi...@zend.com>>:
Hi,
Could you please, take a look into the PoC.
It's incomplete, but may be you get ideas how to fix this.
https://gist.github.com/dstogov/285024375d15cacf2a9b
Few tests are failed, because YIELD may be used as expression in
nested calls (between INIT_FCALL/DO_FCALL), and the caller function
restores EG(vm_stack_top), loosing and overwriting that active frame.
<?php
function gen() {
var_dump(yield 1);
}
for ($gen = gen(); $gen->valid(); $gen->send(0)) {
var_dump($gen->current());
}
?>
Thanks. Dmitry.
Hey, that's pretty similar to what I did
https://github.com/php/php-src/commit/0f0471a9893230918084798d4e35db37d7b4519d
<https://github.com/php/php-src/compare/master...bwoebi:stackless_generators> in
that old patch, which you rejected because we hadn't found any
solution for that issue with yield inside calls.
yes, this is similar.
We basically need a way to properly first fetch the args (beware:
func_arg fetches...) before instantiating the call frame, an issue
which for example could be solved if we applied my
vm_stack_restructuring patch (because it only installs call frames
after all args were fetched).
I thought about that approach, but the amount of changes doesn't worth
the result. Doing this only for generators doesn't make a lot of sense.
I believe this patch won't work without significant refactoring (like
vm_stack_refactoring branch) … so, either we bite the bullet and look
at that patch again, or we can forget this idea too.
most probably, you are right.
Thanks. Dmitry.
Thanks,
Bob