diff options
-rw-r--r-- | ext/reflection/php_reflection.c | 27 | ||||
-rw-r--r-- | ext/reflection/tests/ReflectionReference.phpt | 15 |
2 files changed, 40 insertions, 2 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index c91d1e199e..3e21e415dc 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -6182,7 +6182,7 @@ ZEND_METHOD(reflection_reference, fromArrayElement) } /* Treat singleton reference as non-reference. */ - if (Z_TYPE_P(item) != IS_REFERENCE || Z_REFCOUNT_P(item) == 1) { + if (Z_TYPE_P(item) != IS_REFERENCE) { RETURN_NULL(); } @@ -6230,6 +6230,30 @@ ZEND_METHOD(reflection_reference, getId) } /* }}} */ +/* {{{ proto public int ReflectionReference::getRefcount() + * Returns reference count of the held reference. + * ReflectionReference itself increases the refcount, as such: + * * Refcount 1 indicates that the reference is only held by this ReflectionReference. + * * Refcount 2 indicates that it is a singleton reference (often not treated as a reference). + * * Refcount 3 or higher is an ordinary shared reference. */ +ZEND_METHOD(reflection_reference, getRefcount) +{ + reflection_object *intern; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + + intern = Z_REFLECTION_P(getThis()); + if (Z_TYPE(intern->obj) != IS_REFERENCE) { + _DO_THROW("Corrupted ReflectionReference object"); + return; + } + + RETURN_LONG(Z_REFCOUNT(intern->obj)); +} +/* }}} */ + /* {{{ method tables */ static const zend_function_entry reflection_exception_functions[] = { PHP_FE_END @@ -6719,6 +6743,7 @@ ZEND_END_ARG_INFO() static const zend_function_entry reflection_reference_functions[] = { ZEND_ME(reflection_reference, fromArrayElement, arginfo_reflection_reference_fromArrayElement, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME(reflection_reference, getId, arginfo_reflection__void, ZEND_ACC_PUBLIC) + ZEND_ME(reflection_reference, getRefcount, arginfo_reflection__void, ZEND_ACC_PUBLIC) /* Always throwing dummy methods */ ZEND_ME(reflection, __clone, arginfo_reflection__void, ZEND_ACC_PRIVATE) diff --git a/ext/reflection/tests/ReflectionReference.phpt b/ext/reflection/tests/ReflectionReference.phpt index 2963c30232..ff933063be 100644 --- a/ext/reflection/tests/ReflectionReference.phpt +++ b/ext/reflection/tests/ReflectionReference.phpt @@ -13,12 +13,20 @@ echo "fromArrayElement():\n"; $r0 = ReflectionReference::fromArrayElement($ary, 0); var_dump($r0 === null); $r1 = ReflectionReference::fromArrayElement($ary, 1); -var_dump($r1 === null); +var_dump($r1 instanceof ReflectionReference); $r2 = ReflectionReference::fromArrayElement($ary, 2); var_dump($r2 instanceof ReflectionReference); $r3 = ReflectionReference::fromArrayElement($ary, 3); var_dump($r2 instanceof ReflectionReference); +echo "getRefcount():\n"; +var_dump($r1->getRefcount()); +var_dump($r2->getRefcount()); +var_dump($r3->getRefcount()); + +unset($ary[1]); +var_dump($r1->getRefcount()); + echo "getId() #1:\n"; var_dump($r2->getId() === $r2->getId()); var_dump($r3->getId() === $r3->getId()); @@ -47,6 +55,11 @@ bool(true) bool(true) bool(true) bool(true) +getRefcount(): +int(2) +int(3) +int(3) +int(1) getId() #1: bool(true) bool(true) |