Skip to content

Commit 4ddca1d

Browse files
committed
Changed ZEND_FETCH_DEFAULT_ARG OP to call internal reflection method.
Exposed get_parameter_default from reflection API.
1 parent 66b77d6 commit 4ddca1d

File tree

5 files changed

+33
-55
lines changed

5 files changed

+33
-55
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Tests passing default to an internal function parameter
3+
--FILE--
4+
<?php
5+
6+
json_encode([], depth: $D = default);
7+
var_dump($D);
8+
?>
9+
--EXPECT--
10+
int(512)

Zend/zend_vm_def.h

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9815,31 +9815,14 @@ ZEND_VM_HANDLER(210, ZEND_FETCH_DEFAULT_ARG, UNUSED|NUM, UNUSED)
98159815

98169816
zend_function *called_func = EX(call)->func;
98179817

9818-
/*
9819-
* [0]: The function (string) or class method (array) to reflect parameters from.
9820-
* [1]: A zero-based integer specifying the parameter position.
9821-
*/
9822-
zval constructor_params[2];
9823-
ZVAL_LONG(&constructor_params[1], opline->op1.num - 1);
9824-
if (called_func->common.scope == NULL) {
9825-
ZVAL_STR_COPY(&constructor_params[0], called_func->common.function_name);
9826-
} else {
9827-
zval arr;
9828-
array_init_size(&arr, 2);
9829-
add_next_index_string(&arr, called_func->common.scope->name->val);
9830-
add_next_index_string(&arr, called_func->common.function_name->val);
9831-
ZVAL_ARR(&constructor_params[0], Z_ARR(arr));
9832-
}
9833-
9834-
zval reflection_obj;
9835-
// TODO: Check result.
9836-
/*zend_result res =*/ object_init_with_constructor(&reflection_obj, reflection_parameter_ptr, 2, constructor_params, NULL);
9837-
zval_ptr_dtor(&constructor_params[0]);
9838-
zval_ptr_dtor(&constructor_params[1]);
9818+
parameter_reference pr;
9819+
pr.offset = opline->op1.num - 1;
9820+
pr.required = pr.offset < called_func->common.required_num_args;
9821+
pr.arg_info = &called_func->common.arg_info[pr.offset];
9822+
pr.fptr = called_func;
98399823

98409824
zval default_value;
9841-
zend_call_method_with_0_params(Z_OBJ(reflection_obj), reflection_parameter_ptr, NULL, "getDefaultValue", &default_value);
9842-
zval_ptr_dtor(&reflection_obj);
9825+
get_parameter_default(&default_value, &pr);
98439826

98449827
ZVAL_COPY(EX_VAR(opline->result.var), &default_value);
98459828
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

Zend/zend_vm_execute.h

Lines changed: 6 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/reflection/php_reflection.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,6 @@ typedef struct _property_reference {
130130
zend_string *unmangled_name;
131131
} property_reference;
132132

133-
/* Struct for parameters */
134-
typedef struct _parameter_reference {
135-
uint32_t offset;
136-
bool required;
137-
struct _zend_arg_info *arg_info;
138-
zend_function *fptr;
139-
} parameter_reference;
140-
141133
/* Struct for type hints */
142134
typedef struct _type_reference {
143135
zend_type type;
@@ -1536,7 +1528,7 @@ static void reflection_enum_case_factory(zend_class_entry *ce, zend_string *name
15361528
ZVAL_STR_COPY(reflection_prop_class(object), constant->ce->name);
15371529
}
15381530

1539-
static int get_parameter_default(zval *result, parameter_reference *param) {
1531+
PHPAPI int get_parameter_default(zval *result, parameter_reference *param) {
15401532
if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
15411533
if (param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO) {
15421534
/* We don't have a way to determine the default value for this case right now. */

ext/reflection/php_reflection.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,16 @@ extern PHPAPI zend_class_entry *reflection_fiber_ptr;
5050

5151
PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object);
5252

53+
/* Struct for parameters */
54+
typedef struct _parameter_reference {
55+
uint32_t offset;
56+
bool required;
57+
struct _zend_arg_info *arg_info;
58+
zend_function *fptr;
59+
} parameter_reference;
60+
61+
PHPAPI int get_parameter_default(zval *result, parameter_reference *param);
62+
5363
END_EXTERN_C()
5464

5565
#endif /* PHP_REFLECTION_H */

0 commit comments

Comments
 (0)