]> granicus.if.org Git - php/commitdiff
Fix fetching default value of internal function with userland arginfo
authorNikita Popov <nikita.ppv@gmail.com>
Mon, 31 Aug 2020 12:02:35 +0000 (14:02 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Mon, 31 Aug 2020 12:03:54 +0000 (14:03 +0200)
"Fix" in the sense of "not crash". We aren't able to actually
display the default value for this case, as there's no way to
fetch the relevant information right now.

ext/reflection/php_reflection.c
ext/reflection/tests/default_value_internal_userland_arginfo.phpt [new file with mode: 0644]

index a24d72c747d8b4469473d708bde947bbe68ee325..016851e9e54a8c56c412705a0b5138225b789af2 100644 (file)
@@ -667,7 +667,10 @@ static void _parameter_string(smart_str *str, zend_function *fptr, struct _zend_
        if (!required) {
                if (fptr->type == ZEND_INTERNAL_FUNCTION) {
                        smart_str_appends(str, " = ");
-                       if (((zend_internal_arg_info*)arg_info)->default_value) {
+                       /* TODO: We don't have a way to fetch the default value for an internal function
+                        * with userland arg info. */
+                       if (has_internal_arg_info(fptr)
+                                       && ((zend_internal_arg_info*)arg_info)->default_value) {
                                smart_str_appends(str, ((zend_internal_arg_info*)arg_info)->default_value);
                        } else {
                                smart_str_appends(str, "<default>");
diff --git a/ext/reflection/tests/default_value_internal_userland_arginfo.phpt b/ext/reflection/tests/default_value_internal_userland_arginfo.phpt
new file mode 100644 (file)
index 0000000..d2b0589
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Fetching default value of an internal trampoline function with userland arginfo
+--FILE--
+<?php
+$closure = function ($b = 0) {};
+$ro = new ReflectionObject($closure);
+$rm = $ro->getMethod('__invoke');
+echo $rm, "\n";
+?>
+--EXPECT--
+Method [ <internal> public method __invoke ] {
+
+  - Parameters [1] {
+    Parameter #0 [ <optional> $b = <default> ]
+  }
+}