On Fri, September 19, 2014 12:57, Nikita Popov wrote: > On Fri, Sep 19, 2014 at 12:39 PM, Anatol Belski <a...@php.net> wrote: > > >> Commit: 6bbebc60ea0de6ce09ea45094b3bed1823d96cec >> Author: Anatol Belski <a...@php.net> Fri, 19 Sep 2014 12:39:17 >> +0200 >> Parents: d8de53d498cf75936c9cd6781456c39b01f5af60 >> Branches: master >> >> >> Link: >> http://git.php.net/?p=php-src.git;a=commitdiff;h=6bbebc60ea0de6ce09ea450 >> 94b3bed1823d96cec >> >> >> Log: >> avoid multiple strlen calls for the same buffer >> >> Changed paths: >> M Zend/zend_virtual_cwd.c >> >> >> >> Diff: >> diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c index >> 665829d..acc83ec 100644 >> --- a/Zend/zend_virtual_cwd.c >> +++ b/Zend/zend_virtual_cwd.c >> @@ -1442,16 +1442,20 @@ CWD_API char *virtual_realpath(const char *path, >> char *real_path TSRMLS_DC) /* { if (VCWD_GETCWD(cwd, MAXPATHLEN)) { path >> = cwd; >> } >> - } else if (!IS_ABSOLUTE_PATH(path, strlen(path))) { >> - CWD_STATE_COPY(&new_state, &CWDG(cwd)); >> } else { >> - new_state.cwd = (char*)emalloc(1); >> - if (new_state.cwd == NULL) { >> - retval = NULL; >> - goto end; >> + size_t path_len = strlen(path); >> + >> + if (!IS_ABSOLUTE_PATH(path, path_len)) { >> + CWD_STATE_COPY(&new_state, &CWDG(cwd)); >> + } else { >> + new_state.cwd = (char*)emalloc(1); >> + if (new_state.cwd == NULL) { >> + retval = NULL; >> + goto end; >> + } >> + new_state.cwd[0] = '\0'; >> + new_state.cwd_length = 0; >> } >> - new_state.cwd[0] = '\0'; >> - new_state.cwd_length = 0; >> } >> >> >> if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)==0) >> { >> @@ -1967,17 +1971,21 @@ CWD_API char *tsrm_realpath(const char *path, >> char *real_path TSRMLS_DC) /* {{{ >> if (VCWD_GETCWD(cwd, MAXPATHLEN)) { path = cwd; } >> - } else if (!IS_ABSOLUTE_PATH(path, strlen(path)) && >> - VCWD_GETCWD(cwd, MAXPATHLEN)) { >> - new_state.cwd = estrdup(cwd); >> - new_state.cwd_length = strlen(cwd); >> } else { >> - new_state.cwd = (char*)emalloc(1); >> - if (new_state.cwd == NULL) { >> - return NULL; >> + size_t path_len = strlen(path); >> + >> + if (!IS_ABSOLUTE_PATH(path, strlen(path)) && >> + VCWD_GETCWD(cwd, MAXPATHLEN)) { >> + new_state.cwd = estrdup(cwd); >> + new_state.cwd_length = strlen(cwd); >> + } else { >> + new_state.cwd = (char*)emalloc(1); >> + if (new_state.cwd == NULL) { >> + return NULL; >> + } >> + new_state.cwd[0] = '\0'; >> + new_state.cwd_length = 0; >> } >> - new_state.cwd[0] = '\0'; >> - new_state.cwd_length = 0; >> } >> >> >> if (virtual_file_ex(&new_state, path, NULL, CWD_REALPATH TSRMLS_CC)) { >> >> > > In the second case, you forgot to replace the strlen(path) in the > IS_ABSOLUTE_PATH invocation. > > > Also, these changes will cause unused variable warnings on non-windows > systems, because IS_ABSOLUTE_PATH only uses the length on windows. I'm not > sure what's the best way to avoid that - maybe make IS_ABSOLUTE_PATH an > inline function instead of a macro? > Ah, you're right, those will be warned as unreferenced, and even if not - that's an empty call.
A grep reports like 34 usage occurrences in the core, not that many. Those I've touched was using strlen(), are about 5 AFAIR. In the other cases the path length is delivered. Though, a couple of places can be optimized. I'll try with the inline function, it's cleaner. If it takes too much, will just go through the places I've touched and #ifdef them. Those macros are normally not changed/used that often, so should be ok, too. Regards Anatol -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php