Skip to content

Commit 04deb4d

Browse files
authored
uri: Do not pass uri_internal_t to property handlers (#19805)
* uri: Do not pass `uri_internal_t` to property handlers Within an individual property handler, the `parser` is already implicitly known, which just leaves the `->uri` field which must contain the entire state necessary for the handlers to work with. Pass the `->uri` directly. It avoids one pointer indirection, since the handlers do not need to follow the pointer to the `uri_internal_t` just to follow the pointer to the URI state. Instead the URI pointer can directly be passed using a register with the dereferences (if necessary) happening in the caller, providing more insight for the compiler to work with. It also makes it more convenient to use the handlers directly for code that already knows that it needs a specific URI parser, since no `uri_internal_t` needs to be constructed to store the already-known information about which parser to use. * uri: Use local variable for the URI in `uri_get_debug_properties()` This makes the code a little less verbose.
1 parent 7404829 commit 04deb4d

File tree

7 files changed

+102
-105
lines changed

7 files changed

+102
-105
lines changed

ext/uri/php_uri.c

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,42 +58,43 @@ static HashTable *uri_get_debug_properties(zend_object *object)
5858
HashTable *std_properties = zend_std_get_properties(object);
5959
HashTable *result = zend_array_dup(std_properties);
6060

61-
if (UNEXPECTED(internal_uri->uri == NULL)) {
61+
const php_uri_parser * const parser = internal_uri->parser;
62+
void * const uri = internal_uri->uri;
63+
64+
if (UNEXPECTED(uri == NULL)) {
6265
return result;
6366
}
6467

65-
const php_uri_parser *parser = internal_uri->parser;
66-
6768
zval tmp;
68-
if (parser->property_handler.scheme.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
69+
if (parser->property_handler.scheme.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
6970
zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_SCHEME), &tmp);
7071
}
7172

72-
if (parser->property_handler.username.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
73+
if (parser->property_handler.username.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
7374
zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_USERNAME), &tmp);
7475
}
7576

76-
if (parser->property_handler.password.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
77+
if (parser->property_handler.password.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
7778
zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PASSWORD), &tmp);
7879
}
7980

80-
if (parser->property_handler.host.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
81+
if (parser->property_handler.host.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
8182
zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_HOST), &tmp);
8283
}
8384

84-
if (parser->property_handler.port.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
85+
if (parser->property_handler.port.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
8586
zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PORT), &tmp);
8687
}
8788

88-
if (parser->property_handler.path.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
89+
if (parser->property_handler.path.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
8990
zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PATH), &tmp);
9091
}
9192

92-
if (parser->property_handler.query.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
93+
if (parser->property_handler.query.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
9394
zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_QUERY), &tmp);
9495
}
9596

96-
if (parser->property_handler.fragment.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
97+
if (parser->property_handler.fragment.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) {
9798
zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_FRAGMENT), &tmp);
9899
}
99100

@@ -130,7 +131,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_get_property(const uri_interna
130131
return FAILURE;
131132
}
132133

133-
return property_handler->read(internal_uri, read_mode, zv);
134+
return property_handler->read(internal_uri->uri, read_mode, zv);
134135
}
135136

136137
ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_scheme(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
@@ -536,7 +537,7 @@ static void rfc3986_userinfo_read(INTERNAL_FUNCTION_PARAMETERS, php_uri_componen
536537
uri_internal_t *internal_uri = Z_URI_INTERNAL_P(ZEND_THIS);
537538
URI_ASSERT_INITIALIZATION(internal_uri);
538539

539-
if (UNEXPECTED(php_uri_parser_rfc3986_userinfo_read(internal_uri, read_mode, return_value) == FAILURE)) {
540+
if (UNEXPECTED(php_uri_parser_rfc3986_userinfo_read(internal_uri->uri, read_mode, return_value) == FAILURE)) {
540541
zend_throw_error(NULL, "The userinfo component cannot be retrieved");
541542
RETURN_THROWS();
542543
}
@@ -583,7 +584,7 @@ PHP_METHOD(Uri_Rfc3986_Uri, withUserInfo)
583584
uri_internal_t *new_internal_uri = uri_internal_from_obj(new_object);
584585
URI_ASSERT_INITIALIZATION(new_internal_uri);
585586

586-
if (UNEXPECTED(php_uri_parser_rfc3986_userinfo_write(new_internal_uri, &zv, NULL) == FAILURE)) {
587+
if (UNEXPECTED(php_uri_parser_rfc3986_userinfo_write(new_internal_uri->uri, &zv, NULL) == FAILURE)) {
587588
RETURN_THROWS();
588589
}
589590
}

ext/uri/php_uri_common.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ void uri_read_component(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name prop
7575
const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
7676
ZEND_ASSERT(property_handler != NULL);
7777

78-
if (UNEXPECTED(property_handler->read(internal_uri, component_read_mode, return_value) == FAILURE)) {
78+
if (UNEXPECTED(property_handler->read(internal_uri->uri, component_read_mode, return_value) == FAILURE)) {
7979
zend_throw_error(NULL, "The %s component cannot be retrieved", ZSTR_VAL(get_known_string_by_property_name(property_name)));
8080
RETURN_THROWS();
8181
}
@@ -109,7 +109,7 @@ static void uri_write_component_ex(INTERNAL_FUNCTION_PARAMETERS, php_uri_propert
109109

110110
zval errors;
111111
ZVAL_UNDEF(&errors);
112-
if (UNEXPECTED(property_handler->write(new_internal_uri, property_zv, &errors) == FAILURE)) {
112+
if (UNEXPECTED(property_handler->write(new_internal_uri->uri, property_zv, &errors) == FAILURE)) {
113113
zval_ptr_dtor(&errors);
114114
RETURN_THROWS();
115115
}

ext/uri/php_uri_common.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,9 @@ typedef enum php_uri_component_read_mode {
4141
PHP_URI_COMPONENT_READ_MODE_NORMALIZED_UNICODE,
4242
} php_uri_component_read_mode;
4343

44-
struct uri_internal_t;
44+
typedef zend_result (*php_uri_property_handler_read)(void *uri, php_uri_component_read_mode read_mode, zval *retval);
4545

46-
typedef zend_result (*php_uri_property_handler_read)(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval);
47-
48-
typedef zend_result (*php_uri_property_handler_write)(struct uri_internal_t *internal_uri, zval *value, zval *errors);
46+
typedef zend_result (*php_uri_property_handler_write)(void *uri, zval *value, zval *errors);
4947

5048
typedef enum php_uri_property_name {
5149
PHP_URI_PROPERTY_NAME_SCHEME,

ext/uri/uri_parser_php_parse_url.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ static zend_string *decode_component(zend_string *in, php_uri_component_read_mod
3838
}
3939
}
4040

41-
static zend_result uri_parser_php_parse_url_scheme_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval)
41+
static zend_result uri_parser_php_parse_url_scheme_read(void *uri, php_uri_component_read_mode read_mode, zval *retval)
4242
{
43-
const php_url *parse_url_uri = internal_uri->uri;
43+
const php_url *parse_url_uri = uri;
4444

4545
if (parse_url_uri->scheme) {
4646
ZVAL_STR(retval, decode_component(parse_url_uri->scheme, read_mode));
@@ -51,9 +51,9 @@ static zend_result uri_parser_php_parse_url_scheme_read(const uri_internal_t *in
5151
return SUCCESS;
5252
}
5353

54-
static zend_result uri_parser_php_parse_url_username_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval)
54+
static zend_result uri_parser_php_parse_url_username_read(void *uri, php_uri_component_read_mode read_mode, zval *retval)
5555
{
56-
const php_url *parse_url_uri = internal_uri->uri;
56+
const php_url *parse_url_uri = uri;
5757

5858
if (parse_url_uri->user) {
5959
ZVAL_STR(retval, decode_component(parse_url_uri->user, read_mode));
@@ -64,9 +64,9 @@ static zend_result uri_parser_php_parse_url_username_read(const uri_internal_t *
6464
return SUCCESS;
6565
}
6666

67-
static zend_result uri_parser_php_parse_url_password_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval)
67+
static zend_result uri_parser_php_parse_url_password_read(void *uri, php_uri_component_read_mode read_mode, zval *retval)
6868
{
69-
const php_url *parse_url_uri = internal_uri->uri;
69+
const php_url *parse_url_uri = uri;
7070

7171
if (parse_url_uri->pass) {
7272
ZVAL_STR(retval, decode_component(parse_url_uri->pass, read_mode));
@@ -77,9 +77,9 @@ static zend_result uri_parser_php_parse_url_password_read(const uri_internal_t *
7777
return SUCCESS;
7878
}
7979

80-
static zend_result uri_parser_php_parse_url_host_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval)
80+
static zend_result uri_parser_php_parse_url_host_read(void *uri, php_uri_component_read_mode read_mode, zval *retval)
8181
{
82-
const php_url *parse_url_uri = internal_uri->uri;
82+
const php_url *parse_url_uri = uri;
8383

8484
if (parse_url_uri->host) {
8585
ZVAL_STR(retval, decode_component(parse_url_uri->host, read_mode));
@@ -90,9 +90,9 @@ static zend_result uri_parser_php_parse_url_host_read(const uri_internal_t *inte
9090
return SUCCESS;
9191
}
9292

93-
static zend_result uri_parser_php_parse_url_port_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval)
93+
static zend_result uri_parser_php_parse_url_port_read(void *uri, php_uri_component_read_mode read_mode, zval *retval)
9494
{
95-
const php_url *parse_url_uri = internal_uri->uri;
95+
const php_url *parse_url_uri = uri;
9696

9797
if (parse_url_uri->port) {
9898
ZVAL_LONG(retval, parse_url_uri->port);
@@ -103,9 +103,9 @@ static zend_result uri_parser_php_parse_url_port_read(const uri_internal_t *inte
103103
return SUCCESS;
104104
}
105105

106-
static zend_result uri_parser_php_parse_url_path_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval)
106+
static zend_result uri_parser_php_parse_url_path_read(void *uri, php_uri_component_read_mode read_mode, zval *retval)
107107
{
108-
const php_url *parse_url_uri = internal_uri->uri;
108+
const php_url *parse_url_uri = uri;
109109

110110
if (parse_url_uri->path) {
111111
ZVAL_STR(retval, decode_component(parse_url_uri->path, read_mode));
@@ -116,9 +116,9 @@ static zend_result uri_parser_php_parse_url_path_read(const uri_internal_t *inte
116116
return SUCCESS;
117117
}
118118

119-
static zend_result uri_parser_php_parse_url_query_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval)
119+
static zend_result uri_parser_php_parse_url_query_read(void *uri, php_uri_component_read_mode read_mode, zval *retval)
120120
{
121-
const php_url *parse_url_uri = internal_uri->uri;
121+
const php_url *parse_url_uri = uri;
122122

123123
if (parse_url_uri->query) {
124124
ZVAL_STR(retval, decode_component(parse_url_uri->query, read_mode));
@@ -129,9 +129,9 @@ static zend_result uri_parser_php_parse_url_query_read(const uri_internal_t *int
129129
return SUCCESS;
130130
}
131131

132-
static zend_result uri_parser_php_parse_url_fragment_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval)
132+
static zend_result uri_parser_php_parse_url_fragment_read(void *uri, php_uri_component_read_mode read_mode, zval *retval)
133133
{
134-
const php_url *parse_url_uri = internal_uri->uri;
134+
const php_url *parse_url_uri = uri;
135135

136136
if (parse_url_uri->fragment) {
137137
ZVAL_STR(retval, decode_component(parse_url_uri->fragment, read_mode));

0 commit comments

Comments
 (0)