Lines Matching refs:ce

30 static void add_dependency_obligation(zend_class_entry *ce, zend_class_entry *dependency_ce);
32 zend_class_entry *ce, const zend_function *child_fn, zend_class_entry *child_scope,
35 zend_class_entry *ce, const zend_property_info *child_prop,
68 static zend_function *zend_duplicate_internal_function(zend_function *func, zend_class_entry *ce) /… in zend_duplicate_internal_function() argument
72 if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { in zend_duplicate_internal_function()
114 …d_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce, zend_bool is_interf… in zend_duplicate_function() argument
117 return zend_duplicate_internal_function(func, ce); in zend_duplicate_function()
135 static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */ in do_inherit_parent_constructor() argument
137 zend_class_entry *parent = ce->parent; in do_inherit_parent_constructor()
142 ce->create_object = parent->create_object; in do_inherit_parent_constructor()
145 if (EXPECTED(!ce->get_iterator)) { in do_inherit_parent_constructor()
146 ce->get_iterator = parent->get_iterator; in do_inherit_parent_constructor()
148 if (EXPECTED(!ce->__get)) { in do_inherit_parent_constructor()
149 ce->__get = parent->__get; in do_inherit_parent_constructor()
151 if (EXPECTED(!ce->__set)) { in do_inherit_parent_constructor()
152 ce->__set = parent->__set; in do_inherit_parent_constructor()
154 if (EXPECTED(!ce->__unset)) { in do_inherit_parent_constructor()
155 ce->__unset = parent->__unset; in do_inherit_parent_constructor()
157 if (EXPECTED(!ce->__isset)) { in do_inherit_parent_constructor()
158 ce->__isset = parent->__isset; in do_inherit_parent_constructor()
160 if (EXPECTED(!ce->__call)) { in do_inherit_parent_constructor()
161 ce->__call = parent->__call; in do_inherit_parent_constructor()
163 if (EXPECTED(!ce->__callstatic)) { in do_inherit_parent_constructor()
164 ce->__callstatic = parent->__callstatic; in do_inherit_parent_constructor()
166 if (EXPECTED(!ce->__tostring)) { in do_inherit_parent_constructor()
167 ce->__tostring = parent->__tostring; in do_inherit_parent_constructor()
169 if (EXPECTED(!ce->clone)) { in do_inherit_parent_constructor()
170 ce->clone = parent->clone; in do_inherit_parent_constructor()
172 if (EXPECTED(!ce->__serialize)) { in do_inherit_parent_constructor()
173 ce->__serialize = parent->__serialize; in do_inherit_parent_constructor()
175 if (EXPECTED(!ce->__unserialize)) { in do_inherit_parent_constructor()
176 ce->__unserialize = parent->__unserialize; in do_inherit_parent_constructor()
178 if (EXPECTED(!ce->serialize)) { in do_inherit_parent_constructor()
179 ce->serialize = parent->serialize; in do_inherit_parent_constructor()
181 if (EXPECTED(!ce->unserialize)) { in do_inherit_parent_constructor()
182 ce->unserialize = parent->unserialize; in do_inherit_parent_constructor()
184 if (!ce->destructor) { in do_inherit_parent_constructor()
185 ce->destructor = parent->destructor; in do_inherit_parent_constructor()
187 if (EXPECTED(!ce->__debugInfo)) { in do_inherit_parent_constructor()
188 ce->__debugInfo = parent->__debugInfo; in do_inherit_parent_constructor()
191 if (ce->constructor) { in do_inherit_parent_constructor()
195 ZSTR_VAL(ce->name), ZSTR_VAL(ce->constructor->common.function_name)); in do_inherit_parent_constructor()
200 ce->constructor = parent->constructor; in do_inherit_parent_constructor()
232 static zend_bool class_visible(zend_class_entry *ce) { in class_visible() argument
233 if (ce->type == ZEND_INTERNAL_CLASS) { in class_visible()
236 ZEND_ASSERT(ce->type == ZEND_USER_CLASS); in class_visible()
238 || ce->info.user.filename == CG(compiled_filename); in class_visible()
245 zend_class_entry *ce = zend_lookup_class_ex(name, NULL, flags); in lookup_class() local
247 if (ce) { in lookup_class()
248 return ce; in lookup_class()
260 if (ce && class_visible(ce)) { in lookup_class()
261 return ce; in lookup_class()
311 zend_class_entry *ce = zend_lookup_class_ex( in unlinked_instanceof() local
315 if (ce && ce != ce1 && unlinked_instanceof(ce, ce2)) { in unlinked_instanceof()
353 zend_class_entry *ce = lookup_class(self, name, /* register_unresolved */ 0); in zend_type_permits_self() local
354 if (ce && unlinked_instanceof(self, ce)) { in zend_type_permits_self()
823 zend_class_entry *ce, in perform_delayable_implementation_check() argument
831 add_compatibility_obligation(ce, fe, fe_scope, proto, proto_scope); in perform_delayable_implementation_check()
842 zend_class_entry *ce, zval *child_zv, in do_inheritance_check_on_method_ex() argument
912 if (child->common.scope != ce in do_inheritance_check_on_method_ex()
915 if (ce->ce_flags & ZEND_ACC_INTERFACE) { in do_inheritance_check_on_method_ex()
944 perform_delayable_implementation_check(ce, child, child_scope, parent, parent_scope); in do_inheritance_check_on_method_ex()
953 zend_class_entry *ce, zval *child_zv, zend_bool check_visibility) in do_inheritance_check_on_method() argument
955 …do_inheritance_check_on_method_ex(child, child_scope, parent, parent_scope, ce, child_zv, check_vi… in do_inheritance_check_on_method()
958 …_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce, zend_bool is_interf… in do_inherit_method() argument
960 zval *child = zend_hash_find_ex(&ce->function_table, key, 1); in do_inherit_method()
972 func, func->common.scope, parent, parent->common.scope, ce, child, in do_inherit_method()
976 func, func->common.scope, parent, parent->common.scope, ce, child, in do_inherit_method()
982 ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in do_inherit_method()
985 parent = zend_duplicate_function(parent, ce, is_interface); in do_inherit_method()
988 _zend_hash_append_ptr(&ce->function_table, key, parent); in do_inherit_method()
990 zend_hash_add_new_ptr(&ce->function_table, key, parent); in do_inherit_method()
1009 child_info->ce, child_info->type, parent_info->ce, parent_info->type); in property_types_compatible()
1011 parent_info->ce, parent_info->type, child_info->ce, child_info->type); in property_types_compatible()
1024 zend_string *type_str = zend_type_to_string_resolved(parent->type, parent->ce); in emit_incompatible_property_error()
1027 ZSTR_VAL(child->ce->name), in emit_incompatible_property_error()
1030 ZSTR_VAL(parent->ce->name)); in emit_incompatible_property_error()
1033 …inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ in do_inherit_property() argument
1035 zval *child = zend_hash_find_ex(&ce->properties_info, key, 1); in do_inherit_property()
1046 …(parent_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ZSTR_VAL(parent_info->ce->name… in do_inherit_property()
1047 …(child_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ZSTR_VAL(ce->name), ZSTR_VAL(ke… in do_inherit_property()
1051 …as in class %s)%s", ZSTR_VAL(ce->name), ZSTR_VAL(key), zend_visibility_string(parent_info->flags),… in do_inherit_property()
1057 zval_ptr_dtor_nogc(&(ce->default_properties_table[parent_num])); in do_inherit_property()
1058 ce->default_properties_table[parent_num] = ce->default_properties_table[child_num]; in do_inherit_property()
1059 ZVAL_UNDEF(&ce->default_properties_table[child_num]); in do_inherit_property()
1069 add_property_compatibility_obligation(ce, child_info, parent_info); in do_inherit_property()
1074 ZSTR_VAL(ce->name), in do_inherit_property()
1076 ZSTR_VAL(parent_info->ce->name)); in do_inherit_property()
1080 if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { in do_inherit_property()
1085 _zend_hash_append_ptr(&ce->properties_info, key, child_info); in do_inherit_property()
1090 static inline void do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ in do_implement_interface() argument
1092 …if (!(ce->ce_flags & ZEND_ACC_INTERFACE) && iface->interface_gets_implemented && iface->interface_… in do_implement_interface()
1093 …zend_error_noreturn(E_CORE_ERROR, "Class %s could not implement interface %s", ZSTR_VAL(ce->name),… in do_implement_interface()
1096 ZEND_ASSERT(ce != iface); in do_implement_interface()
1100 static void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_entry *iface) /* {{{ … in zend_do_inherit_interfaces() argument
1106 ce_num = ce->num_interfaces; in zend_do_inherit_interfaces()
1108 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_inherit_interfaces()
1109ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_nu… in zend_do_inherit_interfaces()
1111ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_n… in zend_do_inherit_interfaces()
1118 if (ce->interfaces[i] == entry) { in zend_do_inherit_interfaces()
1123 ce->interfaces[ce->num_interfaces++] = entry; in zend_do_inherit_interfaces()
1126 ce->ce_flags |= ZEND_ACC_RESOLVED_INTERFACES; in zend_do_inherit_interfaces()
1129 while (ce_num < ce->num_interfaces) { in zend_do_inherit_interfaces()
1130 do_implement_interface(ce, ce->interfaces[ce_num++]); in zend_do_inherit_interfaces()
1135 …lass_constant(zend_string *name, zend_class_constant *parent_const, zend_class_entry *ce) /* {{{ */ in do_inherit_class_constant() argument
1137 zval *zv = zend_hash_find_ex(&ce->constants_table, name, 1); in do_inherit_class_constant()
1144 …ZSTR_VAL(ce->name), ZSTR_VAL(name), zend_visibility_string(Z_ACCESS_FLAGS(parent_const->value)), Z… in do_inherit_class_constant()
1148 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in do_inherit_class_constant()
1150 if (ce->type & ZEND_INTERNAL_CLASS) { in do_inherit_class_constant()
1155 _zend_hash_append_ptr(&ce->constants_table, name, parent_const); in do_inherit_class_constant()
1160 void zend_build_properties_info_table(zend_class_entry *ce) in zend_build_properties_info_table() argument
1164 if (ce->default_properties_count == 0) { in zend_build_properties_info_table()
1168 ZEND_ASSERT(ce->properties_info_table == NULL); in zend_build_properties_info_table()
1169 size = sizeof(zend_property_info *) * ce->default_properties_count; in zend_build_properties_info_table()
1170 if (ce->type == ZEND_USER_CLASS) { in zend_build_properties_info_table()
1171 ce->properties_info_table = table = zend_arena_alloc(&CG(arena), size); in zend_build_properties_info_table()
1173 ce->properties_info_table = table = pemalloc(size, 1); in zend_build_properties_info_table()
1179 if (ce->parent && ce->parent->default_properties_count != 0) { in zend_build_properties_info_table()
1180 zend_property_info **parent_table = ce->parent->properties_info_table; in zend_build_properties_info_table()
1183 sizeof(zend_property_info *) * ce->parent->default_properties_count in zend_build_properties_info_table()
1187 if (ce->default_properties_count == ce->parent->default_properties_count) { in zend_build_properties_info_table()
1192 ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { in zend_build_properties_info_table()
1193 if (prop->ce == ce && (prop->flags & ZEND_ACC_STATIC) == 0) { in zend_build_properties_info_table()
1199 ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *parent_ce, zend_bool c… in zend_do_inheritance_ex() argument
1205 if (UNEXPECTED(ce->ce_flags & ZEND_ACC_INTERFACE)) { in zend_do_inheritance_ex()
1208 …zend_error_noreturn(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ZSTR_VAL(ce->… in zend_do_inheritance_ex()
1213 …zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ZSTR_VAL(ce->name… in zend_do_inheritance_ex()
1215 …zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ZSTR_VAL(ce->name), Z… in zend_do_inheritance_ex()
1220 …_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ZSTR_VAL(ce->name), ZSTR_VAL(par… in zend_do_inheritance_ex()
1224 if (ce->parent_name) { in zend_do_inheritance_ex()
1225 zend_string_release_ex(ce->parent_name, 0); in zend_do_inheritance_ex()
1227 ce->parent = parent_ce; in zend_do_inheritance_ex()
1228 ce->ce_flags |= ZEND_ACC_RESOLVED_PARENT; in zend_do_inheritance_ex()
1234 if (ce->default_properties_count) { in zend_do_inheritance_ex()
1235 …zval *table = pemalloc(sizeof(zval) * (ce->default_properties_count + parent_ce->default_propertie… in zend_do_inheritance_ex()
1236 src = ce->default_properties_table + ce->default_properties_count; in zend_do_inheritance_ex()
1238 dst = end + ce->default_properties_count; in zend_do_inheritance_ex()
1239 ce->default_properties_table = table; in zend_do_inheritance_ex()
1245 pefree(src, ce->type == ZEND_INTERNAL_CLASS); in zend_do_inheritance_ex()
1246 end = ce->default_properties_table; in zend_do_inheritance_ex()
1248 …end = pemalloc(sizeof(zval) * parent_ce->default_properties_count, ce->type == ZEND_INTERNAL_CLASS… in zend_do_inheritance_ex()
1250 ce->default_properties_table = end; in zend_do_inheritance_ex()
1253 if (UNEXPECTED(parent_ce->type != ce->type)) { in zend_do_inheritance_ex()
1260 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance_ex()
1270 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance_ex()
1275 ce->default_properties_count += parent_ce->default_properties_count; in zend_do_inheritance_ex()
1281 if (ce->default_static_members_count) { in zend_do_inheritance_ex()
1282 …al *table = pemalloc(sizeof(zval) * (ce->default_static_members_count + parent_ce->default_static_… in zend_do_inheritance_ex()
1283 src = ce->default_static_members_table + ce->default_static_members_count; in zend_do_inheritance_ex()
1285 dst = end + ce->default_static_members_count; in zend_do_inheritance_ex()
1286 ce->default_static_members_table = table; in zend_do_inheritance_ex()
1292 pefree(src, ce->type == ZEND_INTERNAL_CLASS); in zend_do_inheritance_ex()
1293 end = ce->default_static_members_table; in zend_do_inheritance_ex()
1295 …end = pemalloc(sizeof(zval) * parent_ce->default_static_members_count, ce->type == ZEND_INTERNAL_C… in zend_do_inheritance_ex()
1297 ce->default_static_members_table = end; in zend_do_inheritance_ex()
1299 if (UNEXPECTED(parent_ce->type != ce->type)) { in zend_do_inheritance_ex()
1317 } else if (ce->type == ZEND_USER_CLASS) { in zend_do_inheritance_ex()
1332 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance_ex()
1347 ce->default_static_members_count += parent_ce->default_static_members_count; in zend_do_inheritance_ex()
1348 if (!ZEND_MAP_PTR(ce->static_members_table)) { in zend_do_inheritance_ex()
1349 ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS); in zend_do_inheritance_ex()
1351 ZEND_MAP_PTR_NEW(ce->static_members_table); in zend_do_inheritance_ex()
1354 ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table); in zend_do_inheritance_ex()
1359 ZEND_HASH_FOREACH_PTR(&ce->properties_info, property_info) { in zend_do_inheritance_ex()
1360 if (property_info->ce == ce) { in zend_do_inheritance_ex()
1370 zend_hash_extend(&ce->properties_info, in zend_do_inheritance_ex()
1371 zend_hash_num_elements(&ce->properties_info) + in zend_do_inheritance_ex()
1375 do_inherit_property(property_info, key, ce); in zend_do_inheritance_ex()
1382 zend_hash_extend(&ce->constants_table, in zend_do_inheritance_ex()
1383 zend_hash_num_elements(&ce->constants_table) + in zend_do_inheritance_ex()
1387 do_inherit_class_constant(key, c, ce); in zend_do_inheritance_ex()
1392 zend_hash_extend(&ce->function_table, in zend_do_inheritance_ex()
1393 zend_hash_num_elements(&ce->function_table) + in zend_do_inheritance_ex()
1398 do_inherit_method(key, func, ce, 0, 1); in zend_do_inheritance_ex()
1402 do_inherit_method(key, func, ce, 0, 0); in zend_do_inheritance_ex()
1407 do_inherit_parent_constructor(ce); in zend_do_inheritance_ex()
1409 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_inheritance_ex()
1411 zend_do_inherit_interfaces(ce, parent_ce); in zend_do_inheritance_ex()
1414 if (ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { in zend_do_inheritance_ex()
1415 ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; in zend_do_inheritance_ex()
1418ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_HAS_TYPE_HINTS | ZEND… in zend_do_inheritance_ex()
1429 if (old_constant->ce != parent_constant->ce) { in do_inherit_constant_check()
1438 …face_constant(zend_string *name, zend_class_constant *c, zend_class_entry *ce, zend_class_entry *i… in do_inherit_iface_constant() argument
1440 if (do_inherit_constant_check(&ce->constants_table, c, name, iface)) { in do_inherit_iface_constant()
1443 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in do_inherit_iface_constant()
1445 if (ce->type & ZEND_INTERNAL_CLASS) { in do_inherit_iface_constant()
1450 zend_hash_update_ptr(&ce->constants_table, name, c); in do_inherit_iface_constant()
1455 static void do_interface_implementation(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ in do_interface_implementation() argument
1462 do_inherit_iface_constant(key, c, ce, iface); in do_interface_implementation()
1466 do_inherit_method(key, func, ce, 1, 0); in do_interface_implementation()
1469 do_implement_interface(ce, iface); in do_interface_implementation()
1471 zend_do_inherit_interfaces(ce, iface); in do_interface_implementation()
1476 ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ in zend_do_implement_interface() argument
1479 uint32_t current_iface_num = ce->num_interfaces; in zend_do_implement_interface()
1480 uint32_t parent_iface_num = ce->parent ? ce->parent->num_interfaces : 0; in zend_do_implement_interface()
1484 ZEND_ASSERT(ce->ce_flags & ZEND_ACC_LINKED); in zend_do_implement_interface()
1486 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_implement_interface()
1487 if (ce->interfaces[i] == NULL) { in zend_do_implement_interface()
1488 …memmove(ce->interfaces + i, ce->interfaces + i + 1, sizeof(zend_class_entry*) * (--ce->num_interfa… in zend_do_implement_interface()
1490 } else if (ce->interfaces[i] == iface) { in zend_do_implement_interface()
1494 … "Class %s cannot implement previously implemented interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(ifa… in zend_do_implement_interface()
1500 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) { in zend_do_implement_interface()
1504 if (ce->num_interfaces >= current_iface_num) { in zend_do_implement_interface()
1505 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_implement_interface()
1506ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++cur… in zend_do_implement_interface()
1508ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (++cu… in zend_do_implement_interface()
1511 ce->interfaces[ce->num_interfaces++] = iface; in zend_do_implement_interface()
1513 do_interface_implementation(ce, iface); in zend_do_implement_interface()
1518 static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry **interfaces) /* {{… in zend_do_implement_interfaces() argument
1521 uint32_t num_parent_interfaces = ce->parent ? ce->parent->num_interfaces : 0; in zend_do_implement_interfaces()
1527 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_implement_interfaces()
1530 add_dependency_obligation(ce, iface); in zend_do_implement_interfaces()
1534 …zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ZSTR_VAL(ce->name)… in zend_do_implement_interfaces()
1541 … "Class %s cannot implement previously implemented interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(ifa… in zend_do_implement_interfaces()
1545 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) { in zend_do_implement_interfaces()
1559 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_implement_interfaces()
1560 zend_string_release_ex(ce->interface_names[i].name, 0); in zend_do_implement_interfaces()
1561 zend_string_release_ex(ce->interface_names[i].lc_name, 0); in zend_do_implement_interfaces()
1563 efree(ce->interface_names); in zend_do_implement_interfaces()
1565 ce->num_interfaces = num_interfaces; in zend_do_implement_interfaces()
1566 ce->interfaces = interfaces; in zend_do_implement_interfaces()
1567 ce->ce_flags |= ZEND_ACC_RESOLVED_INTERFACES; in zend_do_implement_interfaces()
1570 do_implement_interface(ce, ce->interfaces[i]); in zend_do_implement_interfaces()
1575 do_interface_implementation(ce, ce->interfaces[i]); in zend_do_implement_interfaces()
1580 static zend_class_entry *fixup_trait_scope(const zend_function *fn, zend_class_entry *ce) in fixup_trait_scope() argument
1583 return fn->common.scope->ce_flags & ZEND_ACC_TRAIT ? ce : fn->common.scope; in fixup_trait_scope()
1586 static void zend_add_trait_method(zend_class_entry *ce, zend_string *name, zend_string *key, zend_f… in zend_add_trait_method() argument
1591 if ((existing_fn = zend_hash_find_ptr(&ce->function_table, key)) != NULL) { in zend_add_trait_method()
1608 existing_fn, fixup_trait_scope(existing_fn, ce), fn, fixup_trait_scope(fn, ce), in zend_add_trait_method()
1609 ce, NULL, /* check_visibility */ 0); in zend_add_trait_method()
1613 if (existing_fn->common.scope == ce) { in zend_add_trait_method()
1621 ZSTR_VAL(ce->name), ZSTR_VAL(name), in zend_add_trait_method()
1627 fn, fixup_trait_scope(fn, ce), existing_fn, fixup_trait_scope(existing_fn, ce), in zend_add_trait_method()
1628 ce, NULL, /* check_visibility */ 1); in zend_add_trait_method()
1646 fn = zend_hash_update_ptr(&ce->function_table, key, new_fn); in zend_add_trait_method()
1647 zend_add_magic_method(ce, fn, key); in zend_add_trait_method()
1651 static void zend_fixup_trait_method(zend_function *fn, zend_class_entry *ce) /* {{{ */ in zend_fixup_trait_method() argument
1655 fn->common.scope = ce; in zend_fixup_trait_method()
1658 ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in zend_fixup_trait_method()
1661 ce->ce_flags |= ZEND_HAS_STATIC_IN_METHODS; in zend_fixup_trait_method()
1667 static void zend_traits_copy_functions(zend_string *fnname, zend_function *fn, zend_class_entry *ce in zend_traits_copy_functions() argument
1675 if (ce->trait_aliases) { in zend_traits_copy_functions()
1676 alias_ptr = ce->trait_aliases; in zend_traits_copy_functions()
1693 zend_add_trait_method(ce, alias->alias, lcname, &fn_copy); in zend_traits_copy_functions()
1707 if (ce->trait_aliases) { in zend_traits_copy_functions()
1708 alias_ptr = ce->trait_aliases; in zend_traits_copy_functions()
1725 zend_add_trait_method(ce, fn->common.function_name, fnname, &fn_copy); in zend_traits_copy_functions()
1730 static uint32_t zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait, zend_class_en… in zend_check_trait_usage() argument
1739 for (i = 0; i < ce->num_traits; i++) { in zend_check_trait_usage()
1744 …_COMPILE_ERROR, "Required Trait %s wasn't added to %s", ZSTR_VAL(trait->name), ZSTR_VAL(ce->name)); in zend_check_trait_usage()
1749 static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_entry **traits, Hash… in zend_traits_init_trait_structures() argument
1761 if (ce->trait_precedences) { in zend_traits_init_trait_structures()
1762 exclude_tables = ecalloc(ce->num_traits, sizeof(HashTable*)); in zend_traits_init_trait_structures()
1764 precedences = ce->trait_precedences; in zend_traits_init_trait_structures()
1765 ce->trait_precedences = NULL; in zend_traits_init_trait_structures()
1774 zend_check_trait_usage(ce, trait, traits); in zend_traits_init_trait_structures()
1800 trait_num = zend_check_trait_usage(ce, exclude_ce, traits); in zend_traits_init_trait_structures()
1823 ce->trait_precedences = precedences; in zend_traits_init_trait_structures()
1826 if (ce->trait_aliases) { in zend_traits_init_trait_structures()
1828 while (ce->trait_aliases[i]) { in zend_traits_init_trait_structures()
1833 while (ce->trait_aliases[i]) { in zend_traits_init_trait_structures()
1834 zend_trait_alias *cur_alias = ce->trait_aliases[i]; in zend_traits_init_trait_structures()
1835 cur_method_ref = &ce->trait_aliases[i]->trait_method; in zend_traits_init_trait_structures()
1843 zend_check_trait_usage(ce, trait, traits); in zend_traits_init_trait_structures()
1853 for (j = 0; j < ce->num_traits; j++) { in zend_traits_init_trait_structures()
1900 static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry **traits, HashTabl… in zend_do_traits_method_binding() argument
1907 for (i = 0; i < ce->num_traits; i++) { in zend_do_traits_method_binding()
1911 zend_traits_copy_functions(key, fn, ce, exclude_tables[i], aliases); in zend_do_traits_method_binding()
1922 for (i = 0; i < ce->num_traits; i++) { in zend_do_traits_method_binding()
1925 zend_traits_copy_functions(key, fn, ce, NULL, aliases); in zend_do_traits_method_binding()
1931 ZEND_HASH_FOREACH_PTR(&ce->function_table, fn) { in zend_do_traits_method_binding()
1932 zend_fixup_trait_method(fn, ce); in zend_do_traits_method_binding()
1937 static zend_class_entry* find_first_definition(zend_class_entry *ce, zend_class_entry **traits, siz… in find_first_definition() argument
1941 if (coliding_ce == ce) { in find_first_definition()
1954 static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{… in zend_do_traits_property_binding() argument
1972 for (i = 0; i < ce->num_traits; i++) { in zend_do_traits_property_binding()
1994 if ((coliding_prop = zend_hash_find_ptr(&ce->properties_info, prop_name)) != NULL) { in zend_do_traits_property_binding()
1995 if ((coliding_prop->flags & ZEND_ACC_PRIVATE) && coliding_prop->ce != ce) { in zend_do_traits_property_binding()
1996 zend_hash_del(&ce->properties_info, prop_name); in zend_do_traits_property_binding()
2010 op1 = &ce->default_static_members_table[coliding_prop->offset]; in zend_do_traits_property_binding()
2015 op1 = &ce->default_properties_table[OBJ_PROP_TO_NUM(coliding_prop->offset)]; in zend_do_traits_property_binding()
2022 zval_update_constant_ex(&op1_tmp, ce); in zend_do_traits_property_binding()
2027 zval_update_constant_ex(&op2_tmp, ce); in zend_do_traits_property_binding()
2044 ZSTR_VAL(find_first_definition(ce, traits, i, prop_name, coliding_prop->ce)->name), in zend_do_traits_property_binding()
2045 ZSTR_VAL(property_info->ce->name), in zend_do_traits_property_binding()
2047 ZSTR_VAL(ce->name)); in zend_do_traits_property_binding()
2068 new_prop = zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, type); in zend_do_traits_property_binding()
2084 static void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */ in zend_do_bind_traits() argument
2091 ZEND_ASSERT(ce->num_traits > 0); in zend_do_bind_traits()
2093 traits = emalloc(sizeof(zend_class_entry*) * ce->num_traits); in zend_do_bind_traits()
2095 for (i = 0; i < ce->num_traits; i++) { in zend_do_bind_traits()
2096 trait = zend_fetch_class_by_name(ce->trait_names[i].name, in zend_do_bind_traits()
2097 ce->trait_names[i].lc_name, ZEND_FETCH_CLASS_TRAIT); in zend_do_bind_traits()
2102 …zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(… in zend_do_bind_traits()
2116 zend_traits_init_trait_structures(ce, traits, &exclude_tables, &aliases); in zend_do_bind_traits()
2119 zend_do_traits_method_binding(ce, traits, exclude_tables, aliases); in zend_do_bind_traits()
2130 zend_do_traits_property_binding(ce, traits); in zend_do_bind_traits()
2168 void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */ in zend_verify_abstract_class() argument
2172 zend_bool is_explicit_abstract = (ce->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) != 0; in zend_verify_abstract_class()
2175 ZEND_HASH_FOREACH_PTR(&ce->function_table, func) { in zend_verify_abstract_class()
2189 ZSTR_VAL(ce->name), ai.cnt, in zend_verify_abstract_class()
2197 ce->ce_flags &= ~ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in zend_verify_abstract_class()
2234 static HashTable *get_or_init_obligations_for_class(zend_class_entry *ce) { in get_or_init_obligations_for_class() argument
2242 key = (zend_ulong) (uintptr_t) ce; in get_or_init_obligations_for_class()
2251 ce->ce_flags |= ZEND_ACC_UNRESOLVED_VARIANCE; in get_or_init_obligations_for_class()
2255 static void add_dependency_obligation(zend_class_entry *ce, zend_class_entry *dependency_ce) { in add_dependency_obligation() argument
2256 HashTable *obligations = get_or_init_obligations_for_class(ce); in add_dependency_obligation()
2264 zend_class_entry *ce, in add_compatibility_obligation() argument
2267 HashTable *obligations = get_or_init_obligations_for_class(ce); in add_compatibility_obligation()
2287 zend_class_entry *ce, const zend_property_info *child_prop, in add_property_compatibility_obligation() argument
2289 HashTable *obligations = get_or_init_obligations_for_class(ce); in add_property_compatibility_obligation()
2297 static void resolve_delayed_variance_obligations(zend_class_entry *ce);
2360 static void resolve_delayed_variance_obligations(zend_class_entry *ce) { in resolve_delayed_variance_obligations() argument
2362 zend_ulong num_key = (zend_ulong) (uintptr_t) ce; in resolve_delayed_variance_obligations()
2370 ce->ce_flags &= ~ZEND_ACC_UNRESOLVED_VARIANCE; in resolve_delayed_variance_obligations()
2371 ce->ce_flags |= ZEND_ACC_LINKED; in resolve_delayed_variance_obligations()
2376 static void report_variance_errors(zend_class_entry *ce) { in report_variance_errors() argument
2379 zend_ulong num_key = (zend_ulong) (uintptr_t) ce; in report_variance_errors()
2405 ce->ce_flags &= ~ZEND_ACC_UNRESOLVED_VARIANCE; in report_variance_errors()
2406 ce->ce_flags |= ZEND_ACC_LINKED; in report_variance_errors()
2410 static void check_unrecoverable_load_failure(zend_class_entry *ce) { in check_unrecoverable_load_failure() argument
2415 if (ce->ce_flags & ZEND_ACC_HAS_UNLINKED_USES) { in check_unrecoverable_load_failure()
2423 …"During inheritance of %s with variance dependencies: Uncaught %s", ZSTR_VAL(ce->name), ZSTR_VAL(e… in check_unrecoverable_load_failure()
2427 ZEND_API zend_result zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name) /* {{{ */ in zend_do_link_class() argument
2435 if (ce->parent_name) { in zend_do_link_class()
2437 ce->parent_name, lc_parent_name, in zend_do_link_class()
2440 check_unrecoverable_load_failure(ce); in zend_do_link_class()
2445 if (ce->num_interfaces) { in zend_do_link_class()
2449 sizeof(zend_class_entry *) * (ce->num_interfaces + num_parent_interfaces)); in zend_do_link_class()
2454 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_link_class()
2456 ce->interface_names[i].name, ce->interface_names[i].lc_name, in zend_do_link_class()
2460 check_unrecoverable_load_failure(ce); in zend_do_link_class()
2470 add_dependency_obligation(ce, parent); in zend_do_link_class()
2472 zend_do_inheritance(ce, parent); in zend_do_link_class()
2474 if (ce->num_traits) { in zend_do_link_class()
2475 zend_do_bind_traits(ce); in zend_do_link_class()
2478 zend_do_implement_interfaces(ce, interfaces); in zend_do_link_class()
2480 zend_do_inherit_interfaces(ce, parent); in zend_do_link_class()
2482 if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT)) in zend_do_link_class()
2483 && (ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) in zend_do_link_class()
2485 zend_verify_abstract_class(ce); in zend_do_link_class()
2490 if (ce->__tostring && !(ce->ce_flags & ZEND_ACC_TRAIT) in zend_do_link_class()
2491 && !zend_class_implements_interface(ce, zend_ce_stringable)) { in zend_do_link_class()
2492 ZEND_ASSERT(ce->__tostring->common.fn_flags & ZEND_ACC_TRAIT_CLONE); in zend_do_link_class()
2493 ce->ce_flags |= ZEND_ACC_RESOLVED_INTERFACES; in zend_do_link_class()
2494 ce->num_interfaces++; in zend_do_link_class()
2495 ce->interfaces = perealloc(ce->interfaces, in zend_do_link_class()
2496 sizeof(zend_class_entry *) * ce->num_interfaces, ce->type == ZEND_INTERNAL_CLASS); in zend_do_link_class()
2497 ce->interfaces[ce->num_interfaces - 1] = zend_ce_stringable; in zend_do_link_class()
2498 do_interface_implementation(ce, zend_ce_stringable); in zend_do_link_class()
2501 zend_build_properties_info_table(ce); in zend_do_link_class()
2503 if (!(ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE)) { in zend_do_link_class()
2504 ce->ce_flags |= ZEND_ACC_LINKED; in zend_do_link_class()
2508 ce->ce_flags |= ZEND_ACC_NEARLY_LINKED; in zend_do_link_class()
2510 if (ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE) { in zend_do_link_class()
2511 resolve_delayed_variance_obligations(ce); in zend_do_link_class()
2512 if (!(ce->ce_flags & ZEND_ACC_LINKED)) { in zend_do_link_class()
2513 report_variance_errors(ce); in zend_do_link_class()
2522 static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce) /*… in zend_can_early_bind() argument
2529 zval *zv = zend_hash_find_ex(&ce->function_table, key, 1); in zend_can_early_bind()
2536 ce, NULL, /* check_visibility */ 1, 1, 0); in zend_can_early_bind()
2550 zv = zend_hash_find_ex(&ce->properties_info, key, 1); in zend_can_early_bind()
2566 zend_bool zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcnam… in zend_try_early_bind() argument
2568 inheritance_status status = zend_can_early_bind(ce, parent_ce); in zend_try_early_bind()
2573 … declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name)); in zend_try_early_bind()
2577 if (UNEXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) == NULL)) { in zend_try_early_bind()
2581 zend_do_inheritance_ex(ce, parent_ce, status == INHERITANCE_SUCCESS); in zend_try_early_bind()
2583 zend_do_inherit_interfaces(ce, parent_ce); in zend_try_early_bind()
2585 zend_build_properties_info_table(ce); in zend_try_early_bind()
2586 …if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_E… in zend_try_early_bind()
2587 zend_verify_abstract_class(ce); in zend_try_early_bind()
2589 ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE)); in zend_try_early_bind()
2590 ce->ce_flags |= ZEND_ACC_LINKED; in zend_try_early_bind()