@@ -1457,6 +1457,57 @@ 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
+ if (zend_parse_parameters_none () == FAILURE ) {
1467
+ return NULL ;
1468
+ }
1469
+
1470
+ GET_REFLECTION_OBJECT_PTR (param );
1471
+
1472
+ if (param -> fptr -> type != ZEND_USER_FUNCTION )
1473
+ {
1474
+ zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Cannot determine default value for internal functions" );
1475
+ return NULL ;
1476
+ }
1477
+
1478
+ if (param -> offset < param -> required ) {
1479
+ zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Parameter is not optional" );
1480
+ return NULL ;
1481
+ }
1482
+
1483
+ return param ;
1484
+ }
1485
+ /* }}} */
1486
+
1487
+ /* {{{ _reflection_param_get_default_precv */
1488
+ static zend_op * _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAMETERS )
1489
+ {
1490
+ zend_op * precv ;
1491
+ parameter_reference * param = _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAM_PASSTHRU );
1492
+
1493
+ if (zend_parse_parameters_none () == FAILURE ) {
1494
+ return NULL ;
1495
+ }
1496
+
1497
+ if (!param ) {
1498
+ return NULL ;
1499
+ }
1500
+
1501
+ precv = _get_recv_op ((zend_op_array * )param -> fptr , param -> offset );
1502
+ if (!precv || precv -> opcode != ZEND_RECV_INIT || precv -> op2_type == IS_UNUSED ) {
1503
+ zend_throw_exception_ex (reflection_exception_ptr , 0 TSRMLS_CC , "Internal error" );
1504
+ return NULL ;
1505
+ }
1506
+
1507
+ return precv ;
1508
+ }
1509
+ /* }}} */
1510
+
1460
1511
/* {{{ Preventing __clone from being called */
1461
1512
ZEND_METHOD (reflection , __clone )
1462
1513
{
@@ -2535,27 +2586,10 @@ ZEND_METHOD(reflection_parameter, isDefaultValueAvailable)
2535
2586
Returns the default value of this parameter or throws an exception */
2536
2587
ZEND_METHOD (reflection_parameter , getDefaultValue )
2537
2588
{
2538
- reflection_object * intern ;
2539
- parameter_reference * param ;
2540
- zend_op * precv ;
2589
+ parameter_reference * param = _reflection_param_get_default_param (INTERNAL_FUNCTION_PARAM_PASSTHRU );
2590
+ zend_op * precv = _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAM_PASSTHRU );
2541
2591
2542
- if (zend_parse_parameters_none () == FAILURE ) {
2543
- return ;
2544
- }
2545
- GET_REFLECTION_OBJECT_PTR (param );
2546
-
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" );
2592
+ if (!(param && precv )) {
2559
2593
return ;
2560
2594
}
2561
2595
@@ -2568,6 +2602,34 @@ ZEND_METHOD(reflection_parameter, getDefaultValue)
2568
2602
}
2569
2603
/* }}} */
2570
2604
2605
+ /* {{{ proto public bool ReflectionParameter::isDefaultValueConstant()
2606
+ Returns whether the default value of this parameter is constant */
2607
+ ZEND_METHOD (reflection_parameter , isDefaultValueConstant )
2608
+ {
2609
+ zend_op * precv = _reflection_param_get_default_precv (INTERNAL_FUNCTION_PARAM_PASSTHRU );
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 );
2624
+
2625
+ if (precv && (Z_TYPE_P (precv -> op2 .zv ) & IS_CONSTANT_TYPE_MASK ) == IS_CONSTANT ) {
2626
+ RETURN_STRING (Z_STRVAL_P (precv -> op2 .zv ), 1 );
2627
+ }
2628
+
2629
+ RETURN_FALSE ;
2630
+ }
2631
+ /* }}} */
2632
+
2571
2633
/* {{{ proto public static mixed ReflectionMethod::export(mixed class, string name [, bool return]) throws ReflectionException
2572
2634
Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */
2573
2635
ZEND_METHOD (reflection_method , export )
@@ -5903,6 +5965,8 @@ static const zend_function_entry reflection_parameter_functions[] = {
5903
5965
ZEND_ME (reflection_parameter , isOptional , arginfo_reflection__void , 0 )
5904
5966
ZEND_ME (reflection_parameter , isDefaultValueAvailable , arginfo_reflection__void , 0 )
5905
5967
ZEND_ME (reflection_parameter , getDefaultValue , arginfo_reflection__void , 0 )
5968
+ ZEND_ME (reflection_parameter , isDefaultValueConstant , arginfo_reflection__void , 0 )
5969
+ ZEND_ME (reflection_parameter , getDefaultValueConstantName , arginfo_reflection__void , 0 )
5906
5970
PHP_FE_END
5907
5971
};
5908
5972
0 commit comments