summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_API.c38
-rw-r--r--ext/reflection/php_reflection.c31
2 files changed, 30 insertions, 39 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index a4e501217e..c95ce058a4 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -3009,37 +3009,27 @@ static zend_always_inline int zend_is_callable_check_func(int check_flags, zval
if (!ce_org) {
zend_string *lmname;
- /* Skip leading \ */
- if (UNEXPECTED(Z_STRVAL_P(callable)[0] == '\\')) {
- ZSTR_ALLOCA_INIT(lmname, Z_STRVAL_P(callable) + 1, Z_STRLEN_P(callable) - 1, use_heap);
- } else {
- lmname = Z_STR_P(callable);
- }
/* Check if function with given name exists.
* This may be a compound name that includes namespace name */
- zv = zend_hash_find(EG(function_table), lmname);
- if (EXPECTED(zv != NULL)) {
- fcc->function_handler = Z_PTR_P(zv);
- if (lmname != Z_STR_P(callable)) {
- ZSTR_ALLOCA_FREE(lmname, use_heap);
- }
- return 1;
+ if (UNEXPECTED(Z_STRVAL_P(callable)[0] == '\\')) {
+ /* Skip leading \ */
+ ZSTR_ALLOCA_ALLOC(lmname, Z_STRLEN_P(callable) - 1, use_heap);
+ zend_str_tolower_copy(ZSTR_VAL(lmname), Z_STRVAL_P(callable) + 1, Z_STRLEN_P(callable));
+ zv = zend_hash_find(EG(function_table), lmname);
+ ZSTR_ALLOCA_FREE(lmname, use_heap);
} else {
- if (lmname == Z_STR_P(callable)) {
- ZSTR_ALLOCA_INIT(lmname, Z_STRVAL_P(callable), Z_STRLEN_P(callable), use_heap);
- } else {
- zend_string_forget_hash_val(lmname);
- }
- zend_str_tolower(ZSTR_VAL(lmname), ZSTR_LEN(lmname));
+ lmname = Z_STR_P(callable);
zv = zend_hash_find(EG(function_table), lmname);
- if (zv != NULL) {
- fcc->function_handler = Z_PTR_P(zv);
+ if (!zv) {
+ ZSTR_ALLOCA_ALLOC(lmname, Z_STRLEN_P(callable), use_heap);
+ zend_str_tolower_copy(ZSTR_VAL(lmname), Z_STRVAL_P(callable), Z_STRLEN_P(callable));
+ zv = zend_hash_find(EG(function_table), lmname);
ZSTR_ALLOCA_FREE(lmname, use_heap);
- return 1;
}
}
- if (lmname != Z_STR_P(callable)) {
- ZSTR_ALLOCA_FREE(lmname, use_heap);
+ if (EXPECTED(zv != NULL)) {
+ fcc->function_handler = Z_PTR_P(zv);
+ return 1;
}
}
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index b816106e25..77b601d529 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -1538,11 +1538,9 @@ ZEND_METHOD(reflection_function, __construct)
zval name;
zval *object;
zval *closure = NULL;
- char *lcname, *nsname;
reflection_object *intern;
zend_function *fptr;
- char *name_str;
- size_t name_len;
+ zend_string *fname, *lcname;
object = getThis();
intern = Z_REFLECTION_P(object);
@@ -1551,26 +1549,29 @@ ZEND_METHOD(reflection_function, __construct)
fptr = (zend_function*)zend_get_closure_method_def(closure);
Z_ADDREF_P(closure);
} else {
- if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "s", &name_str, &name_len) == FAILURE) {
+ ALLOCA_FLAG(use_heap)
+
+ if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "S", &fname) == FAILURE) {
return;
}
- lcname = zend_str_tolower_dup(name_str, name_len);
-
- /* Ignore leading "\" */
- nsname = lcname;
- if (lcname[0] == '\\') {
- nsname = &lcname[1];
- name_len--;
+ if (UNEXPECTED(ZSTR_VAL(fname)[0] == '\\')) {
+ /* Ignore leading "\" */
+ ZSTR_ALLOCA_ALLOC(lcname, ZSTR_LEN(fname) - 1, use_heap);
+ zend_str_tolower_copy(ZSTR_VAL(lcname), ZSTR_VAL(fname) + 1, ZSTR_LEN(fname) - 1);
+ fptr = zend_hash_find_ptr(EG(function_table), lcname);
+ ZSTR_ALLOCA_FREE(lcname, use_heap);
+ } else {
+ lcname = zend_string_tolower(fname);
+ fptr = zend_hash_find_ptr(EG(function_table), lcname);
+ zend_string_release(lcname);
}
- if ((fptr = zend_hash_str_find_ptr(EG(function_table), nsname, name_len)) == NULL) {
- efree(lcname);
+ if (fptr == NULL) {
zend_throw_exception_ex(reflection_exception_ptr, 0,
- "Function %s() does not exist", name_str);
+ "Function %s() does not exist", ZSTR_VAL(fname));
return;
}
- efree(lcname);
}
ZVAL_STR_COPY(&name, fptr->common.function_name);