From e11bcad1d67496a024885958fc9197e708d12ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Tue, 26 Aug 2025 19:44:03 +0200 Subject: [PATCH 1/2] 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. --- ext/uri/php_uri.c | 22 +++++----- ext/uri/php_uri_common.c | 4 +- ext/uri/php_uri_common.h | 6 +-- ext/uri/uri_parser_php_parse_url.c | 32 +++++++------- ext/uri/uri_parser_rfc3986.c | 68 +++++++++++++++--------------- ext/uri/uri_parser_rfc3986.h | 4 +- ext/uri/uri_parser_whatwg.c | 64 ++++++++++++++-------------- 7 files changed, 98 insertions(+), 102 deletions(-) diff --git a/ext/uri/php_uri.c b/ext/uri/php_uri.c index f3fc05bf1b485..41422f31b8aad 100644 --- a/ext/uri/php_uri.c +++ b/ext/uri/php_uri.c @@ -65,35 +65,35 @@ static HashTable *uri_get_debug_properties(zend_object *object) const php_uri_parser *parser = internal_uri->parser; zval tmp; - if (parser->property_handler.scheme.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.scheme.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_SCHEME), &tmp); } - if (parser->property_handler.username.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.username.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_USERNAME), &tmp); } - if (parser->property_handler.password.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.password.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PASSWORD), &tmp); } - if (parser->property_handler.host.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.host.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_HOST), &tmp); } - if (parser->property_handler.port.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.port.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PORT), &tmp); } - if (parser->property_handler.path.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.path.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PATH), &tmp); } - if (parser->property_handler.query.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.query.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_QUERY), &tmp); } - if (parser->property_handler.fragment.read(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.fragment.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_FRAGMENT), &tmp); } @@ -130,7 +130,7 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_get_property(const uri_interna return FAILURE; } - return property_handler->read(internal_uri, read_mode, zv); + return property_handler->read(internal_uri->uri, read_mode, zv); } 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 +536,7 @@ static void rfc3986_userinfo_read(INTERNAL_FUNCTION_PARAMETERS, php_uri_componen uri_internal_t *internal_uri = Z_URI_INTERNAL_P(ZEND_THIS); URI_ASSERT_INITIALIZATION(internal_uri); - if (UNEXPECTED(php_uri_parser_rfc3986_userinfo_read(internal_uri, read_mode, return_value) == FAILURE)) { + if (UNEXPECTED(php_uri_parser_rfc3986_userinfo_read(internal_uri->uri, read_mode, return_value) == FAILURE)) { zend_throw_error(NULL, "The userinfo component cannot be retrieved"); RETURN_THROWS(); } @@ -583,7 +583,7 @@ PHP_METHOD(Uri_Rfc3986_Uri, withUserInfo) uri_internal_t *new_internal_uri = uri_internal_from_obj(new_object); URI_ASSERT_INITIALIZATION(new_internal_uri); - if (UNEXPECTED(php_uri_parser_rfc3986_userinfo_write(new_internal_uri, &zv, NULL) == FAILURE)) { + if (UNEXPECTED(php_uri_parser_rfc3986_userinfo_write(new_internal_uri->uri, &zv, NULL) == FAILURE)) { RETURN_THROWS(); } } diff --git a/ext/uri/php_uri_common.c b/ext/uri/php_uri_common.c index 7bee8f46f6e02..57472ad2640b8 100644 --- a/ext/uri/php_uri_common.c +++ b/ext/uri/php_uri_common.c @@ -75,7 +75,7 @@ void uri_read_component(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name prop const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name); ZEND_ASSERT(property_handler != NULL); - if (UNEXPECTED(property_handler->read(internal_uri, component_read_mode, return_value) == FAILURE)) { + if (UNEXPECTED(property_handler->read(internal_uri->uri, component_read_mode, return_value) == FAILURE)) { zend_throw_error(NULL, "The %s component cannot be retrieved", ZSTR_VAL(get_known_string_by_property_name(property_name))); RETURN_THROWS(); } @@ -109,7 +109,7 @@ static void uri_write_component_ex(INTERNAL_FUNCTION_PARAMETERS, php_uri_propert zval errors; ZVAL_UNDEF(&errors); - if (UNEXPECTED(property_handler->write(new_internal_uri, property_zv, &errors) == FAILURE)) { + if (UNEXPECTED(property_handler->write(new_internal_uri->uri, property_zv, &errors) == FAILURE)) { zval_ptr_dtor(&errors); RETURN_THROWS(); } diff --git a/ext/uri/php_uri_common.h b/ext/uri/php_uri_common.h index a49d7f5b2445f..c56603f9a50e1 100644 --- a/ext/uri/php_uri_common.h +++ b/ext/uri/php_uri_common.h @@ -41,11 +41,9 @@ typedef enum php_uri_component_read_mode { PHP_URI_COMPONENT_READ_MODE_NORMALIZED_UNICODE, } php_uri_component_read_mode; -struct uri_internal_t; +typedef zend_result (*php_uri_property_handler_read)(void *uri, php_uri_component_read_mode read_mode, zval *retval); -typedef zend_result (*php_uri_property_handler_read)(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval); - -typedef zend_result (*php_uri_property_handler_write)(struct uri_internal_t *internal_uri, zval *value, zval *errors); +typedef zend_result (*php_uri_property_handler_write)(void *uri, zval *value, zval *errors); typedef enum php_uri_property_name { PHP_URI_PROPERTY_NAME_SCHEME, diff --git a/ext/uri/uri_parser_php_parse_url.c b/ext/uri/uri_parser_php_parse_url.c index 45649dcc92a7a..cab8b68a4adf8 100644 --- a/ext/uri/uri_parser_php_parse_url.c +++ b/ext/uri/uri_parser_php_parse_url.c @@ -38,9 +38,9 @@ static zend_string *decode_component(zend_string *in, php_uri_component_read_mod } } -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) +static zend_result uri_parser_php_parse_url_scheme_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const php_url *parse_url_uri = internal_uri->uri; + const php_url *parse_url_uri = uri; if (parse_url_uri->scheme) { 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 return SUCCESS; } -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) +static zend_result uri_parser_php_parse_url_username_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const php_url *parse_url_uri = internal_uri->uri; + const php_url *parse_url_uri = uri; if (parse_url_uri->user) { 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 * return SUCCESS; } -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) +static zend_result uri_parser_php_parse_url_password_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const php_url *parse_url_uri = internal_uri->uri; + const php_url *parse_url_uri = uri; if (parse_url_uri->pass) { 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 * return SUCCESS; } -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) +static zend_result uri_parser_php_parse_url_host_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const php_url *parse_url_uri = internal_uri->uri; + const php_url *parse_url_uri = uri; if (parse_url_uri->host) { 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 return SUCCESS; } -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) +static zend_result uri_parser_php_parse_url_port_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const php_url *parse_url_uri = internal_uri->uri; + const php_url *parse_url_uri = uri; if (parse_url_uri->port) { 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 return SUCCESS; } -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) +static zend_result uri_parser_php_parse_url_path_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const php_url *parse_url_uri = internal_uri->uri; + const php_url *parse_url_uri = uri; if (parse_url_uri->path) { 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 return SUCCESS; } -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) +static zend_result uri_parser_php_parse_url_query_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const php_url *parse_url_uri = internal_uri->uri; + const php_url *parse_url_uri = uri; if (parse_url_uri->query) { 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 return SUCCESS; } -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) +static zend_result uri_parser_php_parse_url_fragment_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const php_url *parse_url_uri = internal_uri->uri; + const php_url *parse_url_uri = uri; if (parse_url_uri->fragment) { ZVAL_STR(retval, decode_component(parse_url_uri->fragment, read_mode)); diff --git a/ext/uri/uri_parser_rfc3986.c b/ext/uri/uri_parser_rfc3986.c index 7cb2637cb47f6..583d3b9f5e0ae 100644 --- a/ext/uri/uri_parser_rfc3986.c +++ b/ext/uri/uri_parser_rfc3986.c @@ -99,16 +99,14 @@ ZEND_ATTRIBUTE_NONNULL static UriUriA *get_uri_for_reading(php_uri_parser_rfc398 } } -ZEND_ATTRIBUTE_NONNULL static UriUriA *get_uri_for_writing(uri_internal_t *internal_uri) +ZEND_ATTRIBUTE_NONNULL static UriUriA *get_uri_for_writing(php_uri_parser_rfc3986_uris *uriparser_uris) { - php_uri_parser_rfc3986_uris *uriparser_uris = internal_uri->uri; - return &uriparser_uris->uri; } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->scheme)) { ZVAL_STRINGL(retval, uriparser_uri->scheme.first, get_text_range_length(&uriparser_uri->scheme)); @@ -119,9 +117,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_scheme_read(con return SUCCESS; } -static zend_result php_uri_parser_rfc3986_scheme_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_scheme_write(void *uri, zval *value, zval *errors) { - UriUriA *uriparser_uri = get_uri_for_writing(internal_uri); + UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; if (Z_TYPE_P(value) == IS_NULL) { @@ -143,9 +141,9 @@ static zend_result php_uri_parser_rfc3986_scheme_write(struct uri_internal_t *in } } -ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->userInfo)) { ZVAL_STRINGL(retval, uriparser_uri->userInfo.first, get_text_range_length(&uriparser_uri->userInfo)); @@ -156,9 +154,9 @@ ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(const ur return SUCCESS; } -zend_result php_uri_parser_rfc3986_userinfo_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +zend_result php_uri_parser_rfc3986_userinfo_write(void *uri, zval *value, zval *errors) { - UriUriA *uriparser_uri = get_uri_for_writing(internal_uri); + UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; if (Z_TYPE_P(value) == IS_NULL) { @@ -183,9 +181,9 @@ zend_result php_uri_parser_rfc3986_userinfo_write(struct uri_internal_t *interna } } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->userInfo)) { size_t length = get_text_range_length(&uriparser_uri->userInfo); @@ -205,9 +203,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_username_read(c return SUCCESS; } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->userInfo)) { const char *c = memchr(uriparser_uri->userInfo.first, ':', get_text_range_length(&uriparser_uri->userInfo)); @@ -224,9 +222,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_password_read(c return SUCCESS; } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_host_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_host_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->hostText)) { if (uriparser_uri->hostData.ip6 != NULL || uriparser_uri->hostData.ipFuture.first != NULL) { @@ -248,9 +246,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_host_read(const return SUCCESS; } -static zend_result php_uri_parser_rfc3986_host_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_host_write(void *uri, zval *value, zval *errors) { - UriUriA *uriparser_uri = get_uri_for_writing(internal_uri); + UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; if (Z_TYPE_P(value) == IS_NULL) { @@ -296,9 +294,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_long port_str_to_zend_long_checked(const char return (zend_long)result; } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->portText) && get_text_range_length(&uriparser_uri->portText) > 0) { ZVAL_LONG(retval, port_str_to_zend_long_checked(uriparser_uri->portText.first, get_text_range_length(&uriparser_uri->portText))); @@ -309,9 +307,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_port_read(const return SUCCESS; } -static zend_result php_uri_parser_rfc3986_port_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_port_write(void *uri, zval *value, zval *errors) { - UriUriA *uriparser_uri = get_uri_for_writing(internal_uri); + UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; if (Z_TYPE_P(value) == IS_NULL) { @@ -338,9 +336,9 @@ static zend_result php_uri_parser_rfc3986_port_write(struct uri_internal_t *inte } } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_path_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_path_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (uriparser_uri->pathHead != NULL) { smart_str str = {0}; @@ -366,9 +364,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_path_read(const return SUCCESS; } -static zend_result php_uri_parser_rfc3986_path_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_path_write(void *uri, zval *value, zval *errors) { - UriUriA *uriparser_uri = get_uri_for_writing(internal_uri); + UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; if (Z_STRLEN_P(value) == 0) { @@ -390,9 +388,9 @@ static zend_result php_uri_parser_rfc3986_path_write(struct uri_internal_t *inte } } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->query)) { ZVAL_STRINGL(retval, uriparser_uri->query.first, get_text_range_length(&uriparser_uri->query)); @@ -403,9 +401,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(cons return SUCCESS; } -static zend_result php_uri_parser_rfc3986_query_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_query_write(void *uri, zval *value, zval *errors) { - UriUriA *uriparser_uri = get_uri_for_writing(internal_uri); + UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; if (Z_TYPE_P(value) == IS_NULL) { @@ -427,9 +425,9 @@ static zend_result php_uri_parser_rfc3986_query_write(struct uri_internal_t *int } } -ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const UriUriA *uriparser_uri = get_uri_for_reading(internal_uri->uri, read_mode); + const UriUriA *uriparser_uri = get_uri_for_reading(uri, read_mode); if (has_text_range(&uriparser_uri->fragment)) { ZVAL_STRINGL(retval, uriparser_uri->fragment.first, get_text_range_length(&uriparser_uri->fragment)); @@ -440,9 +438,9 @@ ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(c return SUCCESS; } -static zend_result php_uri_parser_rfc3986_fragment_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_rfc3986_fragment_write(void *uri, zval *value, zval *errors) { - UriUriA *uriparser_uri = get_uri_for_writing(internal_uri); + UriUriA *uriparser_uri = get_uri_for_writing(uri); int result; if (Z_TYPE_P(value) == IS_NULL) { diff --git a/ext/uri/uri_parser_rfc3986.h b/ext/uri/uri_parser_rfc3986.h index 9b976e3d211f9..bdf792816c29f 100644 --- a/ext/uri/uri_parser_rfc3986.h +++ b/ext/uri/uri_parser_rfc3986.h @@ -28,8 +28,8 @@ typedef struct php_uri_parser_rfc3986_uris { bool normalized_uri_initialized; } php_uri_parser_rfc3986_uris; -zend_result php_uri_parser_rfc3986_userinfo_read(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval); -zend_result php_uri_parser_rfc3986_userinfo_write(struct uri_internal_t *internal_uri, zval *value, zval *errors); +zend_result php_uri_parser_rfc3986_userinfo_read(void *uri, php_uri_component_read_mode read_mode, zval *retval); +zend_result php_uri_parser_rfc3986_userinfo_write(void *uri, zval *value, zval *errors); php_uri_parser_rfc3986_uris *php_uri_parser_rfc3986_parse_ex(const char *uri_str, size_t uri_str_len, const php_uri_parser_rfc3986_uris *uriparser_base_url, bool silent); diff --git a/ext/uri/uri_parser_whatwg.c b/ext/uri/uri_parser_whatwg.c index ad31d1d12b5b8..3ce79e790f52e 100644 --- a/ext/uri/uri_parser_whatwg.c +++ b/ext/uri/uri_parser_whatwg.c @@ -250,9 +250,9 @@ static lxb_status_t serialize_to_smart_str_callback(const lxb_char_t *data, size return LXB_STATUS_OK; } -static zend_result php_uri_parser_whatwg_scheme_read(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_scheme_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const lxb_url_t *lexbor_uri = internal_uri->uri; + const lxb_url_t *lexbor_uri = uri; ZEND_ASSERT(lexbor_uri->scheme.type != LXB_URL_SCHEMEL_TYPE__UNDEF); @@ -261,9 +261,9 @@ static zend_result php_uri_parser_whatwg_scheme_read(const struct uri_internal_t return SUCCESS; } -static zend_result php_uri_parser_whatwg_scheme_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_scheme_write(void *uri, zval *value, zval *errors) { - lxb_url_t *lexbor_uri = internal_uri->uri; + lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); @@ -277,9 +277,9 @@ static zend_result php_uri_parser_whatwg_scheme_write(struct uri_internal_t *int return SUCCESS; } -static zend_result php_uri_parser_whatwg_username_read(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_username_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const lxb_url_t *lexbor_uri = internal_uri->uri; + const lxb_url_t *lexbor_uri = uri; if (lexbor_uri->username.length) { ZVAL_STRINGL(retval, (const char *) lexbor_uri->username.data, lexbor_uri->username.length); @@ -290,9 +290,9 @@ static zend_result php_uri_parser_whatwg_username_read(const struct uri_internal return SUCCESS; } -static zend_result php_uri_parser_whatwg_username_write(uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_username_write(void *uri, zval *value, zval *errors) { - lxb_url_t *lexbor_uri = internal_uri->uri; + lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); @@ -306,9 +306,9 @@ static zend_result php_uri_parser_whatwg_username_write(uri_internal_t *internal return SUCCESS; } -static zend_result php_uri_parser_whatwg_password_read(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_password_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const lxb_url_t *lexbor_uri = internal_uri->uri; + const lxb_url_t *lexbor_uri = uri; if (lexbor_uri->password.length > 0) { ZVAL_STRINGL(retval, (const char *) lexbor_uri->password.data, lexbor_uri->password.length); @@ -319,9 +319,9 @@ static zend_result php_uri_parser_whatwg_password_read(const struct uri_internal return SUCCESS; } -static zend_result php_uri_parser_whatwg_password_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_password_write(void *uri, zval *value, zval *errors) { - lxb_url_t *lexbor_uri = internal_uri->uri; + lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); @@ -335,9 +335,9 @@ static zend_result php_uri_parser_whatwg_password_write(struct uri_internal_t *i return SUCCESS; } -static zend_result php_uri_parser_whatwg_host_read(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_host_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const lxb_url_t *lexbor_uri = internal_uri->uri; + const lxb_url_t *lexbor_uri = uri; if (lexbor_uri->host.type == LXB_URL_HOST_TYPE_IPV4) { smart_str host_str = {0}; @@ -379,9 +379,9 @@ static zend_result php_uri_parser_whatwg_host_read(const struct uri_internal_t * return SUCCESS; } -static zend_result php_uri_parser_whatwg_host_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_host_write(void *uri, zval *value, zval *errors) { - lxb_url_t *lexbor_uri = internal_uri->uri; + lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); @@ -395,9 +395,9 @@ static zend_result php_uri_parser_whatwg_host_write(struct uri_internal_t *inter return SUCCESS; } -static zend_result php_uri_parser_whatwg_port_read(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_port_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const lxb_url_t *lexbor_uri = internal_uri->uri; + const lxb_url_t *lexbor_uri = uri; if (lexbor_uri->has_port) { ZVAL_LONG(retval, lexbor_uri->port); @@ -408,9 +408,9 @@ static zend_result php_uri_parser_whatwg_port_read(const struct uri_internal_t * return SUCCESS; } -static zend_result php_uri_parser_whatwg_port_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_port_write(void *uri, zval *value, zval *errors) { - lxb_url_t *lexbor_uri = internal_uri->uri; + lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_long_or_null_to_lexbor_str(value, &str); @@ -424,9 +424,9 @@ static zend_result php_uri_parser_whatwg_port_write(struct uri_internal_t *inter return SUCCESS; } -static zend_result php_uri_parser_whatwg_path_read(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_path_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const lxb_url_t *lexbor_uri = internal_uri->uri; + const lxb_url_t *lexbor_uri = uri; if (lexbor_uri->path.str.length) { ZVAL_STRINGL(retval, (const char *) lexbor_uri->path.str.data, lexbor_uri->path.str.length); @@ -437,9 +437,9 @@ static zend_result php_uri_parser_whatwg_path_read(const struct uri_internal_t * return SUCCESS; } -static zend_result php_uri_parser_whatwg_path_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_path_write(void *uri, zval *value, zval *errors) { - lxb_url_t *lexbor_uri = internal_uri->uri; + lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); @@ -453,9 +453,9 @@ static zend_result php_uri_parser_whatwg_path_write(struct uri_internal_t *inter return SUCCESS; } -static zend_result php_uri_parser_whatwg_query_read(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_query_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const lxb_url_t *lexbor_uri = internal_uri->uri; + const lxb_url_t *lexbor_uri = uri; if (lexbor_uri->query.length) { ZVAL_STRINGL(retval, (const char *) lexbor_uri->query.data, lexbor_uri->query.length); @@ -466,9 +466,9 @@ static zend_result php_uri_parser_whatwg_query_read(const struct uri_internal_t return SUCCESS; } -static zend_result php_uri_parser_whatwg_query_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_query_write(void *uri, zval *value, zval *errors) { - lxb_url_t *lexbor_uri = internal_uri->uri; + lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); @@ -482,9 +482,9 @@ static zend_result php_uri_parser_whatwg_query_write(struct uri_internal_t *inte return SUCCESS; } -static zend_result php_uri_parser_whatwg_fragment_read(const struct uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *retval) +static zend_result php_uri_parser_whatwg_fragment_read(void *uri, php_uri_component_read_mode read_mode, zval *retval) { - const lxb_url_t *lexbor_uri = internal_uri->uri; + const lxb_url_t *lexbor_uri = uri; if (lexbor_uri->fragment.length) { ZVAL_STRINGL(retval, (const char *) lexbor_uri->fragment.data, lexbor_uri->fragment.length); @@ -495,9 +495,9 @@ static zend_result php_uri_parser_whatwg_fragment_read(const struct uri_internal return SUCCESS; } -static zend_result php_uri_parser_whatwg_fragment_write(struct uri_internal_t *internal_uri, zval *value, zval *errors) +static zend_result php_uri_parser_whatwg_fragment_write(void *uri, zval *value, zval *errors) { - lxb_url_t *lexbor_uri = internal_uri->uri; + lxb_url_t *lexbor_uri = uri; lexbor_str_t str = {0}; zval_string_or_null_to_lexbor_str(value, &str); From 04e4c6da70b957a3790dd057d97f974a47ba18b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Thu, 11 Sep 2025 20:33:40 +0200 Subject: [PATCH 2/2] uri: Use local variable for the URI in `uri_get_debug_properties()` This makes the code a little less verbose. --- ext/uri/php_uri.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/ext/uri/php_uri.c b/ext/uri/php_uri.c index 41422f31b8aad..1af634d643b1f 100644 --- a/ext/uri/php_uri.c +++ b/ext/uri/php_uri.c @@ -58,42 +58,43 @@ static HashTable *uri_get_debug_properties(zend_object *object) HashTable *std_properties = zend_std_get_properties(object); HashTable *result = zend_array_dup(std_properties); - if (UNEXPECTED(internal_uri->uri == NULL)) { + const php_uri_parser * const parser = internal_uri->parser; + void * const uri = internal_uri->uri; + + if (UNEXPECTED(uri == NULL)) { return result; } - const php_uri_parser *parser = internal_uri->parser; - zval tmp; - if (parser->property_handler.scheme.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.scheme.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_SCHEME), &tmp); } - if (parser->property_handler.username.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.username.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_USERNAME), &tmp); } - if (parser->property_handler.password.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.password.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PASSWORD), &tmp); } - if (parser->property_handler.host.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.host.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_HOST), &tmp); } - if (parser->property_handler.port.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.port.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PORT), &tmp); } - if (parser->property_handler.path.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.path.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_PATH), &tmp); } - if (parser->property_handler.query.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.query.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_QUERY), &tmp); } - if (parser->property_handler.fragment.read(internal_uri->uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { + if (parser->property_handler.fragment.read(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &tmp) == SUCCESS) { zend_hash_update(result, ZSTR_KNOWN(ZEND_STR_FRAGMENT), &tmp); }