summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2017-05-22 23:23:12 +0300
committerDmitry Stogov <dmitry@zend.com>2017-05-22 23:23:12 +0300
commit293d99052db363dd655ebe24a3c1fed3c095012a (patch)
tree652213aac777d407b4f276a67f73d61c1734adeb
parent26a6d20ab50b47291eba0870a36c59f1840df602 (diff)
downloadphp-git-293d99052db363dd655ebe24a3c1fed3c095012a.tar.gz
Optimized parse_url() by using "known" strings
-rw-r--r--Zend/zend_string.h8
-rw-r--r--ext/standard/url.c49
2 files changed, 41 insertions, 16 deletions
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);
}