@@ -1457,6 +1457,49 @@ static void _reflection_export(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *c
1457
1457
}
1458
1458
/* }}} */
1459
1459
1460
+ /* {{{ _reflection_param_get_default_param */
1461
+ static parameter_reference * _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAMETERS )
1462
+ {
1463
+ reflection_object * intern ;
1464
+ parameter_reference * param ;
1465
+
1466
+ GET_REFLECTION_OBJECT_PTR (param );
1467
+
1468
+ if (param -> fptr -> type != ZEND_USER_FUNCTION )
1469
+ {
1470
+ zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Cannot determine default value for internal functions" );
1471
+ return NULL ;
1472
+ }
1473
+
1474
+ if (param -> offset < param -> required ) {
1475
+ zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Parameter is not optional" );
1476
+ return NULL ;
1477
+ }
1478
+
1479
+ return param ;
1480
+ }
1481
+ /* }}} */
1482
+
1483
+ /* {{{ _reflection_param_get_default_precv */
1484
+ static zend_op * _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAMETERS , parameter_reference * param )
1485
+ {
1486
+ zend_op * precv ;
1487
+
1488
+ param = param ? param : _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAM_PASSTHRU );
1489
+ if (!param ) {
1490
+ return NULL ;
1491
+ }
1492
+
1493
+ precv = _get_recv_op ((zend_op_array * )param -> fptr , param -> offset );
1494
+ if (!precv || precv -> opcode != ZEND_RECV_INIT || precv -> op2_type == IS_UNUSED ) {
1495
+ zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Internal error" );
1496
+ return NULL ;
1497
+ }
1498
+
1499
+ return precv ;
1500
+ }
1501
+ /* }}} */
1502
+
1460
1503
/* {{{ Preventing __clone from being called */
1461
1504
ZEND_METHOD (reflection , __clone )
1462
1505
{
@@ -2535,27 +2578,14 @@ ZEND_METHOD(reflection_parameter, isDefaultValueAvailable)
2535
2578
Returns the default value of this parameter or throws an exception */
2536
2579
ZEND_METHOD (reflection_parameter , getDefaultValue )
2537
2580
{
2538
- reflection_object * intern ;
2539
- parameter_reference * param ;
2540
- zend_op * precv ;
2581
+ parameter_reference * param = _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAM_PASSTHRU );
2582
+ zend_op * precv = _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAM_PASSTHRU , param );
2541
2583
2542
2584
if (zend_parse_parameters_none () == FAILURE ) {
2543
2585
return ;
2544
2586
}
2545
- GET_REFLECTION_OBJECT_PTR (param );
2546
2587
2547
- if (param -> fptr -> type != ZEND_USER_FUNCTION )
2548
- {
2549
- zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Cannot determine default value for internal functions" );
2550
- return ;
2551
- }
2552
- if (param -> offset < param -> required ) {
2553
- zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Parameter is not optional" );
2554
- return ;
2555
- }
2556
- precv = _get_recv_op ((zend_op_array * )param -> fptr , param -> offset );
2557
- if (!precv || precv -> opcode != ZEND_RECV_INIT || precv -> op2_type == IS_UNUSED ) {
2558
- zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Internal error" );
2588
+ if (!(param && precv )) {
2559
2589
return ;
2560
2590
}
2561
2591
@@ -2568,6 +2598,42 @@ ZEND_METHOD(reflection_parameter, getDefaultValue)
2568
2598
}
2569
2599
/* }}} */
2570
2600
2601
+ /* {{{ proto public bool ReflectionParameter::isDefaultValueConstant()
2602
+ Returns whether the default value of this parameter is constant */
2603
+ ZEND_METHOD (reflection_parameter , isDefaultValueConstant )
2604
+ {
2605
+ zend_op * precv = _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAM_PASSTHRU , NULL );
2606
+
2607
+ if (zend_parse_parameters_none () == FAILURE ) {
2608
+ return ;
2609
+ }
2610
+
2611
+ if (precv && (Z_TYPE_P (precv -> op2 .zv ) & IS_CONSTANT_TYPE_MASK ) == IS_CONSTANT ) {
2612
+ RETURN_TRUE ;
2613
+ }
2614
+
2615
+ RETURN_FALSE ;
2616
+ }
2617
+ /* }}} */
2618
+
2619
+ /* {{{ proto public mixed ReflectionParameter::getDefaultValueConstantName()
2620
+ Returns the default value's constant name if default value is constant or false */
2621
+ ZEND_METHOD (reflection_parameter , getDefaultValueConstantName )
2622
+ {
2623
+ zend_op * precv = _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAM_PASSTHRU , NULL );
2624
+
2625
+ if (zend_parse_parameters_none () == FAILURE ) {
2626
+ return ;
2627
+ }
2628
+
2629
+ if (precv && (Z_TYPE_P (precv -> op2 .zv ) & IS_CONSTANT_TYPE_MASK ) == IS_CONSTANT ) {
2630
+ RETURN_STRING (Z_STRVAL_P (precv -> op2 .zv ), 1 );
2631
+ }
2632
+
2633
+ RETURN_FALSE ;
2634
+ }
2635
+ /* }}} */
2636
+
2571
2637
/* {{{ proto public static mixed ReflectionMethod::export(mixed class, string name [, bool return]) throws ReflectionException
2572
2638
Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */
2573
2639
ZEND_METHOD (reflection_method , export )
@@ -5903,6 +5969,8 @@ static const zend_function_entry reflection_parameter_functions[] = {
5903
5969
ZEND_ME (reflection_parameter , isOptional , arginfo_reflection__void , 0 )
5904
5970
ZEND_ME (reflection_parameter , isDefaultValueAvailable , arginfo_reflection__void , 0 )
5905
5971
ZEND_ME (reflection_parameter , getDefaultValue , arginfo_reflection__void , 0 )
5972
+ ZEND_ME (reflection_parameter , isDefaultValueConstant , arginfo_reflection__void , 0 )
5973
+ ZEND_ME (reflection_parameter , getDefaultValueConstantName , arginfo_reflection__void , 0 )
5906
5974
PHP_FE_END
5907
5975
};
5908
5976
0 commit comments