Skip to content

Commit 1cdbe90

Browse files
committed
Code cleanup
1 parent 18ddd11 commit 1cdbe90

File tree

2 files changed

+69
-128
lines changed

2 files changed

+69
-128
lines changed

ext/reflection/php_reflection.c

Lines changed: 66 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -558,8 +558,7 @@ static void _class_const_string(smart_str *str, char *name, zend_class_constant
558558
}
559559
/* }}} */
560560

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)
563562
{
564563
zend_op *op = op_array->opcodes;
565564
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)
576575
ZEND_ASSERT(0 && "Failed to find op");
577576
return NULL;
578577
}
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+
}
580587

581588
static int format_default_value(smart_str *str, zval *value, zend_class_entry *scope) {
582589
zval zv;
@@ -649,10 +656,10 @@ static void _parameter_string(smart_str *str, zend_function *fptr, struct _zend_
649656
smart_str_appends(str, "<default>");
650657
}
651658
} 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) {
654661
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) {
656663
return;
657664
}
658665
}
@@ -1285,42 +1292,6 @@ static void reflection_class_constant_factory(zend_string *name_str, zend_class_
12851292
}
12861293
/* }}} */
12871294

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-
13241295
static int get_default_via_ast(zval *default_value_zval, const char *default_value) {
13251296
zend_ast *ast;
13261297
zend_arena *ast_arena;
@@ -1335,7 +1306,6 @@ static int get_default_via_ast(zval *default_value_zval, const char *default_val
13351306
smart_str_free(&code);
13361307

13371308
if (!ast) {
1338-
zend_throw_exception_ex(reflection_exception_ptr, 0, "Internal error: Failed to retrieve the default value");
13391309
return FAILURE;
13401310
}
13411311

@@ -1370,12 +1340,10 @@ static zend_string *try_parse_string(const char *str, size_t len, char quote) {
13701340
return zend_string_init(str, len, 0);
13711341
}
13721342

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)
13751344
{
13761345
const char *default_value = arg_info->default_value;
13771346
if (!default_value) {
1378-
zend_throw_exception_ex(reflection_exception_ptr, 0, "Internal error: Failed to retrieve the default value");
13791347
return FAILURE;
13801348
}
13811349

@@ -1418,6 +1386,20 @@ static int _reflection_param_get_default_arg_info(zend_internal_arg_info *arg_in
14181386
return get_default_via_ast(default_value_zval, default_value);
14191387
}
14201388

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+
14211403
/* {{{ Preventing __clone from being called */
14221404
ZEND_METHOD(reflection, __clone)
14231405
{
@@ -2711,7 +2693,6 @@ ZEND_METHOD(reflection_parameter, isDefaultValueAvailable)
27112693
{
27122694
reflection_object *intern;
27132695
parameter_reference *param;
2714-
zend_op *precv;
27152696

27162697
if (zend_parse_parameters_none() == FAILURE) {
27172698
RETURN_THROWS();
@@ -2720,13 +2701,10 @@ ZEND_METHOD(reflection_parameter, isDefaultValueAvailable)
27202701
GET_REFLECTION_OBJECT_PTR(param);
27212702

27222703
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);
27242705
} 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);
27302708
}
27312709
}
27322710
/* }}} */
@@ -2735,31 +2713,19 @@ ZEND_METHOD(reflection_parameter, isDefaultValueAvailable)
27352713
Returns the default value of this parameter or throws an exception */
27362714
ZEND_METHOD(reflection_parameter, getDefaultValue)
27372715
{
2716+
reflection_object *intern;
27382717
parameter_reference *param;
27392718

27402719
if (zend_parse_parameters_none() == FAILURE) {
27412720
RETURN_THROWS();
27422721
}
27432722

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);
27612724

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();
27632729
}
27642730

27652731
if (Z_TYPE_P(return_value) == IS_CONSTANT_AST) {
@@ -2772,42 +2738,27 @@ ZEND_METHOD(reflection_parameter, getDefaultValue)
27722738
Returns whether the default value of this parameter is constant */
27732739
ZEND_METHOD(reflection_parameter, isDefaultValueConstant)
27742740
{
2741+
reflection_object *intern;
27752742
parameter_reference *param;
27762743

27772744
if (zend_parse_parameters_none() == FAILURE) {
27782745
RETURN_THROWS();
27792746
}
27802747

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");
27832754
RETURN_THROWS();
27842755
}
27852756

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);
28012761
} 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-
28112762
RETURN_FALSE;
28122763
}
28132764
}
@@ -2817,46 +2768,36 @@ ZEND_METHOD(reflection_parameter, isDefaultValueConstant)
28172768
Returns the default value's constant name if default value is constant or null */
28182769
ZEND_METHOD(reflection_parameter, getDefaultValueConstantName)
28192770
{
2771+
reflection_object *intern;
28202772
parameter_reference *param;
2821-
zend_ast *ast = NULL;
28222773

28232774
if (zend_parse_parameters_none() == FAILURE) {
28242775
RETURN_THROWS();
28252776
}
28262777

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");
28292784
RETURN_THROWS();
28302785
}
28312786

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();
28472790
}
28482791

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();
28572799
}
2858-
2859-
RETURN_NULL();
2800+
zval_ptr_dtor_nogc(&default_value);
28602801
}
28612802

28622803
/* {{{ proto public bool ReflectionParameter::isVariadic()

ext/reflection/tests/internal_parameter_default_value/ReflectionParameter_isDefaultValueConstant_Internal.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ foreach ($method->getParameters() as $parameter) {
2929
--EXPECT--
3030
Internal error: Failed to retrieve the default value
3131
Internal error: Failed to retrieve the default value
32-
NULL
33-
NULL
32+
bool(false)
33+
bool(false)
3434
----------
3535
bool(true)
36-
NULL
36+
bool(false)

0 commit comments

Comments
 (0)