]> granicus.if.org Git - php/commitdiff
Optimized parse_url() by using "known" strings
authorDmitry Stogov <dmitry@zend.com>
Mon, 22 May 2017 20:23:12 +0000 (23:23 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 22 May 2017 20:23:12 +0000 (23:23 +0300)
Zend/zend_string.h
ext/standard/url.c

index 77dd0839978d6e3aa29fb47a5f8ef17d8081647a..81db801783de070e4a1ba6c8b4c25d9960d53d4d 100644 (file)
@@ -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 {
index c2d78656b71f761493a25002e32cc883e0d5eac4..9806ed52b804829326a78fbb9a6195ce85b8104d 100644 (file)
@@ -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);
 }