svn: /php/php-src/trunk/Zend/ tests/traits/error_016.phpt zend_compile.c zend_vm_def.h zend_vm_execute.h
| From: | Felipe Pena | Date: | Fri, 07 May 2010 11:09:35 +0000 |
| Subject: | svn: /php/php-src/trunk/Zend/ tests/traits/error_016.phpt zend_compile.c zend_vm_def.h zend_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-62574@lists.php.net to get a copy of this message | ||
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);