/* Struct for parameters */
typedef struct _parameter_reference {
uint32_t offset;
- uint32_t required;
+ zend_bool required;
struct _zend_arg_info *arg_info;
zend_function *fptr;
} parameter_reference;
/* }}} */
/* {{{ _parameter_string */
-static void _parameter_string(string *str, zend_function *fptr, struct _zend_arg_info *arg_info, uint32_t offset, uint32_t required, char* indent)
+static void _parameter_string(string *str, zend_function *fptr, struct _zend_arg_info *arg_info, uint32_t offset, zend_bool required, char* indent)
{
string_printf(str, "Parameter #%d [ ", offset);
- if (offset >= required) {
+ if (!required) {
string_printf(str, "<optional> ");
} else {
string_printf(str, "<required> ");
} else {
string_printf(str, "$param%d", offset);
}
- if (fptr->type == ZEND_USER_FUNCTION && offset >= required) {
+ if (fptr->type == ZEND_USER_FUNCTION && !required) {
zend_op *precv = _get_recv_op((zend_op_array*)fptr, offset);
if (precv && precv->opcode == ZEND_RECV_INIT && precv->op2_type != IS_UNUSED) {
zval zv;
static void _function_parameter_string(string *str, zend_function *fptr, char* indent)
{
struct _zend_arg_info *arg_info = fptr->common.arg_info;
- uint32_t i, num_args, required = fptr->common.required_num_args;
+ uint32_t i, num_args, num_required = fptr->common.required_num_args;
if (!arg_info) {
return;
string_printf(str, "%s- Parameters [%d] {\n", indent, num_args);
for (i = 0; i < num_args; i++) {
string_printf(str, "%s ", indent);
- _parameter_string(str, fptr, arg_info, i, required, indent);
+ _parameter_string(str, fptr, arg_info, i, i < num_required, indent);
string_write(str, "\n", sizeof("\n")-1);
arg_info++;
}
/* }}} */
/* {{{ reflection_parameter_factory */
-static void reflection_parameter_factory(zend_function *fptr, zval *closure_object, struct _zend_arg_info *arg_info, uint32_t offset, uint32_t required, zval *object)
+static void reflection_parameter_factory(zend_function *fptr, zval *closure_object, struct _zend_arg_info *arg_info, uint32_t offset, zend_bool required, zval *object)
{
reflection_object *intern;
parameter_reference *reference;
/* }}} */
/* {{{ proto public bool ReflectionFunction::getNumberOfParameters()
- Gets the number of required parameters */
+ Gets the number of parameters */
ZEND_METHOD(reflection_function, getNumberOfParameters)
{
reflection_object *intern;
for (i = 0; i < num_args; i++) {
zval parameter;
- reflection_parameter_factory(_copy_function(fptr), Z_ISUNDEF(intern->obj)? NULL : &intern->obj, arg_info, i, fptr->common.required_num_args, ¶meter);
+ reflection_parameter_factory(
+ _copy_function(fptr),
+ Z_ISUNDEF(intern->obj) ? NULL : &intern->obj,
+ arg_info,
+ i,
+ i < fptr->common.required_num_args,
+ ¶meter
+ );
add_next_index_zval(return_value, ¶meter);
arg_info++;
ref = (parameter_reference*) emalloc(sizeof(parameter_reference));
ref->arg_info = &arg_info[position];
ref->offset = (uint32_t)position;
- ref->required = fptr->common.required_num_args;
+ ref->required = position < fptr->common.required_num_args;
ref->fptr = fptr;
/* TODO: copy fptr */
intern->ptr = ref;
}
GET_REFLECTION_OBJECT_PTR(param);
- RETVAL_BOOL(param->offset >= param->required);
+ RETVAL_BOOL(!param->required);
}
/* }}} */