]> granicus.if.org Git - php/commitdiff
Made ZEND_ACC_TRAIT a saner value
authorGuilherme Blanco <guilhermeblanco@hotmail.com>
Thu, 12 Feb 2015 22:19:14 +0000 (23:19 +0100)
committerNikita Popov <nikic@php.net>
Thu, 12 Feb 2015 22:20:19 +0000 (23:20 +0100)
CC_TRAIT valued as 0x120 is too magical to be comprehensible by others.

Zend/zend_API.c
Zend/zend_builtin_functions.c
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute_API.c
Zend/zend_inheritance.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/reflection/php_reflection.c
ext/reflection/tests/ReflectionClass_getModifiers_basic.phpt
ext/reflection/tests/ReflectionClass_modifiers_001.phpt

index bd0f330a2f2bd61f8692245c6e9c79d94fc4c6ba..fe6ae338027224576f5537f9c4fbe43bf77865b2 100644 (file)
@@ -1090,11 +1090,14 @@ ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
  * calling zend_merge_properties(). */
 ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type, HashTable *properties ZEND_FILE_LINE_DC) /* {{{ */
 {
-       if (class_type->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
-               char *what =   (class_type->ce_flags & ZEND_ACC_INTERFACE)                ? "interface"
-                                        :((class_type->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) ? "trait"
-                                        :                                                              "abstract class";
-               zend_error(E_ERROR, "Cannot instantiate %s %s", what, class_type->name->val);
+       if (class_type->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
+               if (class_type->ce_flags & ZEND_ACC_INTERFACE) {
+                       zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", class_type->name->val);
+               } else if (class_type->ce_flags & ZEND_ACC_TRAIT) {
+                       zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", class_type->name->val);
+               } else {
+                       zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", class_type->name->val);
+               }
        }
 
        zend_update_class_constants(class_type);
index fe7c8f7556580a9a9886f1b4b3487ff67af82187..dca0890b1473f5443d2db8126d4fce8a4bed8c48 100644 (file)
@@ -1378,14 +1378,16 @@ ZEND_FUNCTION(class_exists)
                } else {
                        lc_name = zend_string_tolower(class_name);
                }
+
                ce = zend_hash_find_ptr(EG(class_table), lc_name);
                zend_string_release(lc_name);
                RETURN_BOOL(ce && !((ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT)) > ZEND_ACC_EXPLICIT_ABSTRACT_CLASS));
        }
 
        ce = zend_lookup_class(class_name);
+
        if (ce) {
-               RETURN_BOOL((ce->ce_flags & (ZEND_ACC_INTERFACE | (ZEND_ACC_TRAIT - ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))) == 0);
+               RETURN_BOOL((ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT)) == 0);
        } else {
                RETURN_FALSE;
        }
@@ -1462,6 +1464,7 @@ ZEND_FUNCTION(trait_exists)
                } else {
                        lc_name = zend_string_tolower(trait_name);
                }
+
                ce = zend_hash_find_ptr(EG(class_table), lc_name);
                zend_string_release(lc_name);
                RETURN_BOOL(ce && ((ce->ce_flags & ZEND_ACC_TRAIT) > ZEND_ACC_EXPLICIT_ABSTRACT_CLASS));
@@ -1806,7 +1809,7 @@ ZEND_FUNCTION(get_declared_traits)
    Returns an array of all declared classes. */
 ZEND_FUNCTION(get_declared_classes)
 {
-       uint32_t mask = ZEND_ACC_INTERFACE | (ZEND_ACC_TRAIT & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS);
+       uint32_t mask = ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT;
        uint32_t comply = 0;
 
        if (zend_parse_parameters_none() == FAILURE) {
index 1fcc7e1b31c566e6f133e990803a2fce0c909c13..90c7ec34b3220fdde9fccd2f4794c7697b41c980 100644 (file)
@@ -984,7 +984,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_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ce->name->val, parent_ce->name->val);
-       } else if ((parent_ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
+       } else if (parent_ce->ce_flags & ZEND_ACC_TRAIT) {
                zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ce->name->val, parent_ce->name->val);
        }
 
@@ -4022,7 +4022,7 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo
 {
        zend_class_entry *ce = CG(active_class_entry);
        zend_bool in_interface = (ce->ce_flags & ZEND_ACC_INTERFACE) != 0;
-       zend_bool in_trait = ZEND_CE_IS_TRAIT(ce);
+       zend_bool in_trait = (ce->ce_flags & ZEND_ACC_TRAIT) != 0;
        zend_bool is_public = (op_array->fn_flags & ZEND_ACC_PUBLIC) != 0;
        zend_bool is_static = (op_array->fn_flags & ZEND_ACC_STATIC) != 0;
 
@@ -4384,7 +4384,7 @@ void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */
                zend_string *name = zend_ast_get_str(name_ast);
                zval value_zv;
 
-               if (ZEND_CE_IS_TRAIT(ce)) {
+               if ((ce->ce_flags & ZEND_ACC_TRAIT) != 0) {
                        zend_error_noreturn(E_COMPILE_ERROR, "Traits cannot have constants");
                        return;
                }
@@ -5088,7 +5088,7 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
                        break;
                case T_CLASS_C:
                        if (ce) {
-                               if (ZEND_CE_IS_TRAIT(ce)) {
+                               if ((ce->ce_flags & ZEND_ACC_TRAIT) != 0) {
                                        return 0;
                                } else {
                                        ZVAL_STR_COPY(zv, ce->name);
@@ -5098,7 +5098,7 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
                        }
                        break;
                case T_TRAIT_C:
-                       if (ce && ZEND_CE_IS_TRAIT(ce)) {
+                       if (ce && (ce->ce_flags & ZEND_ACC_TRAIT) != 0) {
                                ZVAL_STR_COPY(zv, ce->name);
                        } else {
                                ZVAL_EMPTY_STRING(zv);
@@ -5987,7 +5987,7 @@ void zend_compile_magic_const(znode *result, zend_ast *ast) /* {{{ */
 
        ZEND_ASSERT(ast->attr == T_CLASS_C &&
                    CG(active_class_entry) &&
-                   ZEND_CE_IS_TRAIT(CG(active_class_entry)));
+                   (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) != 0);
 
        {
                zend_ast *const_ast = zend_ast_create(ZEND_AST_CONST,
@@ -6122,7 +6122,7 @@ void zend_compile_const_expr_magic_const(zend_ast **ast_ptr) /* {{{ */
        /* Other cases already resolved by constant folding */
        ZEND_ASSERT(ast->attr == T_CLASS_C &&
                    CG(active_class_entry) &&
-                   ZEND_CE_IS_TRAIT(CG(active_class_entry)));
+                   (CG(active_class_entry)->ce_flags & ZEND_ACC_TRAIT) != 0);
 
        {
                zval const_zv;
index d39f1285f4ed2b30997767fa5868b39f2edb9fcb..1104a29b826b1e5c139538dd47f3e4c409dcff53 100644 (file)
@@ -191,8 +191,8 @@ typedef struct _zend_try_catch_element {
 /* ZEND_ACC_EXPLICIT_ABSTRACT_CLASS denotes that a class was explicitly defined as abstract by using the keyword. */
 #define ZEND_ACC_IMPLICIT_ABSTRACT_CLASS       0x10
 #define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS       0x20
-#define ZEND_ACC_INTERFACE                         0x80
-#define ZEND_ACC_TRAIT                                         0x120
+#define ZEND_ACC_INTERFACE                         0x40
+#define ZEND_ACC_TRAIT                                         0x80
 
 /* method flags (visibility) */
 /* The order of those must be kept - public < protected < private */
@@ -258,8 +258,6 @@ typedef struct _zend_try_catch_element {
 /* Function has a return type hint (or class has such non-private function) */
 #define ZEND_ACC_HAS_RETURN_TYPE               0x40000000
 
-#define ZEND_CE_IS_TRAIT(ce) (((ce)->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT)
-
 char *zend_visibility_string(uint32_t fn_flags);
 
 typedef struct _zend_property_info {
index c6a0d8f0c9abaa00450f26ebe5f801f195b3e66f..0554e31a5e02541cffc96bf57e2c3edc44b884ef 100644 (file)
@@ -1395,7 +1395,7 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */
        zend_function *func;
        zend_abstract_info ai;
 
-       if ((ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) && !(ce->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
+       if ((ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) && !(ce->ce_flags & (ZEND_ACC_TRAIT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))) {
                memset(&ai, 0, sizeof(ai));
 
                ZEND_HASH_FOREACH_PTR(&ce->function_table, func) {
index bcbf3c7b758a45c9e6713ae91cba7ac8dce04e0f..dbd81d8e1d110898fb7a93fceda2a4fb6d8c9009 100644 (file)
@@ -1126,7 +1126,7 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
                                        zend_get_function_declaration(existing_fn)->val);
                        }
                        return;
-               } else if ((existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
+               } else if (existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT) {
                        /* two traits can't define the same non-abstract method */
 #if 1
                        zend_error_noreturn(E_COMPILE_ERROR, "Trait method %s has not been applied, because there are collisions with other trait methods on %s",
index 479f7b7151a18a4708141e7acafe60d8c1eb0985..858a3f777e1f25c3cc46a00f7b890e9babc33370 100644 (file)
@@ -3893,10 +3893,10 @@ ZEND_VM_HANDLER(68, ZEND_NEW, CONST|VAR, ANY)
        } else {
                ce = Z_CE_P(EX_VAR(opline->op1.var));
        }
-       if (UNEXPECTED((ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) {
+       if (UNEXPECTED((ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) {
                if (ce->ce_flags & ZEND_ACC_INTERFACE) {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", ce->name->val);
-               } else if ((ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
+               } else if (ce->ce_flags & ZEND_ACC_TRAIT) {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", ce->name->val);
                } else {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", ce->name->val);
@@ -5880,7 +5880,7 @@ ZEND_VM_HANDLER(154, ZEND_ADD_TRAIT, ANY, ANY)
                        CHECK_EXCEPTION();
                        ZEND_VM_NEXT_OPCODE();
                }
-               if (!((trait->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT)) {
+               if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
                        zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ce->name->val, trait->name->val);
                }
                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), trait);
index 4ef0779089cf1725839a15c1f3b331387dbfa9a7..6d24cac6d440de7c6e07deb65a57fb4c836ced66 100644 (file)
@@ -1189,7 +1189,7 @@ static int ZEND_FASTCALL  ZEND_ADD_TRAIT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
                        CHECK_EXCEPTION();
                        ZEND_VM_NEXT_OPCODE();
                }
-               if (!((trait->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT)) {
+               if (!(trait->ce_flags & ZEND_ACC_TRAIT)) {
                        zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ce->name->val, trait->name->val);
                }
                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), trait);
@@ -2727,7 +2727,7 @@ static int ZEND_FASTCALL  ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        if (UNEXPECTED((ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) {
                if (ce->ce_flags & ZEND_ACC_INTERFACE) {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", ce->name->val);
-               } else if ((ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
+               } else if (ce->ce_flags & ZEND_ACC_TRAIT) {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", ce->name->val);
                } else {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", ce->name->val);
@@ -11806,10 +11806,10 @@ static int ZEND_FASTCALL  ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
        } else {
                ce = Z_CE_P(EX_VAR(opline->op1.var));
        }
-       if (UNEXPECTED((ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) {
+       if (UNEXPECTED((ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) {
                if (ce->ce_flags & ZEND_ACC_INTERFACE) {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", ce->name->val);
-               } else if ((ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
+               } else if (ce->ce_flags & ZEND_ACC_TRAIT) {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", ce->name->val);
                } else {
                        zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", ce->name->val);
index 92b5d9da5fc0f10c4bbfdccb606aeed41e5e4b3c..309b10c1bb17125445bd66181b43de1551a2651d 100644 (file)
@@ -374,7 +374,7 @@ static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *in
                char *kind = "Class";
                if (ce->ce_flags & ZEND_ACC_INTERFACE) {
                        kind = "Interface";
-               } else if ((ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
+               } else if (ce->ce_flags & ZEND_ACC_TRAIT) {
                        kind = "Trait";
                }
                string_printf(str, "%s%s [ ", indent, kind);
@@ -389,7 +389,7 @@ static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *in
        }
        if (ce->ce_flags & ZEND_ACC_INTERFACE) {
                string_printf(str, "interface ");
-       } else if ((ce->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
+       } else if (ce->ce_flags & ZEND_ACC_TRAIT) {
                string_printf(str, "trait ");
        } else {
                if (ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
@@ -4143,7 +4143,7 @@ ZEND_METHOD(reflection_class, isInterface)
    Returns whether this is a trait */
 ZEND_METHOD(reflection_class, isTrait)
 {
-       _class_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_TRAIT & ~ZEND_ACC_EXPLICIT_ABSTRACT_CLASS);
+       _class_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_TRAIT);
 }
 /* }}} */
 
index 8d2bd47d12da131646f8516727899c97df107b95..68189db2bbb5c5bd8ce26ab9701ce7136c5fbf30 100644 (file)
@@ -31,7 +31,7 @@ dump_modifiers('g');
 int(0)
 int(32)
 int(4)
-int(128)
+int(64)
 int(524288)
-int(524416)
+int(524352)
 int(0)
index 1e0a97dfe088d05584f84b03e7332c9aa4cdcabc..7f62b565a23ca580deff3731fb978125a0d131d2 100644 (file)
@@ -41,4 +41,4 @@ int(4)
 bool(false)
 bool(true)
 bool(false)
-int(128)
\ No newline at end of file
+int(64)
\ No newline at end of file