]> granicus.if.org Git - php/commitdiff
- Fixed bug #53915: ReflectionClass::getConstant(s) emits fatal error on
authorGustavo André dos Santos Lopes <cataphract@php.net>
Thu, 3 Feb 2011 12:38:25 +0000 (12:38 +0000)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Thu, 3 Feb 2011 12:38:25 +0000 (12:38 +0000)
  constants with self::.
- Reflown some NEWS entries to have lines no longer than 80 chars.

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

index 760fc96b1820d0d39fa432457cba54d1fe95a564..77bac956ea26ed7a97234518350c3d1c3e62141a 100644 (file)
@@ -3973,6 +3973,11 @@ ZEND_METHOD(reflection_class, hasConstant)
 }
 /* }}} */
 
+static int _update_constant_ex_cb_wrapper(void *pDest, void *ce TSRMLS_DC)
+{
+       return zval_update_constant_ex(pDest, (void*)(zend_uintptr_t)1U, ce);
+}
+
 /* {{{ proto public array ReflectionClass::getConstants()
    Returns an associative array containing this class' constants and their values */
 ZEND_METHOD(reflection_class, getConstants)
@@ -3986,7 +3991,7 @@ ZEND_METHOD(reflection_class, getConstants)
        }
        GET_REFLECTION_OBJECT_PTR(ce);
        array_init(return_value);
-       zend_hash_apply_with_argument(&ce->constants_table, (apply_func_arg_t) zval_update_constant, (void*)1 TSRMLS_CC);
+       zend_hash_apply_with_argument(&ce->constants_table, _update_constant_ex_cb_wrapper, ce TSRMLS_CC);
        zend_hash_copy(Z_ARRVAL_P(return_value), &ce->constants_table, (copy_ctor_func_t) zval_add_ref, (void *) &tmp_copy, sizeof(zval *));
 }
 /* }}} */
@@ -4007,7 +4012,7 @@ ZEND_METHOD(reflection_class, getConstant)
        }
 
        GET_REFLECTION_OBJECT_PTR(ce);
-       zend_hash_apply_with_argument(&ce->constants_table, (apply_func_arg_t) zval_update_constant, (void*)1 TSRMLS_CC);
+       zend_hash_apply_with_argument(&ce->constants_table, _update_constant_ex_cb_wrapper, ce TSRMLS_CC);
        if (zend_hash_find(&ce->constants_table, name, name_len + 1, (void **) &value) == FAILURE) {
                RETURN_FALSE;
        }
diff --git a/ext/reflection/tests/bug53915.phpt b/ext/reflection/tests/bug53915.phpt
new file mode 100644 (file)
index 0000000..f2f2ae5
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Bug #53915 - ReflectionClass::getConstant(s) emits fatal error on selfreferencing constants
+--FILE--
+<?php
+Class Foo
+{
+       const A = 1;
+       const B = self::A;
+}
+
+$rc = new ReflectionClass('Foo');
+print_r($rc->getConstants());
+
+Class Foo2
+{
+        const A = 1;
+        const B = self::A;
+}
+
+$rc = new ReflectionClass('Foo2');
+print_r($rc->getConstant('B'));
+--EXPECT--
+Array
+(
+    [A] => 1
+    [B] => 1
+)
+1