@@ -1320,20 +1320,13 @@ static zend_op *_reflection_param_get_default_precv(INTERNAL_FUNCTION_PARAMETERS
1320
1320
}
1321
1321
/* }}} */
1322
1322
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 ) {
1331
1324
zend_ast * ast ;
1332
1325
zend_arena * ast_arena ;
1333
1326
1334
1327
smart_str code = {0 };
1335
1328
smart_str_appends (& code , "<?php " );
1336
- smart_str_appends (& code , arg_info -> default_value );
1329
+ smart_str_appends (& code , default_value );
1337
1330
smart_str_appendc (& code , ';' );
1338
1331
smart_str_0 (& code );
1339
1332
@@ -1351,6 +1344,7 @@ static int _reflection_param_get_default_arg_info(zend_function *fptr, zend_inte
1351
1344
zend_arena * original_ast_arena = CG (ast_arena );
1352
1345
uint32_t original_compiler_options = CG (compiler_options );
1353
1346
CG (ast_arena ) = ast_arena ;
1347
+ /* Disable constant substitution, to make getDefaultValueConstant() work. */
1354
1348
CG (compiler_options ) |= ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION | ZEND_COMPILE_NO_PERSISTENT_CONSTANT_SUBSTITUTION ;
1355
1349
zend_const_expr_to_zval (default_value_zval , const_expression_ast );
1356
1350
CG (ast_arena ) = original_ast_arena ;
@@ -1362,6 +1356,43 @@ static int _reflection_param_get_default_arg_info(zend_function *fptr, zend_inte
1362
1356
return SUCCESS ;
1363
1357
}
1364
1358
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
+
1365
1396
/* {{{ Preventing __clone from being called */
1366
1397
ZEND_METHOD (reflection , __clone )
1367
1398
{
@@ -2692,7 +2723,7 @@ ZEND_METHOD(reflection_parameter, getDefaultValue)
2692
2723
2693
2724
if (param -> fptr -> type == ZEND_INTERNAL_FUNCTION ) {
2694
2725
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 ) {
2696
2727
RETURN_THROWS ();
2697
2728
}
2698
2729
@@ -2729,7 +2760,7 @@ ZEND_METHOD(reflection_parameter, isDefaultValueConstant)
2729
2760
2730
2761
if (param -> fptr -> type == ZEND_INTERNAL_FUNCTION ) {
2731
2762
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 ) {
2733
2764
RETURN_THROWS ();
2734
2765
}
2735
2766
@@ -2775,7 +2806,7 @@ ZEND_METHOD(reflection_parameter, getDefaultValueConstantName)
2775
2806
2776
2807
if (param -> fptr -> type == ZEND_INTERNAL_FUNCTION ) {
2777
2808
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 ) {
2779
2810
RETURN_THROWS ();
2780
2811
}
2781
2812
0 commit comments