diff options
-rw-r--r-- | Zend/zend_API.c | 38 | ||||
-rw-r--r-- | ext/reflection/php_reflection.c | 31 |
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); |