tony2001 Mon Oct 2 11:05:02 2006 UTC
Added files:
/ZendEngine2/tests bug39003.phpt
Modified files:
/ZendEngine2 zend_execute.c
/php-src/tests/classes type_hinting_002.phpt
Log:
fix #39003 (__autoload() is called for type hinting)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute.c?r1=1.751&r2=1.752&diff_format=u
Index: ZendEngine2/zend_execute.c
diff -u ZendEngine2/zend_execute.c:1.751 ZendEngine2/zend_execute.c:1.752
--- ZendEngine2/zend_execute.c:1.751 Wed Aug 30 09:58:10 2006
+++ ZendEngine2/zend_execute.c Mon Oct 2 11:05:02 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_execute.c,v 1.751 2006/08/30 09:58:10 tony2001 Exp $ */
+/* $Id: zend_execute.c,v 1.752 2006/10/02 11:05:02 tony2001 Exp $ */
#define ZEND_INTENSIVE_DEBUGGING 0
@@ -472,11 +472,12 @@
}
}
-static inline char * zend_verify_arg_class_kind(zend_arg_info *cur_arg_info,
zend_class_entry **pce TSRMLS_DC)
+static inline char * zend_verify_arg_class_kind(zend_arg_info *cur_arg_info,
zstr *class_name, zend_class_entry **pce TSRMLS_DC)
{
- *pce = zend_u_fetch_class(UG(unicode) ? IS_UNICODE : IS_STRING,
cur_arg_info->class_name, cur_arg_info->class_name_len, ZEND_FETCH_CLASS_AUTO
TSRMLS_CC);
+ *pce = zend_u_fetch_class(UG(unicode) ? IS_UNICODE : IS_STRING,
cur_arg_info->class_name, cur_arg_info->class_name_len, (ZEND_FETCH_CLASS_AUTO
| ZEND_FETCH_CLASS_NO_AUTOLOAD) TSRMLS_CC);
- if ((*pce)->ce_flags & ZEND_ACC_INTERFACE) {
+ *class_name = (*pce) ? (*pce)->name: cur_arg_info->class_name;
+ if (*pce && (*pce)->ce_flags & ZEND_ACC_INTERFACE) {
return "implement interface ";
} else {
return "be an instance of ";
@@ -518,21 +519,22 @@
}
cur_arg_info = &zf->common.arg_info[arg_num-1];
+ if (cur_arg_info->class_name.v) {
+ zstr class_name;
- if (cur_arg_info->class_name.v) {
- if (!arg) {
- need_msg = zend_verify_arg_class_kind(cur_arg_info, &ce
TSRMLS_CC);
- return zend_verify_arg_error(zf, arg_num, cur_arg_info,
need_msg, ce->name, "none", EMPTY_ZSTR TSRMLS_CC);
- }
- if (Z_TYPE_P(arg) == IS_OBJECT) {
- need_msg = zend_verify_arg_class_kind(cur_arg_info, &ce
TSRMLS_CC);
- if (!instanceof_function(Z_OBJCE_P(arg), ce TSRMLS_CC))
{
- return zend_verify_arg_error(zf, arg_num,
cur_arg_info, need_msg, ce->name, "instance of ", Z_OBJCE_P(arg)->name
TSRMLS_CC);
- }
- } else if (Z_TYPE_P(arg) != IS_NULL ||
!cur_arg_info->allow_null) {
- need_msg = zend_verify_arg_class_kind(cur_arg_info, &ce
TSRMLS_CC);
- return zend_verify_arg_error(zf, arg_num, cur_arg_info,
need_msg, ce->name, zend_zval_type_name(arg), EMPTY_ZSTR TSRMLS_CC);
- }
+ if (!arg) {
+ need_msg = zend_verify_arg_class_kind(cur_arg_info, &class_name,
&ce TSRMLS_CC);
+ return zend_verify_arg_error(zf, arg_num, cur_arg_info, need_msg,
class_name, "none", EMPTY_ZSTR TSRMLS_CC);
+ }
+ if (Z_TYPE_P(arg) == IS_OBJECT) {
+ need_msg = zend_verify_arg_class_kind(cur_arg_info, &class_name,
&ce TSRMLS_CC);
+ if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce TSRMLS_CC)) {
+ return zend_verify_arg_error(zf, arg_num, cur_arg_info,
need_msg, class_name, "instance of ", Z_OBJCE_P(arg)->name TSRMLS_CC);
+ }
+ } else if (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null) {
+ need_msg = zend_verify_arg_class_kind(cur_arg_info, &class_name,
&ce TSRMLS_CC);
+ return zend_verify_arg_error(zf, arg_num, cur_arg_info, need_msg,
class_name, zend_zval_type_name(arg), EMPTY_ZSTR TSRMLS_CC);
+ }
} else if (cur_arg_info->array_type_hint) {
if (!arg) {
return zend_verify_arg_error(zf, arg_num, cur_arg_info,
"be an array", EMPTY_ZSTR, "none", EMPTY_ZSTR TSRMLS_CC);
http://cvs.php.net/viewvc.cgi/php-src/tests/classes/type_hinting_002.phpt?r1=1.1&r2=1.2&diff_format=u
Index: php-src/tests/classes/type_hinting_002.phpt
diff -u php-src/tests/classes/type_hinting_002.phpt:1.1
php-src/tests/classes/type_hinting_002.phpt:1.2
--- php-src/tests/classes/type_hinting_002.phpt:1.1 Sat Mar 27 15:49:23 2004
+++ php-src/tests/classes/type_hinting_002.phpt Mon Oct 2 11:05:02 2006
@@ -13,5 +13,4 @@
$o->a($o);
?>
--EXPECTF--
-
-Fatal error: Class 'NonExisting' not found in %stype_hinting_002.php on line %d
+Catchable fatal error: Argument 1 passed to Foo::a() must be an instance of
NonExisting, instance of Foo given, called in %s on line %d and defined in %s
on line %d
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug39003.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug39003.phpt
+++ ZendEngine2/tests/bug39003.phpt
--TEST--
Bug #39003 (__autoload() is called for type hinting)
--FILE--
<?php
class ClassName
{
public $var = 'bla';
}
function test (OtherClassName $object) { }
function __autoload($class)
{
var_dump("__autload($class)");
}
$obj = new ClassName;
test($obj);
echo "Done\n";
?>
--EXPECTF--
Catchable fatal error: Argument 1 passed to test() must be an instance of
OtherClassName, instance of ClassName given, called in %s on line %d and
defined in %s on line %d
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php