Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ddd25cc

Browse files
committed
uri: Remove php_uri_parse() and php_uri_free()
This API is both less powerful as well as less efficient compared to just calling the `->parse_uri()` handler of the parser directly. With regard to efficiency it needlessly allocates 32 byte of memory to store two pointers, of which one is already known, because it's the input. While it would be possible to just return the resulting `uri_internal_t` struct (instead of a pointer to a freshly allocated one), which would be returned as a register pair, users of the API can also just create the struct themselves for even more flexibility in allocations. The API is also less powerful, because it does not support base URIs.
1 parent e2f3074 commit ddd25cc

File tree

4 files changed

+94
-54
lines changed

4 files changed

+94
-54
lines changed

‎ext/openssl/xp_ssl.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2640,14 +2640,19 @@ static char *php_openssl_get_url_name(const char *resourcename,
26402640
return NULL;
26412641
}
26422642

2643-
uri_internal_t *internal_uri = php_uri_parse(uri_parser, resourcename, resourcenamelen, true);
2644-
if (internal_uri == NULL) {
2643+
void *parsed = uri_parser->parse(resourcename, resourcenamelen,
2644+
/* base_url */ NULL, /* errors */ NULL, /* silent */ true);
2645+
if (parsed == NULL) {
26452646
return NULL;
26462647
}
2648+
uri_internal_t internal_uri = {
2649+
.parser = uri_parser,
2650+
.uri = parsed,
2651+
};
26472652

26482653
char * url_name = NULL;
26492654
zval host_zv;
2650-
zend_result result = php_uri_get_host(internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &host_zv);
2655+
zend_result result = php_uri_get_host(&internal_uri, PHP_URI_COMPONENT_READ_MODE_RAW, &host_zv);
26512656
if (result == SUCCESS && Z_TYPE(host_zv) == IS_STRING) {
26522657
const char * host = Z_STRVAL(host_zv);
26532658
size_t len = Z_STRLEN(host_zv);
@@ -2662,7 +2667,7 @@ static char *php_openssl_get_url_name(const char *resourcename,
26622667
}
26632668
}
26642669

2665-
php_uri_free(internal_uri);
2670+
uri_parser->free(parsed);
26662671
zval_ptr_dtor(&host_zv);
26672672

26682673
return url_name;

‎ext/uri/php_uri.c

Lines changed: 60 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ PHPAPI const php_uri_parser *php_uri_get_parser(zend_string *uri_parser_name)
110110
return zend_hash_find_ptr(&uri_parsers, uri_parser_name);
111111
}
112112

113+
<<<<<<< HEAD
113114
ZEND_ATTRIBUTE_NONNULL PHPAPI uri_internal_t *php_uri_parse(const php_uri_parser *uri_parser, const char *uri_str, size_t uri_str_len, bool silent)
114115
{
115116
void *parsed = uri_parser->parse(uri_str, uri_str_len, NULL, NULL, silent);
@@ -123,6 +124,42 @@ ZEND_ATTRIBUTE_NONNULL PHPAPI uri_internal_t *php_uri_parse(const php_uri_parser
123124
internal_uri->uri = parsed;
124125

125126
return internal_uri;
127+
||||||| parent of c5c6f7b15ec (uri: Remove `php_uri_parse()` and `php_uri_free()`)
128+
ZEND_ATTRIBUTE_NONNULL PHPAPI uri_internal_t *php_uri_parse(const php_uri_parser *uri_parser, const char *uri_str, size_t uri_str_len, bool silent)
129+
{
130+
void *parsed = uri_parser->parse(uri_str, uri_str_len, NULL, NULL, silent);
131+
132+
if (parsed == NULL) {
133+
return NULL;
134+
}
135+
136+
uri_internal_t *internal_uri = emalloc(sizeof(*internal_uri));
137+
internal_uri->parser = uri_parser;
138+
internal_uri->uri = parsed;
139+
140+
return internal_uri;
141+
}
142+
143+
ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_get_property(const uri_internal_t *internal_uri, php_uri_property_name property_name, php_uri_component_read_mode read_mode, zval *zv)
144+
{
145+
const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
146+
if (property_handler == NULL) {
147+
return FAILURE;
148+
}
149+
150+
return property_handler->read(internal_uri, read_mode, zv);
151+
}
152+
153+
=======
154+
ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_get_property(const uri_internal_t *internal_uri, php_uri_property_name property_name, php_uri_component_read_mode read_mode, zval *zv)
155+
{
156+
const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
157+
if (property_handler == NULL) {
158+
return FAILURE;
159+
}
160+
161+
return property_handler->read(internal_uri, read_mode, zv);
162+
>>>>>>> c5c6f7b15ec (uri: Remove `php_uri_parse()` and `php_uri_free()`)
126163
}
127164

128165
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)
@@ -165,96 +202,95 @@ ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_fragment(const uri_interna
165202
return internal_uri->parser->property_handler.fragment.read(internal_uri->uri, read_mode, zv);
166203
}
167204

168-
ZEND_ATTRIBUTE_NONNULL PHPAPI void php_uri_free(uri_internal_t *internal_uri)
169-
{
170-
internal_uri->parser->free(internal_uri->uri);
171-
internal_uri->uri = NULL;
172-
internal_uri->parser = NULL;
173-
efree(internal_uri);
174-
}
175-
176205
ZEND_ATTRIBUTE_NONNULL PHPAPI php_uri *php_uri_parse_to_struct(
177206
const php_uri_parser *uri_parser, const char *uri_str, size_t uri_str_len, php_uri_component_read_mode read_mode, bool silent
178207
) {
179-
uri_internal_t *uri_internal = php_uri_parse(uri_parser, uri_str, uri_str_len, silent);
180-
if (uri_internal == NULL) {
208+
void *parsed = uri_parser->parse(uri_str, uri_str_len,
209+
/* base_url */ NULL, /* errors */ NULL, silent);
210+
if (parsed == NULL) {
181211
return NULL;
182212
}
183213

214+
uri_internal_t uri_internal = {
215+
.parser = uri_parser,
216+
.uri = parsed,
217+
};
218+
184219
php_uri *uri = ecalloc(1, sizeof(*uri));
185220
zval tmp;
186221
zend_result result;
187222

188-
result = php_uri_get_scheme(uri_internal, read_mode, &tmp);
223+
result = php_uri_get_scheme(&uri_internal, read_mode, &tmp);
189224
if (result == FAILURE) {
190225
goto error;
191226
}
192227
if (Z_TYPE(tmp) == IS_STRING) {
193228
uri->scheme = Z_STR(tmp);
194229
}
195230

196-
result = php_uri_get_username(uri_internal, read_mode, &tmp);
231+
result = php_uri_get_username(&uri_internal, read_mode, &tmp);
197232
if (result == FAILURE) {
198233
goto error;
199234
}
200235
if (Z_TYPE(tmp) == IS_STRING) {
201236
uri->user = Z_STR(tmp);
202237
}
203238

204-
result = php_uri_get_password(uri_internal, read_mode, &tmp);
239+
result = php_uri_get_password(&uri_internal, read_mode, &tmp);
205240
if (result == FAILURE) {
206241
goto error;
207242
}
208243
if (Z_TYPE(tmp) == IS_STRING) {
209244
uri->password = Z_STR(tmp);
210245
}
211246

212-
result = php_uri_get_host(uri_internal, read_mode, &tmp);
247+
result = php_uri_get_host(&uri_internal, read_mode, &tmp);
213248
if (result == FAILURE) {
214249
goto error;
215250
}
216251
if (Z_TYPE(tmp) == IS_STRING) {
217252
uri->host = Z_STR(tmp);
218253
}
219254

220-
result = php_uri_get_port(uri_internal, read_mode, &tmp);
255+
result = php_uri_get_port(&uri_internal, read_mode, &tmp);
221256
if (result == FAILURE) {
222257
goto error;
223258
}
224259
if (Z_TYPE(tmp) == IS_LONG) {
225260
uri->port = Z_LVAL(tmp);
226261
}
227262

228-
result = php_uri_get_path(uri_internal, read_mode, &tmp);
263+
result = php_uri_get_path(&uri_internal, read_mode, &tmp);
229264
if (result == FAILURE) {
230265
goto error;
231266
}
232267
if (Z_TYPE(tmp) == IS_STRING) {
233268
uri->path = Z_STR(tmp);
234269
}
235270

236-
result = php_uri_get_query(uri_internal, read_mode, &tmp);
271+
result = php_uri_get_query(&uri_internal, read_mode, &tmp);
237272
if (result == FAILURE) {
238273
goto error;
239274
}
240275
if (Z_TYPE(tmp) == IS_STRING) {
241276
uri->query = Z_STR(tmp);
242277
}
243278

244-
result = php_uri_get_fragment(uri_internal, read_mode, &tmp);
279+
result = php_uri_get_fragment(&uri_internal, read_mode, &tmp);
245280
if (result == FAILURE) {
246281
goto error;
247282
}
248283
if (Z_TYPE(tmp) == IS_STRING) {
249284
uri->fragment = Z_STR(tmp);
250285
}
251286

252-
php_uri_free(uri_internal);
287+
uri_parser->free(parsed);
253288

254289
return uri;
255290

256291
error:
257-
php_uri_free(uri_internal);
292+
293+
uri_parser->free(parsed);
258294
php_uri_struct_free(uri);
259295

260296
return NULL;
@@ -351,7 +387,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 2) PHPAPI void php_uri_instantiate_uri(
351387
base_url = internal_base_url->uri;
352388
}
353389

354-
void *uri = uri_parser->parse(ZSTR_VAL(uri_str), ZSTR_LEN(uri_str), base_url, errors_zv != NULL ? &errors : NULL, !should_throw);
390+
void *uri = uri_parser->parse(ZSTR_VAL(uri_str), ZSTR_LEN(uri_str),
391+
base_url, errors_zv != NULL ? &errors : NULL, !should_throw);
355392
if (UNEXPECTED(uri == NULL)) {
356393
if (should_throw) {
357394
zval_ptr_dtor(&errors);
@@ -853,7 +890,8 @@ static void uri_unserialize(INTERNAL_FUNCTION_PARAMETERS)
853890
zend_throw_exception_ex(NULL, 0, "Invalid serialization data for %s object", ZSTR_VAL(object->ce->name));
854891
RETURN_THROWS();
855892
}
856-
internal_uri->uri = internal_uri->parser->parse(Z_STRVAL_P(uri_zv), Z_STRLEN_P(uri_zv), NULL, NULL, true);
893+
internal_uri->uri = internal_uri->parser->parse(Z_STRVAL_P(uri_zv), Z_STRLEN_P(uri_zv),
894+
/* base_url */ NULL, /* errors */ NULL, /* silent */ true);
857895
if (internal_uri->uri == NULL) {
858896
zend_throw_exception_ex(NULL, 0, "Invalid serialization data for %s object", ZSTR_VAL(object->ce->name));
859897
RETURN_THROWS();

‎ext/uri/php_uri.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ PHPAPI zend_result php_uri_parser_register(const php_uri_parser *uri_parser);
4949
*/
5050
PHPAPI const php_uri_parser *php_uri_get_parser(zend_string *uri_parser_name);
5151

52-
ZEND_ATTRIBUTE_NONNULL PHPAPI uri_internal_t *php_uri_parse(const php_uri_parser *uri_parser, const char *uri_str, size_t uri_str_len, bool silent);
53-
5452
/**
5553
* Retrieves the scheme component based on the read_mode and passes it to the zv ZVAL in case of success.
5654
*
@@ -171,13 +169,6 @@ ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_query(const uri_internal_t
171169
*/
172170
ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_fragment(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv);
173171

174-
/**
175-
* Frees the uri member within the provided internal URI.
176-
*
177-
* @param internal_uri The internal URI
178-
*/
179-
ZEND_ATTRIBUTE_NONNULL PHPAPI void php_uri_free(uri_internal_t *internal_uri);
180-
181172
/**
182173
* Creates a new php_uri struct containing all the URI components. The components are retrieved based on the read_mode parameter.
183174
*

‎ext/zend_test/test.c

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -741,54 +741,60 @@ static ZEND_FUNCTION(zend_test_uri_parser)
741741
RETURN_THROWS();
742742
}
743743

744-
uri_internal_t *uri = php_uri_parse(parser, ZSTR_VAL(uri_string), ZSTR_LEN(uri_string), false);
745-
if (uri == NULL) {
744+
void *parsed = parser->parse(ZSTR_VAL(uri_string), ZSTR_LEN(uri_string),
745+
/* base_url */ NULL, /* errors */ NULL, /* silent */ false);
746+
if (parsed == NULL) {
746747
RETURN_THROWS();
747748
}
748749

750+
uri_internal_t uri = {
751+
.parser = parser,
752+
.uri = parsed,
753+
};
754+
749755
zval value;
750756

751757
array_init(return_value);
752758
zval normalized;
753759
array_init(&normalized);
754-
php_uri_get_scheme(uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
760+
php_uri_get_scheme(&uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
755761
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_SCHEME), &value);
756-
php_uri_get_username(uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
762+
php_uri_get_username(&uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
757763
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_USERNAME), &value);
758-
php_uri_get_password(uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
764+
php_uri_get_password(&uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
759765
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_PASSWORD), &value);
760-
php_uri_get_host(uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
766+
php_uri_get_host(&uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
761767
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_HOST), &value);
762-
php_uri_get_port(uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
768+
php_uri_get_port(&uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
763769
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_PORT), &value);
764-
php_uri_get_path(uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
770+
php_uri_get_path(&uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
765771
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_PATH), &value);
766-
php_uri_get_query(uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
772+
php_uri_get_query(&uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
767773
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_QUERY), &value);
768-
php_uri_get_fragment(uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
774+
php_uri_get_fragment(&uri, PHP_URI_COMPONENT_READ_MODE_NORMALIZED_ASCII, &value);
769775
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_FRAGMENT), &value);
770776
zend_hash_str_add(Z_ARR_P(return_value), "normalized", strlen("normalized"), &normalized);
771777
zval raw;
772778
array_init(&raw);
773-
php_uri_get_scheme(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
779+
php_uri_get_scheme(&uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
774780
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_SCHEME), &value);
775-
php_uri_get_username(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
781+
php_uri_get_username(&uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
776782
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_USERNAME), &value);
777-
php_uri_get_password(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
783+
php_uri_get_password(&uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
778784
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_PASSWORD), &value);
779-
php_uri_get_host(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
785+
php_uri_get_host(&uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
780786
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_HOST), &value);
781-
php_uri_get_port(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
787+
php_uri_get_port(&uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
782788
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_PORT), &value);
783-
php_uri_get_path(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
789+
php_uri_get_path(&uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
784790
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_PATH), &value);
785-
php_uri_get_query(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
791+
php_uri_get_query(&uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
786792
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_QUERY), &value);
787-
php_uri_get_fragment(uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
793+
php_uri_get_fragment(&uri, PHP_URI_COMPONENT_READ_MODE_RAW, &value);
788794
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_FRAGMENT), &value);
789795
zend_hash_str_add(Z_ARR_P(return_value), "raw", strlen("raw"), &raw);
790796

791-
php_uri_free(uri);
797+
parser->free(parsed);
792798
}
793799

794800
static bool has_opline(zend_execute_data *execute_data)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /