From d1cfd87fbe9e34bf909abedb61cfa4b2d7022b4d Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Wed, 31 May 2017 14:18:19 -0700 Subject: Allow ReflectionClass::isIterable() to return true for Traversables Current behavior is essentially "Is an INTERNAL iterable class". This change allows isIterable() to return true for userspace classes as well. --- ext/reflection/php_reflection.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'ext/reflection/php_reflection.c') diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 84f4d66aeb..19975d29bc 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5131,7 +5131,12 @@ ZEND_METHOD(reflection_class, isIterable) METHOD_NOTSTATIC(reflection_class_ptr); GET_REFLECTION_OBJECT_PTR(ce); - RETURN_BOOL(ce->get_iterator != NULL); + if (ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_IMPLICIT_ABSTRACT_CLASS | + ZEND_ACC_TRAIT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { + RETURN_FALSE; + } + + RETURN_BOOL(ce->get_iterator || instanceof_function(ce, zend_ce_traversable)); } /* }}} */ -- cgit v1.2.1