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 c5c6f7b

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 334c0e6 commit c5c6f7b

File tree

4 files changed

+57
-69
lines changed

4 files changed

+57
-69
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: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -109,21 +109,6 @@ PHPAPI const php_uri_parser *php_uri_get_parser(zend_string *uri_parser_name)
109109
return zend_hash_find_ptr(&uri_parsers, uri_parser_name);
110110
}
111111

112-
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)
113-
{
114-
void *parsed = uri_parser->parse(uri_str, uri_str_len, NULL, NULL, silent);
115-
116-
if (parsed == NULL) {
117-
return NULL;
118-
}
119-
120-
uri_internal_t *internal_uri = emalloc(sizeof(*internal_uri));
121-
internal_uri->parser = uri_parser;
122-
internal_uri->uri = parsed;
123-
124-
return internal_uri;
125-
}
126-
127112
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)
128113
{
129114
const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
@@ -174,96 +159,95 @@ ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_fragment(const uri_interna
174159
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_FRAGMENT, read_mode, zv);
175160
}
176161

177-
ZEND_ATTRIBUTE_NONNULL PHPAPI void php_uri_free(uri_internal_t *internal_uri)
178-
{
179-
internal_uri->parser->free(internal_uri->uri);
180-
internal_uri->uri = NULL;
181-
internal_uri->parser = NULL;
182-
efree(internal_uri);
183-
}
184-
185162
ZEND_ATTRIBUTE_NONNULL PHPAPI php_uri *php_uri_parse_to_struct(
186163
const php_uri_parser *uri_parser, const char *uri_str, size_t uri_str_len, php_uri_component_read_mode read_mode, bool silent
187164
) {
188-
uri_internal_t *uri_internal = php_uri_parse(uri_parser, uri_str, uri_str_len, silent);
189-
if (uri_internal == NULL) {
165+
void *parsed = uri_parser->parse(uri_str, uri_str_len,
166+
/* base_url */ NULL, /* errors */ NULL, silent);
167+
if (parsed == NULL) {
190168
return NULL;
191169
}
192170

171+
uri_internal_t uri_internal = {
172+
.parser = uri_parser,
173+
.uri = parsed,
174+
};
175+
193176
php_uri *uri = ecalloc(1, sizeof(*uri));
194177
zval tmp;
195178
zend_result result;
196179

197-
result = php_uri_get_scheme(uri_internal, read_mode, &tmp);
180+
result = php_uri_get_scheme(&uri_internal, read_mode, &tmp);
198181
if (result == FAILURE) {
199182
goto error;
200183
}
201184
if (Z_TYPE(tmp) == IS_STRING) {
202185
uri->scheme = Z_STR(tmp);
203186
}
204187

205-
result = php_uri_get_username(uri_internal, read_mode, &tmp);
188+
result = php_uri_get_username(&uri_internal, read_mode, &tmp);
206189
if (result == FAILURE) {
207190
goto error;
208191
}
209192
if (Z_TYPE(tmp) == IS_STRING) {
210193
uri->user = Z_STR(tmp);
211194
}
212195

213-
result = php_uri_get_password(uri_internal, read_mode, &tmp);
196+
result = php_uri_get_password(&uri_internal, read_mode, &tmp);
214197
if (result == FAILURE) {
215198
goto error;
216199
}
217200
if (Z_TYPE(tmp) == IS_STRING) {
218201
uri->password = Z_STR(tmp);
219202
}
220203

221-
result = php_uri_get_host(uri_internal, read_mode, &tmp);
204+
result = php_uri_get_host(&uri_internal, read_mode, &tmp);
222205
if (result == FAILURE) {
223206
goto error;
224207
}
225208
if (Z_TYPE(tmp) == IS_STRING) {
226209
uri->host = Z_STR(tmp);
227210
}
228211

229-
result = php_uri_get_port(uri_internal, read_mode, &tmp);
212+
result = php_uri_get_port(&uri_internal, read_mode, &tmp);
230213
if (result == FAILURE) {
231214
goto error;
232215
}
233216
if (Z_TYPE(tmp) == IS_LONG) {
234217
uri->port = Z_LVAL(tmp);
235218
}
236219

237-
result = php_uri_get_path(uri_internal, read_mode, &tmp);
220+
result = php_uri_get_path(&uri_internal, read_mode, &tmp);
238221
if (result == FAILURE) {
239222
goto error;
240223
}
241224
if (Z_TYPE(tmp) == IS_STRING) {
242225
uri->path = Z_STR(tmp);
243226
}
244227

245-
result = php_uri_get_query(uri_internal, read_mode, &tmp);
228+
result = php_uri_get_query(&uri_internal, read_mode, &tmp);
246229
if (result == FAILURE) {
247230
goto error;
248231
}
249232
if (Z_TYPE(tmp) == IS_STRING) {
250233
uri->query = Z_STR(tmp);
251234
}
252235

253-
result = php_uri_get_fragment(uri_internal, read_mode, &tmp);
236+
result = php_uri_get_fragment(&uri_internal, read_mode, &tmp);
254237
if (result == FAILURE) {
255238
goto error;
256239
}
257240
if (Z_TYPE(tmp) == IS_STRING) {
258241
uri->fragment = Z_STR(tmp);
259242
}
260243

261-
php_uri_free(uri_internal);
244+
uri_parser->free(parsed);
262245

263246
return uri;
264247

265248
error:
266-
php_uri_free(uri_internal);
249+
250+
uri_parser->free(parsed);
267251
php_uri_struct_free(uri);
268252

269253
return NULL;
@@ -356,7 +340,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 2) PHPAPI void php_uri_instantiate_uri(
356340
base_url = internal_base_url->uri;
357341
}
358342

359-
void *uri = uri_parser->parse(ZSTR_VAL(uri_str), ZSTR_LEN(uri_str), base_url, errors_zv != NULL ? &errors : NULL, !should_throw);
343+
void *uri = uri_parser->parse(ZSTR_VAL(uri_str), ZSTR_LEN(uri_str),
344+
base_url, errors_zv != NULL ? &errors : NULL, !should_throw);
360345
if (UNEXPECTED(uri == NULL)) {
361346
if (should_throw) {
362347
zval_ptr_dtor(&errors);
@@ -853,7 +838,8 @@ static void uri_unserialize(INTERNAL_FUNCTION_PARAMETERS)
853838

854839
uri_internal_t *internal_uri = uri_internal_from_obj(object);
855840
internal_uri->parser->free(internal_uri->uri);
856-
internal_uri->uri = internal_uri->parser->parse(Z_STRVAL_P(uri_zv), Z_STRLEN_P(uri_zv), NULL, NULL, true);
841+
internal_uri->uri = internal_uri->parser->parse(Z_STRVAL_P(uri_zv), Z_STRLEN_P(uri_zv),
842+
/* base_url */ NULL, /* errors */ NULL, /* silent */ true);
857843
if (internal_uri->uri == NULL) {
858844
zend_throw_exception_ex(NULL, 0, "Invalid serialization data for %s object", ZSTR_VAL(object->ce->name));
859845
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 によって変換されたページ (->オリジナル) /