svn: /php/php-src/trunk/Zend/ zend_compile.c zend_vm_def.h zend_vm_execute.h
| From: | Felipe Pena | Date: | Tue, 04 May 2010 18:21:00 +0000 |
| Subject: | svn: /php/php-src/trunk/Zend/ zend_compile.c zend_vm_def.h zend_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-62548@lists.php.net to get a copy of this message | ||
felipe Tue, 04 May 2010 18:21:00 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=298986
Log:
- Added check for abstract class
abstract class foo { }
class T { use foo; } // T cannot use foo - it is not a trait
- Added check for trait on NEW
trait a { }
new a; // Cannot instantiate trait a
# Tests for errors comming soon :)
Changed paths:
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
Modified: php/php-src/trunk/Zend/zend_compile.c
===================================================================
--- php/php-src/trunk/Zend/zend_compile.c 2010-05-04 18:08:14 UTC (rev 298985)
+++ php/php-src/trunk/Zend/zend_compile.c 2010-05-04 18:21:00 UTC (rev 298986)
@@ -4518,7 +4518,7 @@
opline->opcode = ZEND_ADD_TRAIT;
SET_NODE(opline->op1, &CG(implementing_class));
zend_resolve_class_name(trait_name, &opline->extended_value, 0 TSRMLS_CC);
- opline->extended_value = (opline->extended_value & ~ZEND_FETCH_CLASS_MASK) |
ZEND_FETCH_CLASS_TRAIT;
+ opline->extended_value = ZEND_FETCH_CLASS_TRAIT;
opline->op2_type = IS_CONST;
opline->op2.constant = zend_add_class_name_literal(CG(active_op_array),
&trait_name->u.constant TSRMLS_CC);
CG(active_class_entry)->num_traits++;
Modified: php/php-src/trunk/Zend/zend_vm_def.h
===================================================================
--- php/php-src/trunk/Zend/zend_vm_def.h 2010-05-04 18:08:14 UTC (rev 298985)
+++ php/php-src/trunk/Zend/zend_vm_def.h 2010-05-04 18:21:00 UTC (rev 298986)
@@ -3230,6 +3230,8 @@
if (EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) {
class_type = "interface";
+ } else if (EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_TRAIT) {
+ class_type = "trait";
} else {
class_type = "abstract class";
}
@@ -4663,7 +4665,7 @@
opline->extended_value TSRMLS_CC);
if (trait) {
- if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
+ if (!((trait->ce_flags & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) & 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-04 18:08:14 UTC (rev 298985)
+++ php/php-src/trunk/Zend/zend_vm_execute.h 2010-05-04 18:21:00 UTC (rev 298986)
@@ -520,6 +520,8 @@
if (EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) {
class_type = "interface";
+ } else if (EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_TRAIT) {
+ class_type = "trait";
} else {
class_type = "abstract class";
}
@@ -691,7 +693,7 @@
opline->extended_value TSRMLS_CC);
if (trait) {
- if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
+ if (!((trait->ce_flags & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) & 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);