cvs: ZendEngine2(PHP_5_1) / zend_API.c
| From: | Marcus Boerger | Date: | Thu, 03 Nov 2005 23:45:28 +0000 |
| Subject: | cvs: ZendEngine2(PHP_5_1) / zend_API.c | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-4320@lists.php.net to get a copy of this message | ||
helly Thu Nov 3 18:45:28 2005 EDT
Modified files: (Branch: PHP_5_1)
/ZendEngine2 zend_API.c
Log:
- Fix static check in zend_is_callable_ex()
- Fix/speedup zend_make_callable()
# Actually the ...STATIC... flag in zend_is_callable_ex() *must* go, too.
# We keep it for the moment to support old stuff and skip analyzing them
# in detail...
http://cvs.php.net/diff.php/ZendEngine2/zend_API.c?r1=1.296.2.8&r2=1.296.2.9&ty=u
Index: ZendEngine2/zend_API.c
diff -u ZendEngine2/zend_API.c:1.296.2.8 ZendEngine2/zend_API.c:1.296.2.9
--- ZendEngine2/zend_API.c:1.296.2.8 Wed Nov 2 15:30:13 2005
+++ ZendEngine2/zend_API.c Thu Nov 3 18:45:18 2005
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_API.c,v 1.296.2.8 2005/11/02 20:30:13 helly Exp $ */
+/* $Id: zend_API.c,v 1.296.2.9 2005/11/03 23:45:18 helly Exp $ */
#include "zend.h"
#include "zend_execute.h"
@@ -1996,6 +1996,7 @@
efree(lmname);
return 0;
}
+ efree(lcname);
*ce_ptr = *pce;
ftable = &(*ce_ptr)->function_table;
} else {
@@ -2007,11 +2008,8 @@
if (zend_hash_find(ftable, lmname, mlen+1, (void**)fptr_ptr) == SUCCESS) {
retval = 1;
}
- if (*ce_ptr) {
- efree(lcname);
- if (!((*fptr_ptr)->common.fn_flags & ZEND_ACC_STATIC)) {
- retval = 0;
- }
+ if (*ce_ptr && *fptr_ptr && !((*fptr_ptr)->common.fn_flags &
ZEND_ACC_STATIC)) {
+ retval = 0;
}
efree(lmname);
break;
@@ -2097,17 +2095,12 @@
}
}
}
- if (retval) {
- if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) != 0 &&
(fbc->common.fn_flags & ZEND_ACC_STATIC) == 0) {
- retval = 0;
- } else {
- *fptr_ptr = fbc;
- }
- }
+ *fptr_ptr = fbc;
}
/* check for __call too */
if (retval == 0 && *zobj_ptr_ptr && ce->__call != 0) {
retval = 1;
+ *fptr_ptr = ce->__call;
}
efree(lcname);
}
@@ -2115,7 +2108,7 @@
*callable_name = estrndup("Array", sizeof("Array")-1);
*callable_name_len = sizeof("Array") - 1;
}
- if (!*zobj_ptr_ptr && (!*fptr_ptr || !((*fptr_ptr)->common.fn_flags &
ZEND_ACC_STATIC))) {
+ if ((check_flags & IS_CALLABLE_CHECK_IS_STATIC) != 0 && !*zobj_ptr_ptr &&
(!*fptr_ptr || !((*fptr_ptr)->common.fn_flags & ZEND_ACC_STATIC))) {
retval = 0;
}
*ce_ptr = ce;
@@ -2149,36 +2142,20 @@
ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRMLS_DC)
{
- char *lcname, *func, *class_name;
- zend_bool retval = 0;
- zend_class_entry **pce;
- int class_name_len;
+ zend_class_entry *ce;
+ zend_function *fptr;
+ zval **zobj_ptr;
- if (zend_is_callable_ex(callable, 0, callable_name, NULL, NULL, NULL, NULL TSRMLS_CC)) {
+ if (zend_is_callable_ex(callable, 0, callable_name, NULL, &ce, &fptr, &zobj_ptr
TSRMLS_CC)) {
+ if (Z_TYPE_P(callable) == IS_STRING && ce) {
+ zval_dtor(callable);
+ array_init(callable);
+ add_next_index_string(callable, ce->name, 1);
+ add_next_index_string(callable, fptr->common.function_name, 1);
+ }
return 1;
}
- switch (Z_TYPE_P(callable)) {
- case IS_STRING:
- lcname = zend_str_tolower_dup(Z_STRVAL_P(callable), Z_STRLEN_P(callable));
-
- if ((func = strstr(lcname, "::")) != NULL) {
- *func = '\0';
- class_name_len = func - lcname;
- class_name = estrndup(Z_STRVAL_P(callable), class_name_len);
- if (zend_lookup_class(class_name, class_name_len, &pce TSRMLS_CC) == SUCCESS) {
- zval_dtor(callable);
- array_init(callable);
- add_next_index_stringl(callable, lcname, class_name_len, 1);
- func += 2;
- add_next_index_stringl(callable, func, strlen(func), 1);
- retval = 1;
- }
- efree(class_name);
- }
- efree(lcname);
- break;
- }
- return retval;
+ return 0;
}