]> granicus.if.org Git - php/commitdiff
Fix reflection getDefaultValue() with user arg info
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 12 Nov 2020 10:02:04 +0000 (11:02 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 12 Nov 2020 10:02:04 +0000 (11:02 +0100)
The default value is part of the op_array in that case, but we have
no way to access it. Fail gracefully.

ext/reflection/php_reflection.c
ext/reflection/tests/default_value_internal_userland_arginfo.phpt

index 7adcfc506a9966034b12b0264869dc704fd83dd0..2be0ab98db6565b6130de2b2b56961e30f0d1b73 100644 (file)
@@ -1432,6 +1432,10 @@ static void reflection_class_constant_factory(zend_string *name_str, zend_class_
 
 static int get_parameter_default(zval *result, parameter_reference *param) {
        if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
+               if (param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO) {
+                       /* We don't have a way to determine the default value for this case right now. */
+                       return FAILURE;
+               }
                return zend_get_default_from_internal_arg_info(
                        result, (zend_internal_arg_info *) param->arg_info);
        } else {
@@ -2717,7 +2721,8 @@ ZEND_METHOD(ReflectionParameter, isDefaultValueAvailable)
        GET_REFLECTION_OBJECT_PTR(param);
 
        if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
-               RETURN_BOOL(((zend_internal_arg_info*) (param->arg_info))->default_value);
+               RETURN_BOOL(!(param->fptr->common.fn_flags & ZEND_ACC_USER_ARG_INFO)
+                       && ((zend_internal_arg_info*) (param->arg_info))->default_value);
        } else {
                zval *default_value = get_default_from_recv((zend_op_array *)param->fptr, param->offset);
                RETURN_BOOL(default_value != NULL);
index d2b0589cd19974bd93f5da2b3fe195efcff8422c..b55a9463791b0f18f61b630ff0bf9f05132325b4 100644 (file)
@@ -6,6 +6,14 @@ $closure = function ($b = 0) {};
 $ro = new ReflectionObject($closure);
 $rm = $ro->getMethod('__invoke');
 echo $rm, "\n";
+
+$rp = $rm->getParameters()[0];
+var_dump($rp->isDefaultValueAvailable());
+try {
+    var_dump($rp->getDefaultValue());
+} catch (ReflectionException $e) {
+    echo $e->getMessage(), "\n";
+}
 ?>
 --EXPECT--
 Method [ <internal> public method __invoke ] {
@@ -14,3 +22,6 @@ Method [ <internal> public method __invoke ] {
     Parameter #0 [ <optional> $b = <default> ]
   }
 }
+
+bool(false)
+Internal error: Failed to retrieve the default value