From d965991205d1b659689c692af86b727bcb5b73a2 Mon Sep 17 00:00:00 2001 From: Craig Duncan Date: Sat, 12 Dec 2015 17:54:33 +0000 Subject: [PATCH 1/2] Throw an exception when attempting to count a generator --- Zend/zend_generators.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index 777adb56b0501..01e7d3d6b0ab4 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -977,6 +977,13 @@ ZEND_METHOD(Generator, __wakeup) } /* }}} */ +/* count_elements implementation */ +static void zend_generator_count_elements(zval *object, zend_long *count) /* {{{ */ +{ + zend_throw_exception(NULL, "Counting of 'Generator' is not allowed", 0); +} +/* }}} */ + /* get_iterator implementation */ static void zend_generator_iterator_dtor(zend_object_iterator *iterator) /* {{{ */ @@ -1129,6 +1136,7 @@ void zend_register_generator_ce(void) /* {{{ */ zend_generator_handlers.dtor_obj = zend_generator_dtor_storage; zend_generator_handlers.clone_obj = NULL; zend_generator_handlers.get_constructor = zend_generator_get_constructor; + zend_generator_handlers.count_elements = zend_generator_count_elements; INIT_CLASS_ENTRY(ce, "ClosedGeneratorException", NULL); zend_ce_ClosedGeneratorException = zend_register_internal_class_ex(&ce, zend_ce_exception); From 9895754f86a026d7ef85d9494522145000f246ba Mon Sep 17 00:00:00 2001 From: Craig Duncan Date: Sat, 12 Dec 2015 17:54:57 +0000 Subject: [PATCH 2/2] Add a test for counting generators --- Zend/tests/generators/errors/count_error.phpt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Zend/tests/generators/errors/count_error.phpt diff --git a/Zend/tests/generators/errors/count_error.phpt b/Zend/tests/generators/errors/count_error.phpt new file mode 100644 index 0000000000000..ecb38233a4ac8 --- /dev/null +++ b/Zend/tests/generators/errors/count_error.phpt @@ -0,0 +1,21 @@ +--TEST-- +Generators can't be counted +--FILE-- + +--EXPECTF-- +Exception: Counting of 'Generator' is not allowed in %s:%d +Stack trace: +#0 %s(%d): count(Object(Generator)) +#1 {main}