From: Dmitry Stogov Date: Mon, 22 May 2017 20:23:12 +0000 (+0300) Subject: Optimized parse_url() by using "known" strings X-Git-Tag: php-7.2.0alpha1~57^2~43 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=293d99052db363dd655ebe24a3c1fed3c095012a;p=php Optimized parse_url() by using "known" strings --- diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 77dd083997..81db801783 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -408,6 +408,14 @@ EMPTY_SWITCH_DEFAULT_CASE() _(ZEND_STR_SEVERITY, "severity") \ _(ZEND_STR_STRING, "string") \ _(ZEND_STR_TRACE, "trace") \ + _(ZEND_STR_SCHEME, "scheme") \ + _(ZEND_STR_HOST, "host") \ + _(ZEND_STR_PORT, "port") \ + _(ZEND_STR_USER, "user") \ + _(ZEND_STR_PASS, "pass") \ + _(ZEND_STR_PATH, "path") \ + _(ZEND_STR_QUERY, "query") \ + _(ZEND_STR_FRAGMENT, "fragment") \ typedef enum _zend_known_string_id { diff --git a/ext/standard/url.c b/ext/standard/url.c index c2d78656b7..9806ed52b8 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -335,6 +335,7 @@ PHP_FUNCTION(parse_url) size_t str_len; php_url *resource; zend_long key = -1; + zval tmp; ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(str, str_len) @@ -385,22 +386,38 @@ PHP_FUNCTION(parse_url) array_init(return_value); /* add the various elements to the array */ - if (resource->scheme != NULL) - add_assoc_string(return_value, "scheme", resource->scheme); - if (resource->host != NULL) - add_assoc_string(return_value, "host", resource->host); - if (resource->port != 0) - add_assoc_long(return_value, "port", resource->port); - if (resource->user != NULL) - add_assoc_string(return_value, "user", resource->user); - if (resource->pass != NULL) - add_assoc_string(return_value, "pass", resource->pass); - if (resource->path != NULL) - add_assoc_string(return_value, "path", resource->path); - if (resource->query != NULL) - add_assoc_string(return_value, "query", resource->query); - if (resource->fragment != NULL) - add_assoc_string(return_value, "fragment", resource->fragment); + if (resource->scheme != NULL) { + ZVAL_STRING(&tmp, resource->scheme); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_SCHEME), &tmp); + } + if (resource->host != NULL) { + ZVAL_STRING(&tmp, resource->host); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_HOST), &tmp); + } + if (resource->port != 0) { + ZVAL_LONG(&tmp, resource->port); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_PORT), &tmp); + } + if (resource->user != NULL) { + ZVAL_STRING(&tmp, resource->user); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_USER), &tmp); + } + if (resource->pass != NULL) { + ZVAL_STRING(&tmp, resource->pass); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_PASS), &tmp); + } + if (resource->path != NULL) { + ZVAL_STRING(&tmp, resource->path); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_PATH), &tmp); + } + if (resource->query != NULL) { + ZVAL_STRING(&tmp, resource->query); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_QUERY), &tmp); + } + if (resource->fragment != NULL) { + ZVAL_STRING(&tmp, resource->fragment); + zend_hash_add_new(Z_ARRVAL_P(return_value), ZSTR_KNOWN(ZEND_STR_FRAGMENT), &tmp); + } done: php_url_free(resource); }