@@ -558,8 +558,7 @@ static void _class_const_string(smart_str *str, char *name, zend_class_constant
558
558
}
559
559
/* }}} */
560
560
561
- /* {{{ _get_recv_opcode */
562
- static zend_op * _get_recv_op (zend_op_array * op_array , uint32_t offset )
561
+ static zend_op * get_recv_op (zend_op_array * op_array , uint32_t offset )
563
562
{
564
563
zend_op * op = op_array -> opcodes ;
565
564
zend_op * end = op + op_array -> last ;
@@ -576,7 +575,15 @@ static zend_op* _get_recv_op(zend_op_array *op_array, uint32_t offset)
576
575
ZEND_ASSERT (0 && "Failed to find op" );
577
576
return NULL ;
578
577
}
579
- /* }}} */
578
+
579
+ static zval * get_default_from_recv (zend_op_array * op_array , uint32_t offset ) {
580
+ zend_op * recv = get_recv_op (op_array , offset );
581
+ if (!recv || recv -> opcode != ZEND_RECV_INIT ) {
582
+ return NULL ;
583
+ }
584
+
585
+ return RT_CONSTANT (recv , recv -> op2 );
586
+ }
580
587
581
588
static int format_default_value (smart_str * str , zval * value , zend_class_entry * scope ) {
582
589
zval zv ;
@@ -649,10 +656,10 @@ static void _parameter_string(smart_str *str, zend_function *fptr, struct _zend_
649
656
smart_str_appends (str , "<default>" );
650
657
}
651
658
} else {
652
- zend_op * precv = _get_recv_op ((zend_op_array * )fptr , offset );
653
- if (precv && precv -> opcode == ZEND_RECV_INIT && precv -> op2_type != IS_UNUSED ) {
659
+ zval * default_value = get_default_from_recv ((zend_op_array * )fptr , offset );
660
+ if (default_value ) {
654
661
smart_str_appends (str , " = " );
655
- if (format_default_value (str , RT_CONSTANT ( precv , precv -> op2 ) , fptr -> common .scope ) == FAILURE ) {
662
+ if (format_default_value (str , default_value , fptr -> common .scope ) == FAILURE ) {
656
663
return ;
657
664
}
658
665
}
@@ -1285,42 +1292,6 @@ static void reflection_class_constant_factory(zend_string *name_str, zend_class_
1285
1292
}
1286
1293
/* }}} */
1287
1294
1288
- /* {{{ _reflection_param_get_default_param */
1289
- static parameter_reference * _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAMETERS )
1290
- {
1291
- reflection_object * intern ;
1292
- parameter_reference * param ;
1293
-
1294
- intern = Z_REFLECTION_P (ZEND_THIS );
1295
- if (intern -> ptr == NULL ) {
1296
- if (EG (exception ) && EG (exception )-> ce == reflection_exception_ptr ) {
1297
- return NULL ;
1298
- }
1299
- zend_throw_error (NULL , "Internal error: Failed to retrieve the reflection object" );
1300
- return NULL ;
1301
- }
1302
-
1303
- param = intern -> ptr ;
1304
-
1305
- return param ;
1306
- }
1307
- /* }}} */
1308
-
1309
- /* {{{ _reflection_param_get_default_precv */
1310
- static zend_op * _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAMETERS , parameter_reference * param )
1311
- {
1312
- zend_op * precv ;
1313
-
1314
- precv = _get_recv_op ((zend_op_array * )param -> fptr , param -> offset );
1315
- if (!precv || precv -> opcode != ZEND_RECV_INIT || precv -> op2_type == IS_UNUSED ) {
1316
- zend_throw_exception_ex (reflection_exception_ptr , 0 , "Internal error: Failed to retrieve the default value" );
1317
- return NULL ;
1318
- }
1319
-
1320
- return precv ;
1321
- }
1322
- /* }}} */
1323
-
1324
1295
static int get_default_via_ast (zval * default_value_zval , const char * default_value ) {
1325
1296
zend_ast * ast ;
1326
1297
zend_arena * ast_arena ;
@@ -1335,7 +1306,6 @@ static int get_default_via_ast(zval *default_value_zval, const char *default_val
1335
1306
smart_str_free (& code );
1336
1307
1337
1308
if (!ast ) {
1338
- zend_throw_exception_ex (reflection_exception_ptr , 0 , "Internal error: Failed to retrieve the default value" );
1339
1309
return FAILURE ;
1340
1310
}
1341
1311
@@ -1370,12 +1340,10 @@ static zend_string *try_parse_string(const char *str, size_t len, char quote) {
1370
1340
return zend_string_init (str , len , 0 );
1371
1341
}
1372
1342
1373
- /* {{{ _reflection_param_get_default_arg_info */
1374
- static int _reflection_param_get_default_arg_info (zend_internal_arg_info * arg_info , zval * default_value_zval )
1343
+ static int get_default_from_arg_info (zval * default_value_zval , zend_internal_arg_info * arg_info )
1375
1344
{
1376
1345
const char * default_value = arg_info -> default_value ;
1377
1346
if (!default_value ) {
1378
- zend_throw_exception_ex (reflection_exception_ptr , 0 , "Internal error: Failed to retrieve the default value" );
1379
1347
return FAILURE ;
1380
1348
}
1381
1349
@@ -1418,6 +1386,20 @@ static int _reflection_param_get_default_arg_info(zend_internal_arg_info *arg_in
1418
1386
return get_default_via_ast (default_value_zval , default_value );
1419
1387
}
1420
1388
1389
+ static int get_parameter_default (zval * result , parameter_reference * param ) {
1390
+ if (param -> fptr -> type == ZEND_INTERNAL_FUNCTION ) {
1391
+ return get_default_from_arg_info (result , (zend_internal_arg_info * ) param -> arg_info );
1392
+ } else {
1393
+ zval * default_value = get_default_from_recv ((zend_op_array * ) param -> fptr , param -> offset );
1394
+ if (!default_value ) {
1395
+ return FAILURE ;
1396
+ }
1397
+
1398
+ ZVAL_COPY (result , default_value );
1399
+ return SUCCESS ;
1400
+ }
1401
+ }
1402
+
1421
1403
/* {{{ Preventing __clone from being called */
1422
1404
ZEND_METHOD (reflection , __clone )
1423
1405
{
@@ -2711,7 +2693,6 @@ ZEND_METHOD(reflection_parameter, isDefaultValueAvailable)
2711
2693
{
2712
2694
reflection_object * intern ;
2713
2695
parameter_reference * param ;
2714
- zend_op * precv ;
2715
2696
2716
2697
if (zend_parse_parameters_none () == FAILURE ) {
2717
2698
RETURN_THROWS ();
@@ -2720,13 +2701,10 @@ ZEND_METHOD(reflection_parameter, isDefaultValueAvailable)
2720
2701
GET_REFLECTION_OBJECT_PTR (param );
2721
2702
2722
2703
if (param -> fptr -> type == ZEND_INTERNAL_FUNCTION ) {
2723
- RETURN_BOOL (param -> arg_info && ((zend_internal_arg_info * ) (param -> arg_info ))-> default_value );
2704
+ RETURN_BOOL (((zend_internal_arg_info * ) (param -> arg_info ))-> default_value );
2724
2705
} else {
2725
- precv = _get_recv_op ((zend_op_array * )param -> fptr , param -> offset );
2726
- if (!precv || precv -> opcode != ZEND_RECV_INIT || precv -> op2_type == IS_UNUSED ) {
2727
- RETURN_FALSE ;
2728
- }
2729
- RETURN_TRUE ;
2706
+ zval * default_value = get_default_from_recv ((zend_op_array * )param -> fptr , param -> offset );
2707
+ RETURN_BOOL (default_value != NULL );
2730
2708
}
2731
2709
}
2732
2710
/* }}} */
@@ -2735,31 +2713,19 @@ ZEND_METHOD(reflection_parameter, isDefaultValueAvailable)
2735
2713
Returns the default value of this parameter or throws an exception */
2736
2714
ZEND_METHOD (reflection_parameter , getDefaultValue )
2737
2715
{
2716
+ reflection_object * intern ;
2738
2717
parameter_reference * param ;
2739
2718
2740
2719
if (zend_parse_parameters_none () == FAILURE ) {
2741
2720
RETURN_THROWS ();
2742
2721
}
2743
2722
2744
- param = _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAM_PASSTHRU );
2745
- if (!param ) {
2746
- RETURN_THROWS ();
2747
- }
2748
-
2749
- if (param -> fptr -> type == ZEND_INTERNAL_FUNCTION ) {
2750
- zval default_value_zval ;
2751
- if (_reflection_param_get_default_arg_info ((zend_internal_arg_info * ) (param -> arg_info ), & default_value_zval ) == FAILURE ) {
2752
- RETURN_THROWS ();
2753
- }
2754
-
2755
- RETVAL_COPY_VALUE (& default_value_zval );
2756
- } else {
2757
- zend_op * precv = _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAM_PASSTHRU , param );
2758
- if (!precv ) {
2759
- RETURN_THROWS ();
2760
- }
2723
+ GET_REFLECTION_OBJECT_PTR (param );
2761
2724
2762
- RETVAL_COPY (RT_CONSTANT (precv , precv -> op2 ));
2725
+ if (get_parameter_default (return_value , param ) == FAILURE ) {
2726
+ zend_throw_exception_ex (reflection_exception_ptr , 0 ,
2727
+ "Internal error: Failed to retrieve the default value" );
2728
+ RETURN_THROWS ();
2763
2729
}
2764
2730
2765
2731
if (Z_TYPE_P (return_value ) == IS_CONSTANT_AST ) {
@@ -2772,42 +2738,27 @@ ZEND_METHOD(reflection_parameter, getDefaultValue)
2772
2738
Returns whether the default value of this parameter is constant */
2773
2739
ZEND_METHOD (reflection_parameter , isDefaultValueConstant )
2774
2740
{
2741
+ reflection_object * intern ;
2775
2742
parameter_reference * param ;
2776
2743
2777
2744
if (zend_parse_parameters_none () == FAILURE ) {
2778
2745
RETURN_THROWS ();
2779
2746
}
2780
2747
2781
- param = _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAM_PASSTHRU );
2782
- if (!param ) {
2748
+ GET_REFLECTION_OBJECT_PTR (param );
2749
+
2750
+ zval default_value ;
2751
+ if (get_parameter_default (& default_value , param ) == FAILURE ) {
2752
+ zend_throw_exception_ex (reflection_exception_ptr , 0 ,
2753
+ "Internal error: Failed to retrieve the default value" );
2783
2754
RETURN_THROWS ();
2784
2755
}
2785
2756
2786
- if (param -> fptr -> type == ZEND_INTERNAL_FUNCTION ) {
2787
- zval default_value_zval ;
2788
- if (_reflection_param_get_default_arg_info ((zend_internal_arg_info * ) (param -> arg_info ), & default_value_zval ) == FAILURE ) {
2789
- RETURN_THROWS ();
2790
- }
2791
-
2792
- if (Z_TYPE (default_value_zval ) == IS_CONSTANT_AST ) {
2793
- zend_ast * ast = Z_ASTVAL (default_value_zval );
2794
- zval_dtor (& default_value_zval );
2795
- if (ast -> kind == ZEND_AST_CONSTANT || ast -> kind == ZEND_AST_CONSTANT_CLASS ) {
2796
- RETURN_TRUE ;
2797
- } else {
2798
- RETURN_FALSE ;
2799
- }
2800
- }
2757
+ if (Z_TYPE (default_value ) == IS_CONSTANT_AST ) {
2758
+ zend_ast * ast = Z_ASTVAL (default_value );
2759
+ RETVAL_BOOL (ast -> kind == ZEND_AST_CONSTANT || ast -> kind == ZEND_AST_CONSTANT_CLASS );
2760
+ zval_ptr_dtor_nogc (& default_value );
2801
2761
} else {
2802
- zend_op * precv = _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAM_PASSTHRU , param );
2803
- if (precv && Z_TYPE_P (RT_CONSTANT (precv , precv -> op2 )) == IS_CONSTANT_AST ) {
2804
- zend_ast * ast = Z_ASTVAL_P (RT_CONSTANT (precv , precv -> op2 ));
2805
-
2806
- if (ast -> kind == ZEND_AST_CONSTANT || ast -> kind == ZEND_AST_CONSTANT_CLASS ) {
2807
- RETURN_TRUE ;
2808
- }
2809
- }
2810
-
2811
2762
RETURN_FALSE ;
2812
2763
}
2813
2764
}
@@ -2817,46 +2768,36 @@ ZEND_METHOD(reflection_parameter, isDefaultValueConstant)
2817
2768
Returns the default value's constant name if default value is constant or null */
2818
2769
ZEND_METHOD (reflection_parameter , getDefaultValueConstantName )
2819
2770
{
2771
+ reflection_object * intern ;
2820
2772
parameter_reference * param ;
2821
- zend_ast * ast = NULL ;
2822
2773
2823
2774
if (zend_parse_parameters_none () == FAILURE ) {
2824
2775
RETURN_THROWS ();
2825
2776
}
2826
2777
2827
- param = _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAM_PASSTHRU );
2828
- if (!param ) {
2778
+ GET_REFLECTION_OBJECT_PTR (param );
2779
+
2780
+ zval default_value ;
2781
+ if (get_parameter_default (& default_value , param ) == FAILURE ) {
2782
+ zend_throw_exception_ex (reflection_exception_ptr , 0 ,
2783
+ "Internal error: Failed to retrieve the default value" );
2829
2784
RETURN_THROWS ();
2830
2785
}
2831
2786
2832
- if (param -> fptr -> type == ZEND_INTERNAL_FUNCTION ) {
2833
- zval default_value_zval ;
2834
- if (_reflection_param_get_default_arg_info ((zend_internal_arg_info * ) (param -> arg_info ), & default_value_zval ) == FAILURE ) {
2835
- RETURN_THROWS ();
2836
- }
2837
-
2838
- if (Z_TYPE (default_value_zval ) == IS_CONSTANT_AST ) {
2839
- ast = Z_ASTVAL (default_value_zval );
2840
- zval_dtor (& default_value_zval );
2841
- }
2842
- } else {
2843
- zend_op * precv = _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAM_PASSTHRU , param );
2844
- if (precv && Z_TYPE_P (RT_CONSTANT (precv , precv -> op2 )) == IS_CONSTANT_AST ) {
2845
- ast = Z_ASTVAL_P (RT_CONSTANT (precv , precv -> op2 ));
2846
- }
2787
+ if (Z_TYPE (default_value ) != IS_CONSTANT_AST ) {
2788
+ zval_ptr_dtor_nogc (& default_value );
2789
+ RETURN_NULL ();
2847
2790
}
2848
2791
2849
- if (ast ) {
2850
- if (ast -> kind == ZEND_AST_CONSTANT ) {
2851
- RETURN_STR_COPY (zend_ast_get_constant_name (ast ));
2852
- }
2853
-
2854
- if (ast -> kind == ZEND_AST_CONSTANT_CLASS ) {
2855
- RETURN_STRINGL ("__CLASS__" , sizeof ("__CLASS__" )- 1 );
2856
- }
2792
+ zend_ast * ast = Z_ASTVAL (default_value );
2793
+ if (ast -> kind == ZEND_AST_CONSTANT ) {
2794
+ RETVAL_STR_COPY (zend_ast_get_constant_name (ast ));
2795
+ } else if (ast -> kind == ZEND_AST_CONSTANT_CLASS ) {
2796
+ RETVAL_STRINGL ("__CLASS__" , sizeof ("__CLASS__" )- 1 );
2797
+ } else {
2798
+ RETVAL_NULL ();
2857
2799
}
2858
-
2859
- RETURN_NULL ();
2800
+ zval_ptr_dtor_nogc (& default_value );
2860
2801
}
2861
2802
2862
2803
/* {{{ proto public bool ReflectionParameter::isVariadic()
0 commit comments