iliaa Fri Dec 22 15:37:49 2006 UTC
Added files: (Branch: PHP_5_2)
/php-src/ext/reflection/tests bug39884.phpt
Modified files:
/php-src NEWS
/php-src/ext/reflection php_reflection.c
Log:
Fixed bug #39884 (ReflectionParameter::getClass() throws exception for type
hint self).
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.453&r2=1.2027.2.547.2.454&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.453 php-src/NEWS:1.2027.2.547.2.454
--- php-src/NEWS:1.2027.2.547.2.453 Fri Dec 22 15:29:41 2006
+++ php-src/NEWS Fri Dec 22 15:37:48 2006
@@ -19,6 +19,8 @@
- Fixed bug #39903 (Notice message when executing __halt_compiler() more than
once). (Tony)
- Fixed bug #39898 (FILTER_VALIDATE_URL validates \r\n\t etc). (Ilia)
+- Fixed bug #39884 (ReflectionParameter::getClass() throws exception for type
+ hint self). (thekid at php dot net)
- Fixed bug #39873 (number_format() breaks with locale & decimal points).
(Ilia)
- Fixed bug #39869 (safe_read does not initialize errno).
http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/php_reflection.c?r1=1.164.2.33.2.31&r2=1.164.2.33.2.32&diff_format=u
Index: php-src/ext/reflection/php_reflection.c
diff -u php-src/ext/reflection/php_reflection.c:1.164.2.33.2.31
php-src/ext/reflection/php_reflection.c:1.164.2.33.2.32
--- php-src/ext/reflection/php_reflection.c:1.164.2.33.2.31 Wed Oct 18
16:35:15 2006
+++ php-src/ext/reflection/php_reflection.c Fri Dec 22 15:37:48 2006
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_reflection.c,v 1.164.2.33.2.31 2006/10/18 16:35:15 johannes Exp $
*/
+/* $Id: php_reflection.c,v 1.164.2.33.2.32 2006/12/22 15:37:48 iliaa Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1995,7 +1995,40 @@
GET_REFLECTION_OBJECT_PTR(param);
if (param->arg_info->class_name) {
- if (zend_lookup_class(param->arg_info->class_name,
param->arg_info->class_name_len, &pce TSRMLS_CC) == FAILURE) {
+ /* Class name is stored as a string, we might also get "self"
or "parent"
+ * - For "self", simply use the function scope. If scope is
NULL then
+ * the function is global and thus self does not make any
sense
+ *
+ * - For "parent", use the function scope's parent. If scope is
NULL then
+ * the function is global and thus parent does not make any
sense.
+ * If the parent is NULL then the class does not extend
anything and
+ * thus parent does not make any sense, either.
+ *
+ * TODO: Think about moving these checks to the compiler or
some sort of
+ * lint-mode.
+ */
+ if (0 == strncmp(param->arg_info->class_name, "self",
sizeof("self")- 1)) {
+ zend_class_entry *ce= param->fptr->common.scope;
+ if (!ce) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0
TSRMLS_CC,
+ "Parameter uses 'self' as type hint but
function is not a class member!");
+ return;
+ }
+ pce= &ce;
+ } else if (0 == strncmp(param->arg_info->class_name, "parent",
sizeof("parent")- 1)) {
+ zend_class_entry *ce= param->fptr->common.scope;
+ if (!ce) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0
TSRMLS_CC,
+ "Parameter uses 'parent' as type hint but
function is not a class member!");
+ return;
+ }
+ if (!ce->parent) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0
TSRMLS_CC,
+ "Parameter uses 'parent' as type hint
although class does not have a parent!");
+ return;
+ }
+ pce= &ce->parent;
+ } else if (zend_lookup_class(param->arg_info->class_name,
param->arg_info->class_name_len, &pce TSRMLS_CC) == FAILURE) {
zend_throw_exception_ex(reflection_exception_ptr, 0
TSRMLS_CC,
"Class %s does not exist",
param->arg_info->class_name);
return;
@@ -4851,7 +4884,7 @@
php_info_print_table_start();
php_info_print_table_header(2, "Reflection", "enabled");
- php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v
1.164.2.33.2.31 2006/10/18 16:35:15 johannes Exp $");
+ php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v
1.164.2.33.2.32 2006/12/22 15:37:48 iliaa Exp $");
php_info_print_table_end();
} /* }}} */
http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/bug39884.phpt?view=markup&rev=1.1
Index: php-src/ext/reflection/tests/bug39884.phpt
+++ php-src/ext/reflection/tests/bug39884.phpt
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php