summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_reflection_api.c5
-rw-r--r--ext/reflection/php_reflection.c5
-rwxr-xr-xext/reflection/tests/bug29523.phpt38
3 files changed, 44 insertions, 4 deletions
diff --git a/Zend/zend_reflection_api.c b/Zend/zend_reflection_api.c
index fe8706ebcb..a7f9d2c144 100644
--- a/Zend/zend_reflection_api.c
+++ b/Zend/zend_reflection_api.c
@@ -833,7 +833,7 @@ static void reflection_extension_factory(zval *object, char *name_str TSRMLS_DC)
/* }}} */
/* {{{ reflection_parameter_factory */
-static void reflection_parameter_factory(struct _zend_arg_info *arg_info, int offset, zval *object TSRMLS_DC)
+static void reflection_parameter_factory(struct _zend_arg_info *arg_info, int offset, int required, zval *object TSRMLS_DC)
{
reflection_object *intern;
parameter_reference *reference;
@@ -850,6 +850,7 @@ static void reflection_parameter_factory(struct _zend_arg_info *arg_info, int of
reference = (parameter_reference*) emalloc(sizeof(parameter_reference));
reference->arg_info = arg_info;
reference->offset = offset;
+ reference->required = required;
intern->ptr = reference;
intern->free_ptr = 1;
zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL);
@@ -1413,7 +1414,7 @@ ZEND_METHOD(reflection_function, getParameters)
zval *parameter;
ALLOC_ZVAL(parameter);
- reflection_parameter_factory(arg_info, i, parameter TSRMLS_CC);
+ reflection_parameter_factory(arg_info, i, fptr->common.required_num_args, parameter TSRMLS_CC);
add_next_index_zval(return_value, parameter);
arg_info++;
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index fe8706ebcb..a7f9d2c144 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -833,7 +833,7 @@ static void reflection_extension_factory(zval *object, char *name_str TSRMLS_DC)
/* }}} */
/* {{{ reflection_parameter_factory */
-static void reflection_parameter_factory(struct _zend_arg_info *arg_info, int offset, zval *object TSRMLS_DC)
+static void reflection_parameter_factory(struct _zend_arg_info *arg_info, int offset, int required, zval *object TSRMLS_DC)
{
reflection_object *intern;
parameter_reference *reference;
@@ -850,6 +850,7 @@ static void reflection_parameter_factory(struct _zend_arg_info *arg_info, int of
reference = (parameter_reference*) emalloc(sizeof(parameter_reference));
reference->arg_info = arg_info;
reference->offset = offset;
+ reference->required = required;
intern->ptr = reference;
intern->free_ptr = 1;
zend_hash_update(Z_OBJPROP_P(object), "name", sizeof("name"), (void **) &name, sizeof(zval *), NULL);
@@ -1413,7 +1414,7 @@ ZEND_METHOD(reflection_function, getParameters)
zval *parameter;
ALLOC_ZVAL(parameter);
- reflection_parameter_factory(arg_info, i, parameter TSRMLS_CC);
+ reflection_parameter_factory(arg_info, i, fptr->common.required_num_args, parameter TSRMLS_CC);
add_next_index_zval(return_value, parameter);
arg_info++;
diff --git a/ext/reflection/tests/bug29523.phpt b/ext/reflection/tests/bug29523.phpt
new file mode 100755
index 0000000000..01c83c2a15
--- /dev/null
+++ b/ext/reflection/tests/bug29523.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Bug #29523 (ReflectionParameter::isOptional() is incorrect)
+--FILE--
+<?php
+
+class TestClass
+{
+}
+
+function optionalTest(TestClass $a, TestClass $b, $c = 3)
+{
+}
+
+$function = new ReflectionFunction('optionalTest');
+$numberOfNotOptionalParameters = 0;
+$numberOfOptionalParameters = 0;
+foreach($function->getParameters() as $parameter)
+{
+ var_dump($parameter->isOptional());
+ if ($parameter->isOptional())
+ {
+ ++$numberOfOptionalParameters;
+ }
+ else
+ {
+ ++$numberOfNotOptionalParameters;
+ }
+}
+var_dump($function->getNumberOfRequiredParameters());
+var_dump($numberOfNotOptionalParameters);
+
+?>
+--EXPECT--
+bool(false)
+bool(false)
+bool(true)
+int(2)
+int(2)