summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2008-07-14 12:18:23 +0000
committerDmitry Stogov <dmitry@php.net>2008-07-14 12:18:23 +0000
commit0fa7fedfde33e7fd50fe935d4951caaad35b4241 (patch)
treec44ff314d43264eba1b9ccda44e2e8c2411cb4bc /Zend/zend_API.c
parentbc12bc69aaf6395d412c66a1a08f9f6cc4a6f57f (diff)
downloadphp-git-0fa7fedfde33e7fd50fe935d4951caaad35b4241.tar.gz
Fixed is_callable() to support closures and return appropriate function name
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 68f0c7880c..358feff3c9 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -2619,8 +2619,12 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, uint check_flags, char **
case IS_OBJECT:
if (zend_get_closure(callable, ce_ptr, fptr_ptr, NULL, zobj_ptr_ptr TSRMLS_CC) == SUCCESS) {
if (callable_name) {
- *callable_name_len = strlen((*fptr_ptr)->common.function_name);
- *callable_name = estrndup((*fptr_ptr)->common.function_name, *callable_name_len);
+ zend_class_entry *ce = Z_OBJCE_P(callable); /* TBFixed: what if it's overloaded? */
+
+ *callable_name_len = ce->name_length + sizeof("::__invoke") - 1;
+ *callable_name = emalloc(*callable_name_len + 1);
+ memcpy(*callable_name, ce->name, ce->name_length);
+ memcpy((*callable_name) + ce->name_length, "::__invoke", sizeof("::__invoke"));
}
return 1;
}