Skip to content

Commit dbd7186

Browse files
committed
uri: Optimize php_uri_get_*()
Currently the `php_uri_get_*()` functions call into `php_uri_get_property()` with a constant `php_uri_property_name`. This name will then be used to look up the correct property handler by a function in a different compilation unit. Improve this by making `uri_property_handler_from_internal_uri` take a `php_uri_parser` rather than a `uri_internal_t`, defining it in a header as inlinable (and renaming it to better match its updated purpose). This allows the compiler to fully inline `php_uri_get_property()`, such that no dynamic lookups will need to happen.
1 parent d158e32 commit dbd7186

File tree

3 files changed

+27
-28
lines changed

3 files changed

+27
-28
lines changed

ext/uri/php_uri.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,9 @@ ZEND_ATTRIBUTE_NONNULL PHPAPI uri_internal_t *php_uri_parse(const php_uri_parser
124124
return internal_uri;
125125
}
126126

127-
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)
127+
ZEND_ATTRIBUTE_NONNULL static inline 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)
128128
{
129-
const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
129+
const php_uri_property_handler *property_handler = php_uri_parser_property_handler_by_name(internal_uri->parser, property_name);
130130

131131
return property_handler->read(internal_uri->uri, read_mode, zv);
132132
}

ext/uri/php_uri_common.c

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,6 @@
1919
#include "Zend/zend_exceptions.h"
2020
#include "php_uri_common.h"
2121

22-
const php_uri_property_handler *uri_property_handler_from_internal_uri(const uri_internal_t *internal_uri, php_uri_property_name property_name)
23-
{
24-
switch (property_name) {
25-
case PHP_URI_PROPERTY_NAME_SCHEME:
26-
return &internal_uri->parser->property_handler.scheme;
27-
case PHP_URI_PROPERTY_NAME_USERNAME:
28-
return &internal_uri->parser->property_handler.username;
29-
case PHP_URI_PROPERTY_NAME_PASSWORD:
30-
return &internal_uri->parser->property_handler.password;
31-
case PHP_URI_PROPERTY_NAME_HOST:
32-
return &internal_uri->parser->property_handler.host;
33-
case PHP_URI_PROPERTY_NAME_PORT:
34-
return &internal_uri->parser->property_handler.port;
35-
case PHP_URI_PROPERTY_NAME_PATH:
36-
return &internal_uri->parser->property_handler.path;
37-
case PHP_URI_PROPERTY_NAME_QUERY:
38-
return &internal_uri->parser->property_handler.query;
39-
case PHP_URI_PROPERTY_NAME_FRAGMENT:
40-
return &internal_uri->parser->property_handler.fragment;
41-
EMPTY_SWITCH_DEFAULT_CASE()
42-
}
43-
}
44-
4522
static zend_string *get_known_string_by_property_name(php_uri_property_name property_name)
4623
{
4724
switch (property_name) {
@@ -72,7 +49,7 @@ void uri_read_component(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name prop
7249
uri_internal_t *internal_uri = Z_URI_INTERNAL_P(ZEND_THIS);
7350
URI_ASSERT_INITIALIZATION(internal_uri);
7451

75-
const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
52+
const php_uri_property_handler *property_handler = php_uri_parser_property_handler_by_name(internal_uri->parser, property_name);
7653

7754
if (UNEXPECTED(property_handler->read(internal_uri->uri, component_read_mode, return_value) == FAILURE)) {
7855
zend_throw_error(NULL, "The %s component cannot be retrieved", ZSTR_VAL(get_known_string_by_property_name(property_name)));
@@ -95,7 +72,7 @@ static void uri_write_component_ex(INTERNAL_FUNCTION_PARAMETERS, php_uri_propert
9572
* case of an exception being thrown. */
9673
RETVAL_OBJ(new_object);
9774

98-
const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
75+
const php_uri_property_handler *property_handler = php_uri_parser_property_handler_by_name(internal_uri->parser, property_name);
9976

10077
uri_internal_t *new_internal_uri = uri_internal_from_obj(new_object);
10178
URI_ASSERT_INITIALIZATION(new_internal_uri);

ext/uri/php_uri_common.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,29 @@ PHPAPI zend_object *php_uri_object_handler_clone(zend_object *object);
166166
#define PHP_URI_PARSER_PHP_PARSE_URL "parse_url"
167167
#define URI_SERIALIZED_PROPERTY_NAME "uri"
168168

169-
const php_uri_property_handler *uri_property_handler_from_internal_uri(const uri_internal_t *internal_uri, php_uri_property_name property_name);
169+
static inline const php_uri_property_handler *php_uri_parser_property_handler_by_name(const php_uri_parser *parser, php_uri_property_name property_name)
170+
{
171+
switch (property_name) {
172+
case PHP_URI_PROPERTY_NAME_SCHEME:
173+
return &parser->property_handler.scheme;
174+
case PHP_URI_PROPERTY_NAME_USERNAME:
175+
return &parser->property_handler.username;
176+
case PHP_URI_PROPERTY_NAME_PASSWORD:
177+
return &parser->property_handler.password;
178+
case PHP_URI_PROPERTY_NAME_HOST:
179+
return &parser->property_handler.host;
180+
case PHP_URI_PROPERTY_NAME_PORT:
181+
return &parser->property_handler.port;
182+
case PHP_URI_PROPERTY_NAME_PATH:
183+
return &parser->property_handler.path;
184+
case PHP_URI_PROPERTY_NAME_QUERY:
185+
return &parser->property_handler.query;
186+
case PHP_URI_PROPERTY_NAME_FRAGMENT:
187+
return &parser->property_handler.fragment;
188+
EMPTY_SWITCH_DEFAULT_CASE()
189+
}
190+
}
191+
170192
void uri_read_component(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name, php_uri_component_read_mode component_read_mode);
171193
void uri_write_component_str(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name);
172194
void uri_write_component_str_or_null(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name);

0 commit comments

Comments
 (0)