summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2005-10-25 23:19:59 +0000
committerMarcus Boerger <helly@php.net>2005-10-25 23:19:59 +0000
commit2486b846ccdb070476f506477d8b5caafe3d505f (patch)
treef294039c1543c33bf8f63a5ff4bc47829bf32780 /Zend/zend_API.c
parentaf888a4807b220886e209435b623c12fa4b94a60 (diff)
downloadphp-git-2486b846ccdb070476f506477d8b5caafe3d505f.tar.gz
- MFH zend_is_callable_ex() returns zend_class_entry* if available
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 5e7c4fc9da..584d7a1ec3 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -1945,23 +1945,28 @@ ZEND_API int zend_disable_class(char *class_name, uint class_name_length TSRMLS_
return 1;
}
-ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **callable_name, int *callable_name_len, zend_function **fptr_ptr, zval ***zobj_ptr_ptr TSRMLS_DC)
+ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **callable_name, int *callable_name_len, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval ***zobj_ptr_ptr TSRMLS_DC)
{
char *lcname;
zend_bool retval = 0;
int callable_name_len_local;
+ zend_class_entry *ce_local;
zend_function *fptr_local;
zval **zobj_ptr_local;
if (callable_name_len == NULL) {
callable_name_len = &callable_name_len_local;
}
+ if (ce_ptr == NULL) {
+ ce_ptr = &ce_local;
+ }
if (fptr_ptr == NULL) {
fptr_ptr = &fptr_local;
}
if (zobj_ptr_ptr == NULL) {
zobj_ptr_ptr = &zobj_ptr_local;
}
+ *ce_ptr = NULL;
*fptr_ptr = NULL;
*zobj_ptr_ptr = NULL;
@@ -1984,9 +1989,9 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **
case IS_ARRAY:
{
+ zend_class_entry *ce = NULL, **pce;
zval **method;
zval **obj;
- zend_class_entry *ce = NULL, **pce;
if (zend_hash_num_elements(Z_ARRVAL_P(callable)) == 2 &&
zend_hash_index_find(Z_ARRVAL_P(callable), 0, (void **) &obj) == SUCCESS &&
@@ -2007,8 +2012,10 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **
memcpy(ptr, Z_STRVAL_PP(method), Z_STRLEN_PP(method) + 1);
}
- if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY)
+ if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) {
+ *ce_ptr = ce;
return 1;
+ }
lcname = zend_str_tolower_dup(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj));
@@ -2038,8 +2045,10 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **
memcpy(ptr, Z_STRVAL_PP(method), Z_STRLEN_PP(method) + 1);
}
- if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY)
+ if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) {
+ *ce_ptr = ce;
return 1;
+ }
}
if (ce) {
@@ -2077,6 +2086,7 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **
*callable_name = estrndup("Array", sizeof("Array")-1);
*callable_name_len = sizeof("Array") - 1;
}
+ *ce_ptr = ce;
}
break;
@@ -2101,7 +2111,7 @@ ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, char **cal
{
TSRMLS_FETCH();
- return zend_is_callable_ex(callable, check_flags, callable_name, NULL, NULL, NULL TSRMLS_CC);
+ return zend_is_callable_ex(callable, check_flags, callable_name, NULL, NULL, NULL, NULL TSRMLS_CC);
}
@@ -2112,7 +2122,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRML
zend_class_entry **pce;
int class_name_len;
- if (zend_is_callable_ex(callable, 0, callable_name, NULL, NULL, NULL TSRMLS_CC)) {
+ if (zend_is_callable_ex(callable, 0, callable_name, NULL, NULL, NULL, NULL TSRMLS_CC)) {
return 1;
}
switch (Z_TYPE_P(callable)) {