Lines Matching refs:ce

57 static zend_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce) /* {{{ */  in zend_duplicate_function()  argument
62 if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { in zend_duplicate_function()
91 static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */ in do_inherit_parent_constructor() argument
93 ZEND_ASSERT(ce->parent != NULL); in do_inherit_parent_constructor()
96 ce->create_object = ce->parent->create_object; in do_inherit_parent_constructor()
99 if (EXPECTED(!ce->get_iterator)) { in do_inherit_parent_constructor()
100 ce->get_iterator = ce->parent->get_iterator; in do_inherit_parent_constructor()
102 if (EXPECTED(!ce->iterator_funcs.funcs)) { in do_inherit_parent_constructor()
103 ce->iterator_funcs.funcs = ce->parent->iterator_funcs.funcs; in do_inherit_parent_constructor()
105 if (EXPECTED(!ce->__get)) { in do_inherit_parent_constructor()
106 ce->__get = ce->parent->__get; in do_inherit_parent_constructor()
108 if (EXPECTED(!ce->__set)) { in do_inherit_parent_constructor()
109 ce->__set = ce->parent->__set; in do_inherit_parent_constructor()
111 if (EXPECTED(!ce->__unset)) { in do_inherit_parent_constructor()
112 ce->__unset = ce->parent->__unset; in do_inherit_parent_constructor()
114 if (EXPECTED(!ce->__isset)) { in do_inherit_parent_constructor()
115 ce->__isset = ce->parent->__isset; in do_inherit_parent_constructor()
117 if (EXPECTED(!ce->__call)) { in do_inherit_parent_constructor()
118 ce->__call = ce->parent->__call; in do_inherit_parent_constructor()
120 if (EXPECTED(!ce->__callstatic)) { in do_inherit_parent_constructor()
121 ce->__callstatic = ce->parent->__callstatic; in do_inherit_parent_constructor()
123 if (EXPECTED(!ce->__tostring)) { in do_inherit_parent_constructor()
124 ce->__tostring = ce->parent->__tostring; in do_inherit_parent_constructor()
126 if (EXPECTED(!ce->clone)) { in do_inherit_parent_constructor()
127 ce->clone = ce->parent->clone; in do_inherit_parent_constructor()
129 if (EXPECTED(!ce->serialize)) { in do_inherit_parent_constructor()
130 ce->serialize = ce->parent->serialize; in do_inherit_parent_constructor()
132 if (EXPECTED(!ce->unserialize)) { in do_inherit_parent_constructor()
133 ce->unserialize = ce->parent->unserialize; in do_inherit_parent_constructor()
135 if (!ce->destructor) { in do_inherit_parent_constructor()
136 ce->destructor = ce->parent->destructor; in do_inherit_parent_constructor()
138 if (EXPECTED(!ce->__debugInfo)) { in do_inherit_parent_constructor()
139 ce->__debugInfo = ce->parent->__debugInfo; in do_inherit_parent_constructor()
142 if (ce->constructor) { in do_inherit_parent_constructor()
143 …if (ce->parent->constructor && UNEXPECTED(ce->parent->constructor->common.fn_flags & ZEND_ACC_FINA… in do_inherit_parent_constructor()
145 ZSTR_VAL(ce->parent->name), ZSTR_VAL(ce->parent->constructor->common.function_name), in do_inherit_parent_constructor()
146 ZSTR_VAL(ce->name), ZSTR_VAL(ce->constructor->common.function_name)); in do_inherit_parent_constructor()
151 ce->constructor = ce->parent->constructor; in do_inherit_parent_constructor()
630 …unction *do_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce) /* {{{ */ in do_inherit_method() argument
632 zval *child = zend_hash_find(&ce->function_table, key); in do_inherit_method()
641 func->common.scope != ce && in do_inherit_method()
653 ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in do_inherit_method()
656 return zend_duplicate_function(parent, ce); in do_inherit_method()
660 …inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ in do_inherit_property() argument
662 zval *child = zend_hash_find(&ce->properties_info, key); in do_inherit_property()
672 …(parent_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ZSTR_VAL(ce->parent->name), ZS… in do_inherit_property()
673 …(child_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ZSTR_VAL(ce->name), ZSTR_VAL(ke… in do_inherit_property()
681 …be %s (as in class %s)%s", ZSTR_VAL(ce->name), ZSTR_VAL(key), zend_visibility_string(parent_info->… in do_inherit_property()
687 zval_ptr_dtor_nogc(&(ce->default_properties_table[parent_num])); in do_inherit_property()
688 ce->default_properties_table[parent_num] = ce->default_properties_table[child_num]; in do_inherit_property()
689 ZVAL_UNDEF(&ce->default_properties_table[child_num]); in do_inherit_property()
695 if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { in do_inherit_property()
703 if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { in do_inherit_property()
709 _zend_hash_append_ptr(&ce->properties_info, key, child_info); in do_inherit_property()
714 static inline void do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ in do_implement_interface() argument
716 …if (!(ce->ce_flags & ZEND_ACC_INTERFACE) && iface->interface_gets_implemented && iface->interface_… in do_implement_interface()
717 …zend_error_noreturn(E_CORE_ERROR, "Class %s could not implement interface %s", ZSTR_VAL(ce->name),… in do_implement_interface()
719 if (UNEXPECTED(ce == iface)) { in do_implement_interface()
720 zend_error_noreturn(E_ERROR, "Interface %s cannot implement itself", ZSTR_VAL(ce->name)); in do_implement_interface()
725 ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_entry *iface) /* {{… in zend_do_inherit_interfaces() argument
734 ce_num = ce->num_interfaces; in zend_do_inherit_interfaces()
736 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_inherit_interfaces()
737ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_nu… in zend_do_inherit_interfaces()
739ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_n… in zend_do_inherit_interfaces()
746 if (ce->interfaces[i] == entry) { in zend_do_inherit_interfaces()
751 ce->interfaces[ce->num_interfaces++] = entry; in zend_do_inherit_interfaces()
756 while (ce_num < ce->num_interfaces) { in zend_do_inherit_interfaces()
757 do_implement_interface(ce, ce->interfaces[ce_num++]); in zend_do_inherit_interfaces()
762 …lass_constant(zend_string *name, zend_class_constant *parent_const, zend_class_entry *ce) /* {{{ */ in do_inherit_class_constant() argument
764 zend_class_constant *c = zend_hash_find_ptr(&ce->constants_table, name); in do_inherit_class_constant()
769 …ZSTR_VAL(ce->name), ZSTR_VAL(name), zend_visibility_string(Z_ACCESS_FLAGS(parent_const->value)), Z… in do_inherit_class_constant()
773 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in do_inherit_class_constant()
775 if (ce->type & ZEND_INTERNAL_CLASS) { in do_inherit_class_constant()
784 _zend_hash_append_ptr(&ce->constants_table, name, c); in do_inherit_class_constant()
789 ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) /* {{{ */ in zend_do_inheritance() argument
795 if (UNEXPECTED(ce->ce_flags & ZEND_ACC_INTERFACE)) { in zend_do_inheritance()
798 …zend_error_noreturn(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ZSTR_VAL(ce->… in zend_do_inheritance()
803 …zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ZSTR_VAL(ce->name… in zend_do_inheritance()
805 …zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ZSTR_VAL(ce->name), Z… in zend_do_inheritance()
810 …_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ZSTR_VAL(ce->name), ZSTR_VAL(par… in zend_do_inheritance()
814 ce->parent = parent_ce; in zend_do_inheritance()
817 zend_do_inherit_interfaces(ce, parent_ce); in zend_do_inheritance()
823 if (ce->default_properties_count) { in zend_do_inheritance()
824 …zval *table = pemalloc(sizeof(zval) * (ce->default_properties_count + parent_ce->default_propertie… in zend_do_inheritance()
825 src = ce->default_properties_table + ce->default_properties_count; in zend_do_inheritance()
827 dst = end + ce->default_properties_count; in zend_do_inheritance()
828 ce->default_properties_table = table; in zend_do_inheritance()
834 pefree(src, ce->type == ZEND_INTERNAL_CLASS); in zend_do_inheritance()
835 end = ce->default_properties_table; in zend_do_inheritance()
837 …end = pemalloc(sizeof(zval) * parent_ce->default_properties_count, ce->type == ZEND_INTERNAL_CLASS… in zend_do_inheritance()
839 ce->default_properties_table = end; in zend_do_inheritance()
846 if (parent_ce->type != ce->type) { in zend_do_inheritance()
849 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance()
857 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance()
860 ce->default_properties_count += parent_ce->default_properties_count; in zend_do_inheritance()
866 if (ce->default_static_members_count) { in zend_do_inheritance()
867 …al *table = pemalloc(sizeof(zval) * (ce->default_static_members_count + parent_ce->default_static_… in zend_do_inheritance()
868 src = ce->default_static_members_table + ce->default_static_members_count; in zend_do_inheritance()
870 dst = end + ce->default_static_members_count; in zend_do_inheritance()
871 ce->default_static_members_table = table; in zend_do_inheritance()
877 pefree(src, ce->type == ZEND_INTERNAL_CLASS); in zend_do_inheritance()
878 end = ce->default_static_members_table; in zend_do_inheritance()
880 …end = pemalloc(sizeof(zval) * parent_ce->default_static_members_count, ce->type == ZEND_INTERNAL_C… in zend_do_inheritance()
882 ce->default_static_members_table = end; in zend_do_inheritance()
898 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance()
901 ce->default_static_members_count += parent_ce->default_static_members_count; in zend_do_inheritance()
902 if (ce->type == ZEND_USER_CLASS) { in zend_do_inheritance()
903 ce->static_members_table = ce->default_static_members_table; in zend_do_inheritance()
905 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance()
909 ZEND_HASH_FOREACH_PTR(&ce->properties_info, property_info) { in zend_do_inheritance()
910 if (property_info->ce == ce) { in zend_do_inheritance()
920 zend_hash_extend(&ce->properties_info, in zend_do_inheritance()
921 zend_hash_num_elements(&ce->properties_info) + in zend_do_inheritance()
925 do_inherit_property(property_info, key, ce); in zend_do_inheritance()
932 zend_hash_extend(&ce->constants_table, in zend_do_inheritance()
933 zend_hash_num_elements(&ce->constants_table) + in zend_do_inheritance()
937 do_inherit_class_constant(key, c, ce); in zend_do_inheritance()
942 zend_hash_extend(&ce->function_table, in zend_do_inheritance()
943 zend_hash_num_elements(&ce->function_table) + in zend_do_inheritance()
947 zend_function *new_func = do_inherit_method(key, func, ce); in zend_do_inheritance()
950 _zend_hash_append_ptr(&ce->function_table, key, new_func); in zend_do_inheritance()
955 do_inherit_parent_constructor(ce); in zend_do_inheritance()
957 if (ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS && ce->type == ZEND_INTERNAL_CLASS) { in zend_do_inheritance()
958 ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; in zend_do_inheritance()
959 } else if (!(ce->ce_flags & (ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) { in zend_do_inheritance()
961 zend_verify_abstract_class(ce); in zend_do_inheritance()
963 ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_USE_GUARDS); in zend_do_inheritance()
972 if (old_constant->ce != parent_constant->ce) { in do_inherit_constant_check()
981 …face_constant(zend_string *name, zend_class_constant *c, zend_class_entry *ce, zend_class_entry *i… in do_inherit_iface_constant() argument
983 if (do_inherit_constant_check(&ce->constants_table, c, name, iface)) { in do_inherit_iface_constant()
986 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in do_inherit_iface_constant()
988 if (ce->type & ZEND_INTERNAL_CLASS) { in do_inherit_iface_constant()
997 zend_hash_update_ptr(&ce->constants_table, name, ct); in do_inherit_iface_constant()
1002 ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ in zend_do_implement_interface() argument
1005 uint32_t current_iface_num = ce->num_interfaces; in zend_do_implement_interface()
1006 uint32_t parent_iface_num = ce->parent ? ce->parent->num_interfaces : 0; in zend_do_implement_interface()
1011 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_implement_interface()
1012 if (ce->interfaces[i] == NULL) { in zend_do_implement_interface()
1013 …memmove(ce->interfaces + i, ce->interfaces + i + 1, sizeof(zend_class_entry*) * (--ce->num_interfa… in zend_do_implement_interface()
1015 } else if (ce->interfaces[i] == iface) { in zend_do_implement_interface()
1019 … "Class %s cannot implement previously implemented interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(ifa… in zend_do_implement_interface()
1025 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) { in zend_do_implement_interface()
1029 if (ce->num_interfaces >= current_iface_num) { in zend_do_implement_interface()
1030 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_implement_interface()
1031ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++cur… in zend_do_implement_interface()
1033ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (++cu… in zend_do_implement_interface()
1036 ce->interfaces[ce->num_interfaces++] = iface; in zend_do_implement_interface()
1039 do_inherit_iface_constant(key, c, ce, iface); in zend_do_implement_interface()
1043 zend_function *new_func = do_inherit_method(key, func, ce); in zend_do_implement_interface()
1046 zend_hash_add_new_ptr(&ce->function_table, key, new_func); in zend_do_implement_interface()
1050 do_implement_interface(ce, iface); in zend_do_implement_interface()
1051 zend_do_inherit_interfaces(ce, iface); in zend_do_implement_interface()
1056 ZEND_API void zend_do_implement_trait(zend_class_entry *ce, zend_class_entry *trait) /* {{{ */ in zend_do_implement_trait() argument
1059 uint32_t current_trait_num = ce->num_traits; in zend_do_implement_trait()
1060 uint32_t parent_trait_num = ce->parent ? ce->parent->num_traits : 0; in zend_do_implement_trait()
1062 for (i = 0; i < ce->num_traits; i++) { in zend_do_implement_trait()
1063 if (ce->traits[i] == NULL) { in zend_do_implement_trait()
1064 memmove(ce->traits + i, ce->traits + i + 1, sizeof(zend_class_entry*) * (--ce->num_traits - i)); in zend_do_implement_trait()
1066 } else if (ce->traits[i] == trait) { in zend_do_implement_trait()
1073 if (ce->num_traits >= current_trait_num) { in zend_do_implement_trait()
1074 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_implement_trait()
1075ce->traits = (zend_class_entry **) realloc(ce->traits, sizeof(zend_class_entry *) * (++current_tra… in zend_do_implement_trait()
1077ce->traits = (zend_class_entry **) erealloc(ce->traits, sizeof(zend_class_entry *) * (++current_tr… in zend_do_implement_trait()
1080 ce->traits[ce->num_traits++] = trait; in zend_do_implement_trait()
1096 static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zend_function* fe) /* … in zend_add_magic_methods() argument
1099 ce->clone = fe; in zend_add_magic_methods()
1101 if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) { in zend_add_magic_methods()
1102 …_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name)); in zend_add_magic_methods()
1104 ce->constructor = fe; fe->common.fn_flags |= ZEND_ACC_CTOR; in zend_add_magic_methods()
1106 ce->destructor = fe; fe->common.fn_flags |= ZEND_ACC_DTOR; in zend_add_magic_methods()
1108 ce->__get = fe; in zend_add_magic_methods()
1109 ce->ce_flags |= ZEND_ACC_USE_GUARDS; in zend_add_magic_methods()
1111 ce->__set = fe; in zend_add_magic_methods()
1112 ce->ce_flags |= ZEND_ACC_USE_GUARDS; in zend_add_magic_methods()
1114 ce->__call = fe; in zend_add_magic_methods()
1116 ce->__unset = fe; in zend_add_magic_methods()
1117 ce->ce_flags |= ZEND_ACC_USE_GUARDS; in zend_add_magic_methods()
1119 ce->__isset = fe; in zend_add_magic_methods()
1120 ce->ce_flags |= ZEND_ACC_USE_GUARDS; in zend_add_magic_methods()
1122 ce->__callstatic = fe; in zend_add_magic_methods()
1124 ce->__tostring = fe; in zend_add_magic_methods()
1126 ce->__debugInfo = fe; in zend_add_magic_methods()
1127 } else if (ZSTR_LEN(ce->name) == ZSTR_LEN(mname)) { in zend_add_magic_methods()
1128 zend_string *lowercase_name = zend_string_tolower(ce->name); in zend_add_magic_methods()
1131 if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) { in zend_add_magic_methods()
1132 …_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name)); in zend_add_magic_methods()
1134 ce->constructor = fe; in zend_add_magic_methods()
1142 static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_string *key, zend_fu… in zend_add_trait_method() argument
1147 if ((existing_fn = zend_hash_find_ptr(&ce->function_table, key)) != NULL) { in zend_add_trait_method()
1148 if (existing_fn->common.scope == ce) { in zend_add_trait_method()
1197 name, ZSTR_VAL(ce->name)); in zend_add_trait_method()
1201 ZSTR_VAL(ce->name), name, in zend_add_trait_method()
1221 fn = zend_hash_update_ptr(&ce->function_table, key, new_fn); in zend_add_trait_method()
1222 zend_add_magic_methods(ce, key, fn); in zend_add_trait_method()
1226 static void zend_fixup_trait_method(zend_function *fn, zend_class_entry *ce) /* {{{ */ in zend_fixup_trait_method() argument
1230 fn->common.scope = ce; in zend_fixup_trait_method()
1233 ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in zend_fixup_trait_method()
1236 ce->ce_flags |= ZEND_HAS_STATIC_IN_METHODS; in zend_fixup_trait_method()
1242 static int zend_traits_copy_functions(zend_string *fnname, zend_function *fn, zend_class_entry *ce,… in zend_traits_copy_functions() argument
1249 if (ce->trait_aliases) { in zend_traits_copy_functions()
1250 alias_ptr = ce->trait_aliases; in zend_traits_copy_functions()
1255 && (!alias->trait_method->ce || fn->common.scope == alias->trait_method->ce) in zend_traits_copy_functions()
1266 zend_add_trait_method(ce, ZSTR_VAL(alias->alias), lcname, &fn_copy, overriden); in zend_traits_copy_functions()
1270 if (!alias->trait_method->ce) { in zend_traits_copy_functions()
1271 alias->trait_method->ce = fn->common.scope; in zend_traits_copy_functions()
1285 if (ce->trait_aliases) { in zend_traits_copy_functions()
1286 alias_ptr = ce->trait_aliases; in zend_traits_copy_functions()
1291 && (!alias->trait_method->ce || fn->common.scope == alias->trait_method->ce) in zend_traits_copy_functions()
1298 if (!alias->trait_method->ce) { in zend_traits_copy_functions()
1299 alias->trait_method->ce = fn->common.scope; in zend_traits_copy_functions()
1307 zend_add_trait_method(ce, ZSTR_VAL(fn->common.function_name), fnname, &fn_copy, overriden); in zend_traits_copy_functions()
1314 static void zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait) /* {{{ */ in zend_check_trait_usage() argument
1322 for (i = 0; i < ce->num_traits; i++) { in zend_check_trait_usage()
1323 if (ce->traits[i] == trait) { in zend_check_trait_usage()
1327 …_COMPILE_ERROR, "Required Trait %s wasn't added to %s", ZSTR_VAL(trait->name), ZSTR_VAL(ce->name)); in zend_check_trait_usage()
1331 static void zend_traits_init_trait_structures(zend_class_entry *ce) /* {{{ */ in zend_traits_init_trait_structures() argument
1341 if (ce->trait_precedences) { in zend_traits_init_trait_structures()
1343 precedences = ce->trait_precedences; in zend_traits_init_trait_structures()
1344 ce->trait_precedences = NULL; in zend_traits_init_trait_structures()
1349 if (!(cur_precedence->trait_method->ce = zend_fetch_class(cur_method_ref->class_name, in zend_traits_init_trait_structures()
1353 zend_check_trait_usage(ce, cur_precedence->trait_method->ce); in zend_traits_init_trait_structures()
1357 method_exists = zend_hash_exists(&cur_method_ref->ce->function_table, in zend_traits_init_trait_structures()
1363 ZSTR_VAL(cur_method_ref->ce->name), in zend_traits_init_trait_structures()
1377 …if (!(cur_precedence->exclude_from_classes[j].ce = zend_fetch_class(class_name, ZEND_FETCH_CLASS_T… in zend_traits_init_trait_structures()
1380 zend_check_trait_usage(ce, cur_precedence->exclude_from_classes[j].ce); in zend_traits_init_trait_structures()
1384 if (cur_precedence->trait_method->ce == cur_precedence->exclude_from_classes[j].ce) { in zend_traits_init_trait_structures()
1389 ZSTR_VAL(cur_precedence->trait_method->ce->name), in zend_traits_init_trait_structures()
1390 ZSTR_VAL(cur_precedence->trait_method->ce->name)); in zend_traits_init_trait_structures()
1399 ce->trait_precedences = precedences; in zend_traits_init_trait_structures()
1402 if (ce->trait_aliases) { in zend_traits_init_trait_structures()
1404 while (ce->trait_aliases[i]) { in zend_traits_init_trait_structures()
1406 if (ce->trait_aliases[i]->trait_method->class_name) { in zend_traits_init_trait_structures()
1407 cur_method_ref = ce->trait_aliases[i]->trait_method; in zend_traits_init_trait_structures()
1408 …if (!(cur_method_ref->ce = zend_fetch_class(cur_method_ref->class_name, ZEND_FETCH_CLASS_TRAIT|ZEN… in zend_traits_init_trait_structures()
1411 zend_check_trait_usage(ce, cur_method_ref->ce); in zend_traits_init_trait_structures()
1415 method_exists = zend_hash_exists(&cur_method_ref->ce->function_table, in zend_traits_init_trait_structures()
1420 …fined for %s::%s but this method does not exist", ZSTR_VAL(cur_method_ref->ce->name), ZSTR_VAL(cur… in zend_traits_init_trait_structures()
1439 while (precedences[i]->exclude_from_classes[j].ce) { in zend_traits_compile_exclude_table()
1440 if (precedences[i]->exclude_from_classes[j].ce == trait) { in zend_traits_compile_exclude_table()
1457 static void zend_do_traits_method_binding(zend_class_entry *ce) /* {{{ */ in zend_do_traits_method_binding() argument
1464 for (i = 0; i < ce->num_traits; i++) { in zend_do_traits_method_binding()
1465 if (ce->trait_precedences) { in zend_do_traits_method_binding()
1472 precedences = ce->trait_precedences; in zend_do_traits_method_binding()
1473 ce->trait_precedences = NULL; in zend_do_traits_method_binding()
1474 zend_traits_compile_exclude_table(&exclude_table, precedences, ce->traits[i]); in zend_do_traits_method_binding()
1477 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->traits[i]->function_table, key, fn) { in zend_do_traits_method_binding()
1478 zend_traits_copy_functions(key, fn, ce, &overriden, &exclude_table); in zend_do_traits_method_binding()
1482 ce->trait_precedences = precedences; in zend_do_traits_method_binding()
1484 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->traits[i]->function_table, key, fn) { in zend_do_traits_method_binding()
1485 zend_traits_copy_functions(key, fn, ce, &overriden, NULL); in zend_do_traits_method_binding()
1490 ZEND_HASH_FOREACH_PTR(&ce->function_table, fn) { in zend_do_traits_method_binding()
1491 zend_fixup_trait_method(fn, ce); in zend_do_traits_method_binding()
1494 if (ce->trait_precedences) { in zend_do_traits_method_binding()
1496 while (ce->trait_precedences[i]) { in zend_do_traits_method_binding()
1497 if (ce->trait_precedences[i]->exclude_from_classes) { in zend_do_traits_method_binding()
1498 efree(ce->trait_precedences[i]->exclude_from_classes); in zend_do_traits_method_binding()
1499 ce->trait_precedences[i]->exclude_from_classes = NULL; in zend_do_traits_method_binding()
1512 static zend_class_entry* find_first_definition(zend_class_entry *ce, size_t current_trait, zend_str… in find_first_definition() argument
1516 if (coliding_ce == ce) { in find_first_definition()
1518 if (zend_hash_exists(&ce->traits[i]->properties_info, prop_name)) { in find_first_definition()
1519 return ce->traits[i]; in find_first_definition()
1528 static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */ in zend_do_traits_property_binding() argument
1545 for (i = 0; i < ce->num_traits; i++) { in zend_do_traits_property_binding()
1546 ZEND_HASH_FOREACH_PTR(&ce->traits[i]->properties_info, property_info) { in zend_do_traits_property_binding()
1564 if ((coliding_prop = zend_hash_find_ptr(&ce->properties_info, prop_name)) != NULL) { in zend_do_traits_property_binding()
1570 zend_hash_del(&ce->properties_info, prop_name); in zend_do_traits_property_binding()
1578 op1 = &ce->default_static_members_table[coliding_prop->offset]; in zend_do_traits_property_binding()
1579 op2 = &ce->traits[i]->default_static_members_table[property_info->offset]; in zend_do_traits_property_binding()
1583 op1 = &ce->default_properties_table[OBJ_PROP_TO_NUM(coliding_prop->offset)]; in zend_do_traits_property_binding()
1584 op2 = &ce->traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]; in zend_do_traits_property_binding()
1595 ZSTR_VAL(find_first_definition(ce, i, prop_name, coliding_prop->ce)->name), in zend_do_traits_property_binding()
1596 ZSTR_VAL(property_info->ce->name), in zend_do_traits_property_binding()
1598 ZSTR_VAL(ce->name)); in zend_do_traits_property_binding()
1608 prop_value = &ce->traits[i]->default_static_members_table[property_info->offset]; in zend_do_traits_property_binding()
1610 prop_value = &ce->traits[i]->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]; in zend_do_traits_property_binding()
1615 zend_declare_property_ex(ce, prop_name, in zend_do_traits_property_binding()
1624 static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce) /* {{{ */ in zend_do_check_for_inconsistent_traits_aliasing() argument
1630 if (ce->trait_aliases) { in zend_do_check_for_inconsistent_traits_aliasing()
1631 while (ce->trait_aliases[i]) { in zend_do_check_for_inconsistent_traits_aliasing()
1632 cur_alias = ce->trait_aliases[i]; in zend_do_check_for_inconsistent_traits_aliasing()
1635 if (!cur_alias->trait_method->ce) { in zend_do_check_for_inconsistent_traits_aliasing()
1653 if (zend_hash_exists(&ce->function_table, in zend_do_check_for_inconsistent_traits_aliasing()
1674 ZEND_API void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */ in zend_do_bind_traits() argument
1677 if (ce->num_traits <= 0) { in zend_do_bind_traits()
1682 zend_traits_init_trait_structures(ce); in zend_do_bind_traits()
1685 zend_do_traits_method_binding(ce); in zend_do_bind_traits()
1688 zend_do_check_for_inconsistent_traits_aliasing(ce); in zend_do_bind_traits()
1691 zend_do_traits_property_binding(ce); in zend_do_bind_traits()
1694 zend_verify_abstract_class(ce); in zend_do_bind_traits()
1697 zend_check_deprecated_constructor(ce); in zend_do_bind_traits()
1700 if (ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { in zend_do_bind_traits()
1701 ce->ce_flags -= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in zend_do_bind_traits()
1707 static zend_bool zend_has_deprecated_constructor(const zend_class_entry *ce) /* {{{ */ in zend_has_deprecated_constructor() argument
1710 if (!ce->constructor) { in zend_has_deprecated_constructor()
1713 constructor_name = ce->constructor->common.function_name; in zend_has_deprecated_constructor()
1715 ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), in zend_has_deprecated_constructor()
1721 void zend_check_deprecated_constructor(const zend_class_entry *ce) /* {{{ */ in zend_check_deprecated_constructor() argument
1723 if (zend_has_deprecated_constructor(ce)) { in zend_check_deprecated_constructor()
1724 … be constructors in a future version of PHP; %s has a deprecated constructor", ZSTR_VAL(ce->name)); in zend_check_deprecated_constructor()