felipe Fri, 07 May 2010 11:09:35 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=299099
Log: - Added check for constant creation on Traits - Simplified trait flag check - Test++ :) Changed paths: A php/php-src/trunk/Zend/tests/traits/error_016.phpt U php/php-src/trunk/Zend/zend_compile.c U php/php-src/trunk/Zend/zend_vm_def.h U php/php-src/trunk/Zend/zend_vm_execute.h Added: php/php-src/trunk/Zend/tests/traits/error_016.phpt =================================================================== --- php/php-src/trunk/Zend/tests/traits/error_016.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/traits/error_016.phpt 2010-05-07 11:09:35 UTC (rev 299099) @@ -0,0 +1,12 @@ +--TEST-- +Trying to create a constant on Trait +--FILE-- +<?php + +trait foo { + const a = 1; +} + +?> +--EXPECTF-- +Fatal error: Traits cannot have constants in %s on line %d Property changes on: php/php-src/trunk/Zend/tests/traits/error_016.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/trunk/Zend/zend_compile.c =================================================================== --- php/php-src/trunk/Zend/zend_compile.c 2010-05-07 04:42:35 UTC (rev 299098) +++ php/php-src/trunk/Zend/zend_compile.c 2010-05-07 11:09:35 UTC (rev 299099) @@ -3955,7 +3955,7 @@ if (parent_ce->ce_flags & ZEND_ACC_INTERFACE) { zend_error(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ce->name, parent_ce->name); - } else if ((parent_ce->ce_flags & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) & ZEND_ACC_TRAIT) { + } else if ((parent_ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { zend_error(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ce->name, parent_ce->name); } @@ -4654,7 +4654,12 @@ if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) { zend_error(E_COMPILE_ERROR, "Arrays are not allowed in class constants"); + return; } + if ((CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { + zend_error(E_COMPILE_ERROR, "Traits cannot have constants"); + return; + } ALLOC_ZVAL(property); *property = value->u.constant; Modified: php/php-src/trunk/Zend/zend_vm_def.h =================================================================== --- php/php-src/trunk/Zend/zend_vm_def.h 2010-05-07 04:42:35 UTC (rev 299098) +++ php/php-src/trunk/Zend/zend_vm_def.h 2010-05-07 11:09:35 UTC (rev 299099) @@ -3229,7 +3229,7 @@ if (UNEXPECTED((EX_T(opline->op1.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) { if (EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) { zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", EX_T(opline->op1.var).class_entry->name); - } else if ((EX_T(opline->op1.var).class_entry->ce_flags & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) & ZEND_ACC_TRAIT) { + } else if ((EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", EX_T(opline->op1.var).class_entry->name); } else { zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", EX_T(opline->op1.var).class_entry->name); @@ -4677,7 +4677,7 @@ opline->extended_value TSRMLS_CC); if (trait) { - if (!((trait->ce_flags & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) & ZEND_ACC_TRAIT)) { + if (!((trait->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT)) { zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ce->name, trait->name); } zend_do_implement_trait(ce, trait TSRMLS_CC); Modified: php/php-src/trunk/Zend/zend_vm_execute.h =================================================================== --- php/php-src/trunk/Zend/zend_vm_execute.h 2010-05-07 04:42:35 UTC (rev 299098) +++ php/php-src/trunk/Zend/zend_vm_execute.h 2010-05-07 11:09:35 UTC (rev 299099) @@ -518,7 +518,7 @@ if (UNEXPECTED((EX_T(opline->op1.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) { if (EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) { zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", EX_T(opline->op1.var).class_entry->name); - } else if ((EX_T(opline->op1.var).class_entry->ce_flags & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) & ZEND_ACC_TRAIT) { + } else if ((EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) { zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", EX_T(opline->op1.var).class_entry->name); } else { zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", EX_T(opline->op1.var).class_entry->name); @@ -690,7 +690,7 @@ opline->extended_value TSRMLS_CC); if (trait) { - if (!((trait->ce_flags & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) & ZEND_ACC_TRAIT)) { + if (!((trait->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT)) { zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ce->name, trait->name); } zend_do_implement_trait(ce, trait TSRMLS_CC);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php