summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 3d116bf333..4362c15178 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -3156,19 +3156,20 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zval *object_ptr, uint ch
if (zend_hash_num_elements(Z_ARRVAL_P(callable)) == 2) {
obj = zend_hash_index_find(Z_ARRVAL_P(callable), 0);
- if (UNEXPECTED(Z_ISREF_P(obj))) {
- obj = Z_REFVAL_P(obj);
- }
method = zend_hash_index_find(Z_ARRVAL_P(callable), 1);
- if (UNEXPECTED(Z_ISREF_P(method))) {
- method = Z_REFVAL_P(method);
- }
}
if (obj && method &&
(Z_TYPE_P(obj) == IS_OBJECT ||
Z_TYPE_P(obj) == IS_STRING) &&
Z_TYPE_P(method) == IS_STRING) {
+ if (UNEXPECTED(Z_ISREF_P(obj))) {
+ obj = Z_REFVAL_P(obj);
+ }
+ if (UNEXPECTED(Z_ISREF_P(method))) {
+ method = Z_REFVAL_P(method);
+ }
+
if (Z_TYPE_P(obj) == IS_STRING) {
if (callable_name) {
char *ptr;
@@ -3235,7 +3236,9 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zval *object_ptr, uint ch
} else {
if (zend_hash_num_elements(Z_ARRVAL_P(callable)) == 2) {
- if (!obj || (Z_TYPE_P(obj) != IS_STRING && Z_TYPE_P(obj) != IS_OBJECT)) {
+ if (!obj || (Z_ISREF_P(obj)?
+ (Z_TYPE_P(Z_REFVAL_P(obj)) != IS_STRING && Z_TYPE_P(Z_REFVAL_P(obj)) != IS_OBJECT) :
+ (Z_TYPE_P(obj) != IS_STRING && Z_TYPE_P(obj) != IS_OBJECT))) {
if (error) zend_spprintf(error, 0, "first array member is not a valid class name or object");
} else {
if (error) zend_spprintf(error, 0, "second array member is not a valid method");