#
05f10480 |
| 20-Aug-2012 |
Nikita Popov |
Drop Generator::close() method |
Revision tags: php-5.3.16, php-5.4.6, php-5.4.6RC1 |
|
#
268740d9 |
| 26-Jul-2012 |
Nikita Popov |
Fix implementation of Iterator interface It looks like you have to implement the Iterator interface *before* assigning get_iterator. Otherwise the structure for user iterators isn't
Fix implementation of Iterator interface It looks like you have to implement the Iterator interface *before* assigning get_iterator. Otherwise the structure for user iterators isn't correctly zeroed out. Additionaly I'm setting class_entry->iterator_funcs.funcs now. Not sure if this is strictly necessary, but better safe than sorry ;)
show more ...
|
#
94b2ccae |
| 22-Jul-2012 |
Nikita Popov |
Fix throwing of exceptions within a generator If a generator threw an exception and was iterated using foreach (i.e. not manually) an infinite loop was triggered. The reason was that the
Fix throwing of exceptions within a generator If a generator threw an exception and was iterated using foreach (i.e. not manually) an infinite loop was triggered. The reason was that the exception was not properly rethrown using zend_throw_exception_internal.
show more ...
|
#
c9709bfb |
| 19-Jul-2012 |
Nikita Popov |
Remove asterix modifier (*) for generators Generators are now automatically detected by the presence of a `yield` expression in their body. This removes the ZEND_SUSPEND_AND_RET
Remove asterix modifier (*) for generators Generators are now automatically detected by the presence of a `yield` expression in their body. This removes the ZEND_SUSPEND_AND_RETURN_GENERATOR opcode. Instead additional checks for ZEND_ACC_GENERATOR are added to the fcall_common helper and zend_call_function. This also adds a new function zend_generator_create_zval, which handles the actual creation of the generator zval from an op array. I feel like I should deglobalize the zend_create_execute_data_from_op_array code a bit. It currently changes EG(current_execute_data) and EG(opline_ptr) which is somewhat confusing (given the name).
show more ...
|
Revision tags: php-5.4.5 |
|
#
85f077ce |
| 17-Jul-2012 |
Nikita Popov |
Add support by yielding by-reference |
Revision tags: php-5.3.15, php-5.3.15RC1, php-5.4.5RC1 |
|
#
ab75ed6b |
| 23-Jun-2012 |
Nikita Popov |
Disallow closing a generator during its execution If a generator is closed while it is running an E_WARNING is thrown and the call is ignored. Maybe a fatal error should be thrown instea
Disallow closing a generator during its execution If a generator is closed while it is running an E_WARNING is thrown and the call is ignored. Maybe a fatal error should be thrown instead?
show more ...
|
#
14766e14 |
| 23-Jun-2012 |
Nikita Popov |
Pass zend_generator directly to Zend VM Previously the zval* of the generator was passed into the VM by misusing EG(return_value_ptr_ptr). Now the zend_generator* itself is directly pass
Pass zend_generator directly to Zend VM Previously the zval* of the generator was passed into the VM by misusing EG(return_value_ptr_ptr). Now the zend_generator* itself is directly passed in. This saves us from always having to pass the zval* around everywhere.
show more ...
|
#
04e781f0 |
| 22-Jun-2012 |
Nikita Popov |
Implement get_iterator This implements the get_iterator handler for Generator objects, thus making direct foreach() iteration significantly faster. |
#
6233408a |
| 20-Jun-2012 |
Nikita Popov |
Fix thread safe build |
Revision tags: php-5.3.14, php-5.4.4 |
|
#
d939d2de |
| 11-Jun-2012 |
Nikita Popov |
Add sceleton for yield* expression This does not yet actually implement any delegation. |
#
f169b26d |
| 08-Jun-2012 |
Nikita Popov |
Fix backtraces and func_get_args() To make the generator function show up in backtraces one has to insert an additional execute_data into the chain, as prev_execute_data->function_state
Fix backtraces and func_get_args() To make the generator function show up in backtraces one has to insert an additional execute_data into the chain, as prev_execute_data->function_state is used to determine the called function. Adding the additional stack frame is also required for func_get_args(), as the arguments are fetched from there too. The arguments have to be copied in order to keep them around. Due to the way they are saved doing so is quite ugly, so I added another function zend_copy_arguments to zend_execute.c which handles this.
show more ...
|
#
40760ecb |
| 03-Jun-2012 |
Nikita Popov |
Fix cloning of generator methods Forgot to add a reference to the this variable |
#
bf82f46e |
| 03-Jun-2012 |
Nikita Popov |
Properly handle yield during method calls |
#
7b3bfa57 |
| 03-Jun-2012 |
Nikita Popov |
Improve backtraces from generators The current situation is still not perfect, as the generator function itself does not appear in the stack trace. This makes sense in some way, but it
Improve backtraces from generators The current situation is still not perfect, as the generator function itself does not appear in the stack trace. This makes sense in some way, but it would probably be more helpful if it would show up (with the bound arguments) after the $generator->xyz() call. This could be misleading too though as the function is not *really* called there.
show more ...
|
#
6117f4c7 |
| 02-Jun-2012 |
Nikita Popov |
Add cloning support for generators Generators can now be cloned. I'm pretty sure that my current code does not yet cover all the edge cases of cloning the execution context, so there are
Add cloning support for generators Generators can now be cloned. I'm pretty sure that my current code does not yet cover all the edge cases of cloning the execution context, so there are probably a few bugs in there :)
show more ...
|
#
1477be9a |
| 31-May-2012 |
Nikita Popov |
Make $generator->send() return the current value This makes the API easier to use (and is consistent with Python and JS). |
#
ee89e228 |
| 30-May-2012 |
Nikita Popov |
Allow yielding during function calls During function calls arguments are pushed onto the stack. Now these are backed up on yield and restored on resume. This requires memcpy'ing them,
Allow yielding during function calls During function calls arguments are pushed onto the stack. Now these are backed up on yield and restored on resume. This requires memcpy'ing them, but there doesn't seem to be any better way to do it. Also this fixes the issue with exceptions thrown during function calls.
show more ...
|
Revision tags: php-5.3.14RC2, php-5.4.4RC2 |
|
#
87901602 |
| 30-May-2012 |
Nikita Popov |
Add auto-increment keys When no key is explicitely yielded PHP will used auto-incrementing keys as a fallback. They behave the same as with arrays, i.e. the key is the successor of t
Add auto-increment keys When no key is explicitely yielded PHP will used auto-incrementing keys as a fallback. They behave the same as with arrays, i.e. the key is the successor of the largest previously used integer key.
show more ...
|
#
bc08c2cf |
| 30-May-2012 |
Nikita Popov |
Add support for yielding keys Keys are yielded using the yield $key => $value syntax. Currently this is implemented as a statement only and not as an expression, be
Add support for yielding keys Keys are yielded using the yield $key => $value syntax. Currently this is implemented as a statement only and not as an expression, because conflicts arise considering nesting and use in arrays: yield yield $a => $b; // could be either yield (yield $a) => $b; // or yield (yield $a => $b); Once I find some way to resolve these conflicts this should be available as an expression too. Also the key yielding code is rather copy-and-past-y for the value yielding code, so that should be factored out.
show more ...
|
#
72a91d08 |
| 29-May-2012 |
Nikita Popov |
Add $generator->close() method Calling $generator->close() is equivalent to executing a return statement at the current position in the generator. |
#
12e92831 |
| 29-May-2012 |
Nikita Popov |
Fix segfault when send()ing to a closed generator |
#
3600914c |
| 29-May-2012 |
Nikita Popov |
Add support for $generator->send() Yield now is an expression and the return value is the value passed to $generator->send(). By default (i.e. if ->next() is called) the value is NUL
Add support for $generator->send() Yield now is an expression and the return value is the value passed to $generator->send(). By default (i.e. if ->next() is called) the value is NULL. Unlike in Python ->send() can be run without priming the generator with a ->next() call first.
show more ...
|
#
4aab08b6 |
| 28-May-2012 |
Nikita Popov |
Properly free resources when generator return value not used To keep things clean two new functions are introduced: zend_clean_and_cache_symbol_table(HashTable *symbol_table) ze
Properly free resources when generator return value not used To keep things clean two new functions are introduced: zend_clean_and_cache_symbol_table(HashTable *symbol_table) zend_free_compiled_variables(zval ***CVs, int num)
show more ...
|
#
bcc7d976 |
| 27-May-2012 |
Nikita Popov |
Set EG(current_execute_data) This fixes several issues. In particular it makes method generators work properly and also allows generators using a symbol table. |
#
64a643a4 |
| 27-May-2012 |
Nikita Popov |
Free loop variables If the generator is closed before it has finished running, it may happen that some FREE or SWITCH_FREE opcodes haven't been executed and memory is leaked.
Free loop variables If the generator is closed before it has finished running, it may happen that some FREE or SWITCH_FREE opcodes haven't been executed and memory is leaked. This fixes it by walking the brk_cont_array and manually freeing the variables.
show more ...
|