gron Sun, 04 Mar 2012 19:34:19 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=323898
Log: Fixed Bug #61052 (Missing error check in trait 'insteadof' clause) Bug: https://bugs.php.net/61052 (Assigned) missing error check in trait 'insteadof' clause Changed paths: U php/php-src/branches/PHP_5_4/NEWS A php/php-src/branches/PHP_5_4/Zend/tests/traits/bug61052.phpt U php/php-src/branches/PHP_5_4/Zend/zend_compile.c A php/php-src/trunk/Zend/tests/traits/bug61052.phpt U php/php-src/trunk/Zend/zend_compile.c Modified: php/php-src/branches/PHP_5_4/NEWS =================================================================== --- php/php-src/branches/PHP_5_4/NEWS 2012-03-04 19:30:01 UTC (rev 323897) +++ php/php-src/branches/PHP_5_4/NEWS 2012-03-04 19:34:19 UTC (rev 323898) @@ -23,6 +23,7 @@ vars). (Laruence) . Fixed bug #61011 (Crash when an exception is thrown by __autoload accessing a static property). (Laruence) + . Fixed bug #61052 (Missing error check in trait 'insteadof' clause). (Stefan) . Fixed bug #61072 (Memory leak when restoring an exception handler). (Nikic, Laruence) . Fixed bug #61087 (Memory leak in parse_ini_file when specifying Added: php/php-src/branches/PHP_5_4/Zend/tests/traits/bug61052.phpt =================================================================== --- php/php-src/branches/PHP_5_4/Zend/tests/traits/bug61052.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/Zend/tests/traits/bug61052.phpt 2012-03-04 19:34:19 UTC (rev 323898) @@ -0,0 +1,18 @@ +--TEST-- +Bug #61052 (missing error check in trait 'insteadof' clause) +--FILE-- +<?php +trait T1 { + function foo(){ echo "T1\n"; } +} +trait T2 { + function foo(){ echo "T2\n"; } +} +class C { + use T1, T2 { + T1::foo insteadof T1; + } +} +C::foo(); +--EXPECTF-- +Fatal error: Inconsistent insteadof definition. The method foo is to be used from T1, but T1 is also on the exclude list in %s on line %d Modified: php/php-src/branches/PHP_5_4/Zend/zend_compile.c =================================================================== --- php/php-src/branches/PHP_5_4/Zend/zend_compile.c 2012-03-04 19:30:01 UTC (rev 323897) +++ php/php-src/branches/PHP_5_4/Zend/zend_compile.c 2012-03-04 19:34:19 UTC (rev 323898) @@ -3984,13 +3984,28 @@ /** With the other traits, we are more permissive. We do not give errors for those. This allows to be more - defensive in such definitions. */ + defensive in such definitions. + However, we want to make sure that the insteadof declartion + is consistent in itself. + */ j = 0; while (cur_precedence->exclude_from_classes[j]) { char* class_name = (char*)cur_precedence->exclude_from_classes[j]; zend_uint name_length = strlen(class_name); cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC); + + /* make sure that the trait method is not from a class mentioned in + exclude_from_classes, for consistency */ + if (cur_precedence->trait_method->ce == cur_precedence->exclude_from_classes[i]) { + zend_error(E_COMPILE_ERROR, + "Inconsistent insteadof definition. " + "The method %s is to be used from %s, but %s is also on the exclude list", + cur_method_ref->method_name, + cur_precedence->trait_method->ce->name, + cur_precedence->trait_method->ce->name); + } + efree(class_name); j++; } Added: php/php-src/trunk/Zend/tests/traits/bug61052.phpt =================================================================== --- php/php-src/trunk/Zend/tests/traits/bug61052.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/traits/bug61052.phpt 2012-03-04 19:34:19 UTC (rev 323898) @@ -0,0 +1,18 @@ +--TEST-- +Bug #61052 (missing error check in trait 'insteadof' clause) +--FILE-- +<?php +trait T1 { + function foo(){ echo "T1\n"; } +} +trait T2 { + function foo(){ echo "T2\n"; } +} +class C { + use T1, T2 { + T1::foo insteadof T1; + } +} +C::foo(); +--EXPECTF-- +Fatal error: Inconsistent insteadof definition. The method foo is to be used from T1, but T1 is also on the exclude list in %s on line %d Modified: php/php-src/trunk/Zend/zend_compile.c =================================================================== --- php/php-src/trunk/Zend/zend_compile.c 2012-03-04 19:30:01 UTC (rev 323897) +++ php/php-src/trunk/Zend/zend_compile.c 2012-03-04 19:34:19 UTC (rev 323898) @@ -3984,13 +3984,28 @@ /** With the other traits, we are more permissive. We do not give errors for those. This allows to be more - defensive in such definitions. */ + defensive in such definitions. + However, we want to make sure that the insteadof declartion + is consistent in itself. + */ j = 0; while (cur_precedence->exclude_from_classes[j]) { char* class_name = (char*)cur_precedence->exclude_from_classes[j]; zend_uint name_length = strlen(class_name); cur_precedence->exclude_from_classes[j] = zend_fetch_class(class_name, name_length, ZEND_FETCH_CLASS_TRAIT TSRMLS_CC); + + /* make sure that the trait method is not from a class mentioned in + exclude_from_classes, for consistency */ + if (cur_precedence->trait_method->ce == cur_precedence->exclude_from_classes[i]) { + zend_error(E_COMPILE_ERROR, + "Inconsistent insteadof definition. " + "The method %s is to be used from %s, but %s is also on the exclude list", + cur_method_ref->method_name, + cur_precedence->trait_method->ce->name, + cur_precedence->trait_method->ce->name); + } + efree(class_name); j++; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php