return 1;
}
-ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, zval *callable_name, zend_function **fptr_ptr, zval ***zobj_ptr_ptr TSRMLS_DC)
+ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, zval *callable_name, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval ***zobj_ptr_ptr TSRMLS_DC)
{
unsigned int lcname_len;
char *lcname;
zend_bool retval = 0;
+ zend_class_entry *ce;
zend_function *fptr_local;
zval **zobj_ptr_local;
+ if (ce_ptr == NULL) {
+ ce_ptr = &ce;
+ }
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;
case IS_ARRAY:
{
+ zend_class_entry **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 &&
}
}
- if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY)
+ if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) {
+ *ce_ptr = ce;
return 1;
+ }
lcname = zend_u_str_case_fold(Z_TYPE_PP(obj), Z_UNIVAL_PP(obj), Z_UNILEN_PP(obj), 1, &lcname_len);
}
}
- if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY)
+ if (check_flags & IS_CALLABLE_CHECK_SYNTAX_ONLY) {
+ *ce_ptr = ce;
return 1;
+ }
}
if (ce) {
} else if (callable_name) {
ZVAL_ASCII_STRINGL(callable_name, "Array", sizeof("Array")-1, 1);
}
+ *ce_ptr = ce;
}
break;
{
TSRMLS_FETCH();
- return zend_is_callable_ex(callable, check_flags, callable_name, NULL, NULL TSRMLS_CC);
+ return zend_is_callable_ex(callable, check_flags, callable_name, NULL, NULL, NULL TSRMLS_CC);
}
zend_class_entry **pce;
int class_name_len;
- if (zend_is_callable_ex(callable, 0, callable_name, NULL, NULL TSRMLS_CC)) {
+ if (zend_is_callable_ex(callable, 0, callable_name, NULL, NULL, NULL TSRMLS_CC)) {
return 1;
}
switch (Z_TYPE_P(callable)) {
#define IS_CALLABLE_CHECK_NO_ACCESS (1<<1)
#define IS_CALLABLE_CHECK_IS_STATIC (1<<2)
-ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, zval *callable_name, zend_function **fptr_ptr, zval ***zobj_ptr_ptr TSRMLS_DC);
+ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, zval *callable_name, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zval ***zobj_ptr_ptr TSRMLS_DC);
ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, zval *callable_name);
ZEND_API zend_bool zend_make_callable(zval *callable, zval *callable_name TSRMLS_DC);
ZEND_API char *zend_get_module_version(char *module_name);