diff options
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r-- | ext/standard/array.c | 36 |
1 files changed, 7 insertions, 29 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index 0a329cea89..9c17290e3d 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -980,37 +980,15 @@ static int php_array_walk(HashTable *target_hash, zval **userdata TSRMLS_DC) zval_ptr_dtor(&retval_ptr); } else { - if (Z_TYPE_PP(BG(array_walk_func_name)) == IS_STRING) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s() - function does not exist", - (*BG(array_walk_func_name))->value.str.val); - } else if (Z_TYPE_PP(BG(array_walk_func_name)) == IS_ARRAY) { - char *obj_name = NULL; - zval **obj; - zval **mt_name; - - if (zend_hash_index_find(Z_ARRVAL_PP(BG(array_walk_func_name)), - 0, (void **)&obj) == SUCCESS - && zend_hash_index_find(Z_ARRVAL_PP(BG(array_walk_func_name)), - 1, (void **)&mt_name) == SUCCESS - && Z_TYPE_PP(mt_name) == IS_STRING) { - switch (Z_TYPE_PP(obj)) { - case IS_OBJECT: - obj_name = Z_OBJ_PP(obj)->ce->name; - break; - - case IS_STRING: - obj_name = Z_STRVAL_PP(obj); - break; - } - } + char *func_name; - if (obj_name != NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s::%s() - function does not exist", - obj_name, Z_STRVAL_PP(mt_name)); - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid function name"); - } + if (zend_is_callable(*BG(array_walk_func_name), 0, &func_name)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s()", func_name); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call %s() - function does not exist", func_name); } + + efree(func_name); break; } |