Skip to content

Commit a2fedf2

Browse files
committed
Handle simple cases more efficiently
1 parent e514253 commit a2fedf2

File tree

1 file changed

+43
-12
lines changed

1 file changed

+43
-12
lines changed

ext/reflection/php_reflection.c

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,20 +1320,13 @@ static zend_op *_reflection_param_get_default_precv(INTERNAL_FUNCTION_PARAMETERS
13201320
}
13211321
/* }}} */
13221322

1323-
/* {{{ _reflection_param_get_default_arg_info */
1324-
static int _reflection_param_get_default_arg_info(zend_function *fptr, zend_internal_arg_info *arg_info, zval *default_value_zval)
1325-
{
1326-
if (!arg_info || arg_info->default_value == NULL) {
1327-
zend_throw_exception_ex(reflection_exception_ptr, 0, "Internal error: Failed to retrieve the default value");
1328-
return FAILURE;
1329-
}
1330-
1323+
static int get_default_via_ast(zval *default_value_zval, const char *default_value) {
13311324
zend_ast *ast;
13321325
zend_arena *ast_arena;
13331326

13341327
smart_str code = {0};
13351328
smart_str_appends(&code, "<?php ");
1336-
smart_str_appends(&code, arg_info->default_value);
1329+
smart_str_appends(&code, default_value);
13371330
smart_str_appendc(&code, ';');
13381331
smart_str_0(&code);
13391332

@@ -1351,6 +1344,7 @@ static int _reflection_param_get_default_arg_info(zend_function *fptr, zend_inte
13511344
zend_arena *original_ast_arena = CG(ast_arena);
13521345
uint32_t original_compiler_options = CG(compiler_options);
13531346
CG(ast_arena) = ast_arena;
1347+
/* Disable constant substitution, to make getDefaultValueConstant() work. */
13541348
CG(compiler_options) |= ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION | ZEND_COMPILE_NO_PERSISTENT_CONSTANT_SUBSTITUTION;
13551349
zend_const_expr_to_zval(default_value_zval, const_expression_ast);
13561350
CG(ast_arena) = original_ast_arena;
@@ -1362,6 +1356,43 @@ static int _reflection_param_get_default_arg_info(zend_function *fptr, zend_inte
13621356
return SUCCESS;
13631357
}
13641358

1359+
/* {{{ _reflection_param_get_default_arg_info */
1360+
static int _reflection_param_get_default_arg_info(zend_internal_arg_info *arg_info, zval *default_value_zval)
1361+
{
1362+
const char *default_value = arg_info->default_value;
1363+
if (!default_value) {
1364+
zend_throw_exception_ex(reflection_exception_ptr, 0, "Internal error: Failed to retrieve the default value");
1365+
return FAILURE;
1366+
}
1367+
1368+
/* Avoid going through the full AST machinery for some simple and common cases. */
1369+
size_t default_value_len = strlen(default_value);
1370+
zend_ulong lval;
1371+
if (default_value_len == sizeof("null")-1
1372+
&& !memcmp(default_value, "null", sizeof("null")-1)) {
1373+
ZVAL_NULL(default_value_zval);
1374+
return SUCCESS;
1375+
} else if (default_value_len == sizeof("true")-1
1376+
&& !memcmp(default_value, "true", sizeof("true")-1)) {
1377+
ZVAL_TRUE(default_value_zval);
1378+
return SUCCESS;
1379+
} else if (default_value_len == sizeof("false")-1
1380+
&& !memcmp(default_value, "false", sizeof("false")-1)) {
1381+
ZVAL_FALSE(default_value_zval);
1382+
return SUCCESS;
1383+
} else if (default_value_len == sizeof("\"\"")-1
1384+
&& (!memcmp(default_value, "\"\"", sizeof("\"\"")-1)
1385+
|| !memcmp(default_value, "''", sizeof("''")-1))) {
1386+
ZVAL_EMPTY_STRING(default_value_zval);
1387+
return SUCCESS;
1388+
} else if (ZEND_HANDLE_NUMERIC_STR(default_value, default_value_len, lval)) {
1389+
ZVAL_LONG(default_value_zval, lval);
1390+
return SUCCESS;
1391+
}
1392+
1393+
return get_default_via_ast(default_value_zval, default_value);
1394+
}
1395+
13651396
/* {{{ Preventing __clone from being called */
13661397
ZEND_METHOD(reflection, __clone)
13671398
{
@@ -2692,7 +2723,7 @@ ZEND_METHOD(reflection_parameter, getDefaultValue)
26922723

26932724
if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
26942725
zval default_value_zval;
2695-
if (_reflection_param_get_default_arg_info(param->fptr, (zend_internal_arg_info*) (param->arg_info), &default_value_zval) == FAILURE) {
2726+
if (_reflection_param_get_default_arg_info((zend_internal_arg_info*) (param->arg_info), &default_value_zval) == FAILURE) {
26962727
RETURN_THROWS();
26972728
}
26982729

@@ -2729,7 +2760,7 @@ ZEND_METHOD(reflection_parameter, isDefaultValueConstant)
27292760

27302761
if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
27312762
zval default_value_zval;
2732-
if (_reflection_param_get_default_arg_info(param->fptr, (zend_internal_arg_info*) (param->arg_info), &default_value_zval) == FAILURE) {
2763+
if (_reflection_param_get_default_arg_info((zend_internal_arg_info*) (param->arg_info), &default_value_zval) == FAILURE) {
27332764
RETURN_THROWS();
27342765
}
27352766

@@ -2775,7 +2806,7 @@ ZEND_METHOD(reflection_parameter, getDefaultValueConstantName)
27752806

27762807
if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
27772808
zval default_value_zval;
2778-
if (_reflection_param_get_default_arg_info(param->fptr, (zend_internal_arg_info*) (param->arg_info), &default_value_zval) == FAILURE) {
2809+
if (_reflection_param_get_default_arg_info((zend_internal_arg_info*) (param->arg_info), &default_value_zval) == FAILURE) {
27792810
RETURN_THROWS();
27802811
}
27812812

0 commit comments

Comments
 (0)