gron Fri, 13 May 2011 20:28:34 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=310999
Log:
Fixed a inconsitent condition for aliasing traits.
- missed a failing Traits test, but is now fixed, and the bug covered by a
dedicated test
# Should always comment conditions that go over more than two lines :-/
Changed paths:
A php/php-src/trunk/Zend/tests/traits/bugs/alias01.phpt
U php/php-src/trunk/Zend/tests/traits/language010.phpt
U php/php-src/trunk/Zend/zend_compile.c
Added: php/php-src/trunk/Zend/tests/traits/bugs/alias01.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/alias01.phpt
(rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/alias01.phpt 2011-05-13
20:28:34 UTC (rev 310999)
@@ -0,0 +1,26 @@
+--TEST--
+Aliases are applied to the correct methods, and only to them.
+--FILE--
+<?php
+trait T1 {
+ function m1() { echo "T:m1\n"; }
+ function m2() { echo "T:m2\n"; }
+}
+
+class C1 {
+ use T1 { m1 as a1; }
+}
+
+$o = new C1;
+$o->m1();
+$o->a1();
+$o->m2();
+$o->a2();
+
+?>
+--EXPECTF--
+T:m1
+T:m1
+T:m2
+
+Fatal error: Call to undefined method C1::a2() in %s on line %d
Modified: php/php-src/trunk/Zend/tests/traits/language010.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language010.phpt 2011-05-13
19:56:04 UTC (rev 310998)
+++ php/php-src/trunk/Zend/tests/traits/language010.phpt 2011-05-13
20:28:34 UTC (rev 310999)
@@ -27,4 +27,4 @@
?>
--EXPECTF--
-Fatal error: Failed to add trait method (world) to the trait table. There is
probably already a trait method with the same name in %s on line %d
\ No newline at end of file
+Fatal error: Trait method world has not been applied, because there are
collisions with other trait methods on MyClass in %s on line %d
\ No newline at end of file
Modified: php/php-src/trunk/Zend/zend_compile.c
===================================================================
--- php/php-src/trunk/Zend/zend_compile.c 2011-05-13 19:56:04 UTC (rev
310998)
+++ php/php-src/trunk/Zend/zend_compile.c 2011-05-13 20:28:34 UTC (rev
310999)
@@ -3662,10 +3662,13 @@
/* apply aliases which are qualified with a class name, there should
not be any ambiguity */
if (aliases) {
while (aliases[i]) {
- if (!aliases[i]->trait_method->ce || (fn->common.scope
== aliases[i]->trait_method->ce &&
-
(zend_binary_strcasecmp(aliases[i]->trait_method->method_name,
+
+ if (/* Scope unset or equal to the function we compare
to */
+ (!aliases[i]->trait_method->ce || fn->common.scope ==
aliases[i]->trait_method->ce)
+ && /* and, the alias applies to fn */
+ (zend_binary_strcasecmp(aliases[i]->trait_method->method_name,
aliases[i]->trait_method->mname_len,
-
fn->common.function_name,
fnname_len) == 0))) {
+
fn->common.function_name,
fnname_len) == 0)) {
if (aliases[i]->alias) {
fn_copy = *fn;
zend_traits_duplicate_function(&fn_copy, estrndup(aliases[i]->alias,
aliases[i]->alias_len) TSRMLS_CC);
@@ -3703,10 +3706,12 @@
if (aliases) {
i = 0;
while (aliases[i]) {
- if ((!aliases[i]->trait_method->ce ||
fn->common.scope == aliases[i]->trait_method->ce) &&
-
(zend_binary_strcasecmp(aliases[i]->trait_method->method_name,
-
aliases[i]->trait_method->mname_len,
-
fn->common.function_name, fnname_len) == 0)) {
+ if (/* Scope unset or equal to the function we
compare to */
+ (!aliases[i]->trait_method->ce || fn->common.scope ==
aliases[i]->trait_method->ce)
+ && /* and, the alias applies to fn */
+
(zend_binary_strcasecmp(aliases[i]->trait_method->method_name,
+ aliases[i]->trait_method->mname_len,
+
fn->common.function_name, fnname_len) == 0)) {
if (!aliases[i]->alias &&
aliases[i]->modifiers) { /* if it is 0, no modifieres has been changed */
fn_copy.common.fn_flags =
aliases[i]->modifiers;
if (!(aliases[i]->modifiers &
ZEND_ACC_PPP_MASK)) {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php