]> granicus.if.org Git - php/commitdiff
- Added check for constant creation on Traits
authorFelipe Pena <felipe@php.net>
Fri, 7 May 2010 11:09:35 +0000 (11:09 +0000)
committerFelipe Pena <felipe@php.net>
Fri, 7 May 2010 11:09:35 +0000 (11:09 +0000)
- Simplified trait flag check
- Test++ :)

Zend/tests/traits/error_016.phpt [new file with mode: 0644]
Zend/zend_compile.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/Zend/tests/traits/error_016.phpt b/Zend/tests/traits/error_016.phpt
new file mode 100644 (file)
index 0000000..65a3a83
--- /dev/null
@@ -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
index 032abf75f6a47b1ba75eca88609597d883c307ad..c14ba9fbda4a31180a9f508f68d0deae4ec5e4d0 100644 (file)
@@ -3955,7 +3955,7 @@ ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array
 
        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,6 +4654,11 @@ void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_D
 
        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);
index 1e7a43c172eda492fbf1c998737b01df1f2aceee..d13b3b281a52023178c20716b45e1a3e4bd20ead 100644 (file)
@@ -3229,7 +3229,7 @@ ZEND_VM_HANDLER(68, ZEND_NEW, ANY, ANY)
        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 @@ ZEND_VM_HANDLER(154, ZEND_ADD_TRAIT, ANY, ANY)
                                              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);
index 3ef84efabea77f6c2d8413f13121879c8cfd248a..f9370750f7485faf87fd42c28843ea954ad6afe5 100644 (file)
@@ -518,7 +518,7 @@ static int ZEND_FASTCALL  ZEND_NEW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        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 @@ static int ZEND_FASTCALL  ZEND_ADD_TRAIT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                                              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);