]> granicus.if.org Git - php/commitdiff
- Fixed bug #51905 (ReflectionParameter fails if default value is an array with an...
authorFelipe Pena <felipe@php.net>
Wed, 26 May 2010 00:00:58 +0000 (00:00 +0000)
committerFelipe Pena <felipe@php.net>
Wed, 26 May 2010 00:00:58 +0000 (00:00 +0000)
NEWS
Zend/zend_execute.h
Zend/zend_execute_API.c
ext/reflection/tests/bug51905.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index cc6717566bee66983ac904e6f675a6ef98f1dcfa..ef6105ce52f9fd026861da03d29ade9506ade500 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,8 @@ PHP                                                                        NEWS
   by Mateusz Kocielski. (Ilia)  
 
 - Fixed bug #51911 (ReflectionParameter::getDefaultValue() memory leaks with
+- Fixed bug #51905 (ReflectionParameter fails if default value is an array
+  with an access to self::). (Felipe)
   constant array). (Felipe)
 - Fixed bug #51671 (imagefill does not work correctly for small images).
   (Pierre)
index 60a84671dfb53235369d118ab9a52ab181ad51b1..a409b6fc5ec2ab8e3bd3e327627724e2d2b7141c 100644 (file)
@@ -140,6 +140,8 @@ static inline int i_zend_is_true(zval *op)
 }
 
 ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC);
+ZEND_API int zval_update_constant_inline_change(zval **pp, void *arg TSRMLS_DC);
+ZEND_API int zval_update_constant_no_inline_change(zval **pp, void *arg TSRMLS_DC);
 ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *scope TSRMLS_DC);
 
 /* dedicated Zend executor functions - do not use! */
index 4ac5badea56748c71a2816943e7a572044eb7e46..c8f4bf9ac125cd5b3f477dcfacd82622b8b95f13 100644 (file)
@@ -584,12 +584,22 @@ ZEND_API int zval_update_constant_ex(zval **pp, void *arg, zend_class_entry *sco
                        zend_hash_move_forward(Z_ARRVAL_P(p));
                        zval_dtor(&const_value);
                }
-               zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant, (void *) 1 TSRMLS_CC);
+               zend_hash_apply_with_argument(Z_ARRVAL_P(p), (apply_func_arg_t) zval_update_constant_inline_change, (void *) scope TSRMLS_CC);
                zend_hash_internal_pointer_reset(Z_ARRVAL_P(p));
        }
        return 0;
 }
 
+ZEND_API int zval_update_constant_inline_change(zval **pp, void *scope TSRMLS_DC)
+{
+       return zval_update_constant_ex(pp, (void*)1, scope TSRMLS_CC);
+}
+
+ZEND_API int zval_update_constant_no_inline_change(zval **pp, void *scope TSRMLS_DC)
+{
+       return zval_update_constant_ex(pp, (void*)0, scope TSRMLS_CC);
+}
+
 ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC)
 {
        return zval_update_constant_ex(pp, arg, NULL TSRMLS_CC);
diff --git a/ext/reflection/tests/bug51905.phpt b/ext/reflection/tests/bug51905.phpt
new file mode 100644 (file)
index 0000000..8969924
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #51905 (ReflectionParameter fails if default value is an array with an access to self::)
+--FILE--
+<?php
+
+class Bar {
+       const Y = 20;
+}
+
+class Foo extends Bar {
+       const X = 12;
+       public function x($x = 1, $y = array(self::X), $z = parent::Y) {}
+}
+
+$clazz = new ReflectionClass('Foo');
+$method = $clazz->getMethod('x');
+foreach ($method->getParameters() as $param) {
+    if ( $param->isDefaultValueAvailable())
+        echo '$', $param->getName(), ' : ', var_export($param->getDefaultValue(), 1), "\n";
+}
+
+?>
+--EXPECT--
+$x : 1
+$y : array (
+  0 => 12,
+)
+$z : 20