diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-06-25 17:32:13 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-06-25 17:32:13 +0300 |
commit | c8f355b12cc68a804ff26d525930e723833a5abc (patch) | |
tree | 4e699fe941af7a3248025d6c8b1ab061de5c99b1 /Zend/zend_API.c | |
parent | 73f07738b9d5d4e4c8b3985e7fe276656a8ff3cc (diff) | |
download | php-git-c8f355b12cc68a804ff26d525930e723833a5abc.tar.gz |
Micro-optimization
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r-- | Zend/zend_API.c | 38 |
1 files changed, 14 insertions, 24 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; } } |