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, const zend_function *parent_fn,
35 zend_class_entry *ce, const zend_property_info *child_prop,
57 static zend_function *zend_duplicate_internal_function(zend_function *func, zend_class_entry *ce) /… in zend_duplicate_internal_function() argument
61 if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { in zend_duplicate_internal_function()
101 …d_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce, zend_bool is_interf… in zend_duplicate_function() argument
104 return zend_duplicate_internal_function(func, ce); in zend_duplicate_function()
119 static void do_inherit_parent_constructor(zend_class_entry *ce) /* {{{ */ in do_inherit_parent_constructor() argument
121 zend_class_entry *parent = ce->parent; in do_inherit_parent_constructor()
126 ce->create_object = parent->create_object; in do_inherit_parent_constructor()
129 if (EXPECTED(!ce->get_iterator)) { in do_inherit_parent_constructor()
130 ce->get_iterator = parent->get_iterator; in do_inherit_parent_constructor()
134 ZEND_ASSERT(ce->iterator_funcs_ptr); in do_inherit_parent_constructor()
136 if (EXPECTED(!ce->__get)) { in do_inherit_parent_constructor()
137 ce->__get = parent->__get; in do_inherit_parent_constructor()
139 if (EXPECTED(!ce->__set)) { in do_inherit_parent_constructor()
140 ce->__set = parent->__set; in do_inherit_parent_constructor()
142 if (EXPECTED(!ce->__unset)) { in do_inherit_parent_constructor()
143 ce->__unset = parent->__unset; in do_inherit_parent_constructor()
145 if (EXPECTED(!ce->__isset)) { in do_inherit_parent_constructor()
146 ce->__isset = parent->__isset; in do_inherit_parent_constructor()
148 if (EXPECTED(!ce->__call)) { in do_inherit_parent_constructor()
149 ce->__call = parent->__call; in do_inherit_parent_constructor()
151 if (EXPECTED(!ce->__callstatic)) { in do_inherit_parent_constructor()
152 ce->__callstatic = parent->__callstatic; in do_inherit_parent_constructor()
154 if (EXPECTED(!ce->__tostring)) { in do_inherit_parent_constructor()
155 ce->__tostring = parent->__tostring; in do_inherit_parent_constructor()
157 if (EXPECTED(!ce->clone)) { in do_inherit_parent_constructor()
158 ce->clone = parent->clone; in do_inherit_parent_constructor()
160 if (EXPECTED(!ce->serialize_func)) { in do_inherit_parent_constructor()
161 ce->serialize_func = parent->serialize_func; in do_inherit_parent_constructor()
163 if (EXPECTED(!ce->serialize)) { in do_inherit_parent_constructor()
164 ce->serialize = parent->serialize; in do_inherit_parent_constructor()
166 if (EXPECTED(!ce->unserialize_func)) { in do_inherit_parent_constructor()
167 ce->unserialize_func = parent->unserialize_func; in do_inherit_parent_constructor()
169 if (EXPECTED(!ce->unserialize)) { in do_inherit_parent_constructor()
170 ce->unserialize = parent->unserialize; in do_inherit_parent_constructor()
172 if (!ce->destructor) { in do_inherit_parent_constructor()
173 ce->destructor = parent->destructor; in do_inherit_parent_constructor()
175 if (EXPECTED(!ce->__debugInfo)) { in do_inherit_parent_constructor()
176 ce->__debugInfo = parent->__debugInfo; in do_inherit_parent_constructor()
179 if (ce->constructor) { in do_inherit_parent_constructor()
183 ZSTR_VAL(ce->name), ZSTR_VAL(ce->constructor->common.function_name)); in do_inherit_parent_constructor()
188 ce->constructor = parent->constructor; in do_inherit_parent_constructor()
220 static zend_bool class_visible(zend_class_entry *ce) { in class_visible() argument
221 if (ce->type == ZEND_INTERNAL_CLASS) { in class_visible()
224 ZEND_ASSERT(ce->type == ZEND_USER_CLASS); in class_visible()
226 || ce->info.user.filename == CG(compiled_filename); in class_visible()
231 zend_class_entry *ce; in lookup_class() local
234 ce = zend_lookup_class_ex(name, NULL, flags); in lookup_class()
235 if (ce) { in lookup_class()
236 return ce; in lookup_class()
246 ce = zend_lookup_class_ex(name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD); in lookup_class()
247 if (ce && class_visible(ce)) { in lookup_class()
248 return ce; in lookup_class()
298 zend_class_entry *ce = zend_lookup_class_ex( in unlinked_instanceof() local
301 if (ce && unlinked_instanceof(ce, ce2)) { in unlinked_instanceof()
734 zend_class_entry *ce, const zend_function *fe, in perform_delayable_implementation_check() argument
743 add_compatibility_obligation(ce, fe, proto, always_error); in perform_delayable_implementation_check()
757 …n_method_ex(zend_function *child, zend_function *parent, zend_class_entry *ce, zval *child_zv, zen… in do_inheritance_check_on_method_ex() argument
822 if (child->common.scope != ce in do_inheritance_check_on_method_ex()
825 if (ce->ce_flags & ZEND_ACC_INTERFACE) { in do_inheritance_check_on_method_ex()
857 ce, child, parent, /*always_error*/0); in do_inheritance_check_on_method_ex()
863 …k_on_method(zend_function *child, zend_function *parent, zend_class_entry *ce, zval *child_zv) /* … in do_inheritance_check_on_method() argument
865 do_inheritance_check_on_method_ex(child, parent, ce, child_zv, 0, 0); in do_inheritance_check_on_method()
869 …_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce, zend_bool is_interf… in do_inherit_method() argument
871 zval *child = zend_hash_find_ex(&ce->function_table, key, 1); in do_inherit_method()
882 do_inheritance_check_on_method_ex(func, parent, ce, child, 0, checked); in do_inherit_method()
884 do_inheritance_check_on_method(func, parent, ce, child); in do_inherit_method()
889 ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in do_inherit_method()
892 parent = zend_duplicate_function(parent, ce, is_interface); in do_inherit_method()
895 _zend_hash_append_ptr(&ce->function_table, key, parent); in do_inherit_method()
897 zend_hash_add_new_ptr(&ce->function_table, key, parent); in do_inherit_method()
918 : resolve_class_name(parent_info->ce, ZEND_TYPE_NAME(parent_info->type)); in property_types_compatible()
921 : resolve_class_name(child_info->ce, ZEND_TYPE_NAME(child_info->type)); in property_types_compatible()
929 : lookup_class(parent_info->ce, parent_name); in property_types_compatible()
932 : lookup_class(child_info->ce, child_name); in property_types_compatible()
943 ZSTR_VAL(child->ce->name), in emit_incompatible_property_error()
947 …ent->type) ? ZEND_TYPE_CE(parent->type)->name : resolve_class_name(parent->ce, ZEND_TYPE_NAME(pare… in emit_incompatible_property_error()
949 ZSTR_VAL(parent->ce->name)); in emit_incompatible_property_error()
952 …inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ in do_inherit_property() argument
954 zval *child = zend_hash_find_ex(&ce->properties_info, key, 1); in do_inherit_property()
965 …(parent_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ZSTR_VAL(ce->parent->name), ZS… in do_inherit_property()
966 …(child_info->flags & ZEND_ACC_STATIC) ? "static " : "non static ", ZSTR_VAL(ce->name), ZSTR_VAL(ke… in do_inherit_property()
970 …be %s (as in class %s)%s", ZSTR_VAL(ce->name), ZSTR_VAL(key), zend_visibility_string(parent_info->… in do_inherit_property()
976 zval_ptr_dtor_nogc(&(ce->default_properties_table[parent_num])); in do_inherit_property()
977 ce->default_properties_table[parent_num] = ce->default_properties_table[child_num]; in do_inherit_property()
978 ZVAL_UNDEF(&ce->default_properties_table[child_num]); in do_inherit_property()
988 add_property_compatibility_obligation(ce, child_info, parent_info); in do_inherit_property()
993 ZSTR_VAL(ce->name), in do_inherit_property()
995 ZSTR_VAL(ce->parent->name)); in do_inherit_property()
999 if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { in do_inherit_property()
1004 _zend_hash_append_ptr(&ce->properties_info, key, child_info); in do_inherit_property()
1009 static inline void do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ in do_implement_interface() argument
1011 …if (!(ce->ce_flags & ZEND_ACC_INTERFACE) && iface->interface_gets_implemented && iface->interface_… in do_implement_interface()
1012 …zend_error_noreturn(E_CORE_ERROR, "Class %s could not implement interface %s", ZSTR_VAL(ce->name),… in do_implement_interface()
1015 ZEND_ASSERT(ce != iface); in do_implement_interface()
1019 static void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_entry *iface) /* {{{ … in zend_do_inherit_interfaces() argument
1025 ce_num = ce->num_interfaces; in zend_do_inherit_interfaces()
1027 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_inherit_interfaces()
1028ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_nu… in zend_do_inherit_interfaces()
1030ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (ce_n… in zend_do_inherit_interfaces()
1037 if (ce->interfaces[i] == entry) { in zend_do_inherit_interfaces()
1042 ce->interfaces[ce->num_interfaces++] = entry; in zend_do_inherit_interfaces()
1045 ce->ce_flags |= ZEND_ACC_RESOLVED_INTERFACES; in zend_do_inherit_interfaces()
1048 while (ce_num < ce->num_interfaces) { in zend_do_inherit_interfaces()
1049 do_implement_interface(ce, ce->interfaces[ce_num++]); in zend_do_inherit_interfaces()
1054 …lass_constant(zend_string *name, zend_class_constant *parent_const, zend_class_entry *ce) /* {{{ */ in do_inherit_class_constant() argument
1056 zval *zv = zend_hash_find_ex(&ce->constants_table, name, 1); in do_inherit_class_constant()
1063 …ZSTR_VAL(ce->name), ZSTR_VAL(name), zend_visibility_string(Z_ACCESS_FLAGS(parent_const->value)), Z… in do_inherit_class_constant()
1067 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in do_inherit_class_constant()
1069 if (ce->type & ZEND_INTERNAL_CLASS) { in do_inherit_class_constant()
1074 _zend_hash_append_ptr(&ce->constants_table, name, parent_const); in do_inherit_class_constant()
1079 void zend_build_properties_info_table(zend_class_entry *ce) in zend_build_properties_info_table() argument
1083 if (ce->default_properties_count == 0) { in zend_build_properties_info_table()
1087 ZEND_ASSERT(ce->properties_info_table == NULL); in zend_build_properties_info_table()
1088 size = sizeof(zend_property_info *) * ce->default_properties_count; in zend_build_properties_info_table()
1089 if (ce->type == ZEND_USER_CLASS) { in zend_build_properties_info_table()
1090 ce->properties_info_table = table = zend_arena_alloc(&CG(arena), size); in zend_build_properties_info_table()
1092 ce->properties_info_table = table = pemalloc(size, 1); in zend_build_properties_info_table()
1098 if (ce->parent && ce->parent->default_properties_count != 0) { in zend_build_properties_info_table()
1099 zend_property_info **parent_table = ce->parent->properties_info_table; in zend_build_properties_info_table()
1102 sizeof(zend_property_info *) * ce->parent->default_properties_count in zend_build_properties_info_table()
1106 if (ce->default_properties_count == ce->parent->default_properties_count) { in zend_build_properties_info_table()
1111 ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { in zend_build_properties_info_table()
1112 if (prop->ce == ce && (prop->flags & ZEND_ACC_STATIC) == 0) { in zend_build_properties_info_table()
1118 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
1124 if (UNEXPECTED(ce->ce_flags & ZEND_ACC_INTERFACE)) { in zend_do_inheritance_ex()
1127 …zend_error_noreturn(E_COMPILE_ERROR, "Interface %s may not inherit from class (%s)", ZSTR_VAL(ce->… in zend_do_inheritance_ex()
1132 …zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from interface %s", ZSTR_VAL(ce->name… in zend_do_inheritance_ex()
1134 …zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend from trait %s", ZSTR_VAL(ce->name), Z… in zend_do_inheritance_ex()
1139 …_COMPILE_ERROR, "Class %s may not inherit from final class (%s)", ZSTR_VAL(ce->name), ZSTR_VAL(par… in zend_do_inheritance_ex()
1143 if (ce->parent_name) { in zend_do_inheritance_ex()
1144 zend_string_release_ex(ce->parent_name, 0); in zend_do_inheritance_ex()
1146 ce->parent = parent_ce; in zend_do_inheritance_ex()
1147 ce->ce_flags |= ZEND_ACC_RESOLVED_PARENT; in zend_do_inheritance_ex()
1151 if (!(ce->ce_flags & ZEND_ACC_IMPLEMENT_INTERFACES)) { in zend_do_inheritance_ex()
1152 zend_do_inherit_interfaces(ce, parent_ce); in zend_do_inheritance_ex()
1157 do_implement_interface(ce, parent_ce->interfaces[i]); in zend_do_inheritance_ex()
1166 if (ce->default_properties_count) { in zend_do_inheritance_ex()
1167 …zval *table = pemalloc(sizeof(zval) * (ce->default_properties_count + parent_ce->default_propertie… in zend_do_inheritance_ex()
1168 src = ce->default_properties_table + ce->default_properties_count; in zend_do_inheritance_ex()
1170 dst = end + ce->default_properties_count; in zend_do_inheritance_ex()
1171 ce->default_properties_table = table; in zend_do_inheritance_ex()
1177 pefree(src, ce->type == ZEND_INTERNAL_CLASS); in zend_do_inheritance_ex()
1178 end = ce->default_properties_table; in zend_do_inheritance_ex()
1180 …end = pemalloc(sizeof(zval) * parent_ce->default_properties_count, ce->type == ZEND_INTERNAL_CLASS… in zend_do_inheritance_ex()
1182 ce->default_properties_table = end; in zend_do_inheritance_ex()
1185 if (UNEXPECTED(parent_ce->type != ce->type)) { in zend_do_inheritance_ex()
1192 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance_ex()
1202 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance_ex()
1207 ce->default_properties_count += parent_ce->default_properties_count; in zend_do_inheritance_ex()
1213 if (ce->default_static_members_count) { in zend_do_inheritance_ex()
1214 …al *table = pemalloc(sizeof(zval) * (ce->default_static_members_count + parent_ce->default_static_… in zend_do_inheritance_ex()
1215 src = ce->default_static_members_table + ce->default_static_members_count; in zend_do_inheritance_ex()
1217 dst = end + ce->default_static_members_count; in zend_do_inheritance_ex()
1218 ce->default_static_members_table = table; in zend_do_inheritance_ex()
1224 pefree(src, ce->type == ZEND_INTERNAL_CLASS); in zend_do_inheritance_ex()
1225 end = ce->default_static_members_table; in zend_do_inheritance_ex()
1227 …end = pemalloc(sizeof(zval) * parent_ce->default_static_members_count, ce->type == ZEND_INTERNAL_C… in zend_do_inheritance_ex()
1229 ce->default_static_members_table = end; in zend_do_inheritance_ex()
1231 if (UNEXPECTED(parent_ce->type != ce->type)) { in zend_do_inheritance_ex()
1249 } else if (ce->type == ZEND_USER_CLASS) { in zend_do_inheritance_ex()
1264 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in zend_do_inheritance_ex()
1279 ce->default_static_members_count += parent_ce->default_static_members_count; in zend_do_inheritance_ex()
1280 if (!ZEND_MAP_PTR(ce->static_members_table)) { in zend_do_inheritance_ex()
1281 ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS); in zend_do_inheritance_ex()
1283 ZEND_MAP_PTR_NEW(ce->static_members_table); in zend_do_inheritance_ex()
1286 ZEND_MAP_PTR_INIT(ce->static_members_table, &ce->default_static_members_table); in zend_do_inheritance_ex()
1291 ZEND_HASH_FOREACH_PTR(&ce->properties_info, property_info) { in zend_do_inheritance_ex()
1292 if (property_info->ce == ce) { in zend_do_inheritance_ex()
1302 zend_hash_extend(&ce->properties_info, in zend_do_inheritance_ex()
1303 zend_hash_num_elements(&ce->properties_info) + in zend_do_inheritance_ex()
1307 do_inherit_property(property_info, key, ce); in zend_do_inheritance_ex()
1314 zend_hash_extend(&ce->constants_table, in zend_do_inheritance_ex()
1315 zend_hash_num_elements(&ce->constants_table) + in zend_do_inheritance_ex()
1319 do_inherit_class_constant(key, c, ce); in zend_do_inheritance_ex()
1324 zend_hash_extend(&ce->function_table, in zend_do_inheritance_ex()
1325 zend_hash_num_elements(&ce->function_table) + in zend_do_inheritance_ex()
1330 do_inherit_method(key, func, ce, 0, 1); in zend_do_inheritance_ex()
1334 do_inherit_method(key, func, ce, 0, 0); in zend_do_inheritance_ex()
1339 do_inherit_parent_constructor(ce); in zend_do_inheritance_ex()
1341 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_inheritance_ex()
1342 if (ce->ce_flags & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { in zend_do_inheritance_ex()
1343 ce->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS; in zend_do_inheritance_ex()
1346ce->ce_flags |= parent_ce->ce_flags & (ZEND_HAS_STATIC_IN_METHODS | ZEND_ACC_HAS_TYPE_HINTS | ZEND… in zend_do_inheritance_ex()
1357 if (old_constant->ce != parent_constant->ce) { in do_inherit_constant_check()
1366 …face_constant(zend_string *name, zend_class_constant *c, zend_class_entry *ce, zend_class_entry *i… in do_inherit_iface_constant() argument
1368 if (do_inherit_constant_check(&ce->constants_table, c, name, iface)) { in do_inherit_iface_constant()
1371 ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; in do_inherit_iface_constant()
1373 if (ce->type & ZEND_INTERNAL_CLASS) { in do_inherit_iface_constant()
1378 zend_hash_update_ptr(&ce->constants_table, name, c); in do_inherit_iface_constant()
1383 static void do_interface_implementation(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ in do_interface_implementation() argument
1390 do_inherit_iface_constant(key, c, ce, iface); in do_interface_implementation()
1394 do_inherit_method(key, func, ce, 1, 0); in do_interface_implementation()
1397 do_implement_interface(ce, iface); in do_interface_implementation()
1399 zend_do_inherit_interfaces(ce, iface); in do_interface_implementation()
1404 ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface) /* {{{ */ in zend_do_implement_interface() argument
1407 uint32_t current_iface_num = ce->num_interfaces; in zend_do_implement_interface()
1408 uint32_t parent_iface_num = ce->parent ? ce->parent->num_interfaces : 0; in zend_do_implement_interface()
1412 ZEND_ASSERT(ce->ce_flags & ZEND_ACC_LINKED); in zend_do_implement_interface()
1414 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_implement_interface()
1415 if (ce->interfaces[i] == NULL) { in zend_do_implement_interface()
1416 …memmove(ce->interfaces + i, ce->interfaces + i + 1, sizeof(zend_class_entry*) * (--ce->num_interfa… in zend_do_implement_interface()
1418 } else if (ce->interfaces[i] == iface) { in zend_do_implement_interface()
1422 … "Class %s cannot implement previously implemented interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(ifa… in zend_do_implement_interface()
1428 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) { in zend_do_implement_interface()
1432 if (ce->num_interfaces >= current_iface_num) { in zend_do_implement_interface()
1433 if (ce->type == ZEND_INTERNAL_CLASS) { in zend_do_implement_interface()
1434ce->interfaces = (zend_class_entry **) realloc(ce->interfaces, sizeof(zend_class_entry *) * (++cur… in zend_do_implement_interface()
1436ce->interfaces = (zend_class_entry **) erealloc(ce->interfaces, sizeof(zend_class_entry *) * (++cu… in zend_do_implement_interface()
1439 ce->interfaces[ce->num_interfaces++] = iface; in zend_do_implement_interface()
1441 do_interface_implementation(ce, iface); in zend_do_implement_interface()
1446 static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry **interfaces) /* {{… in zend_do_implement_interfaces() argument
1449 uint32_t num_parent_interfaces = ce->parent ? ce->parent->num_interfaces : 0; in zend_do_implement_interfaces()
1455 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_implement_interfaces()
1458 add_dependency_obligation(ce, iface); in zend_do_implement_interfaces()
1462 …zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ZSTR_VAL(ce->name)… in zend_do_implement_interfaces()
1469 … "Class %s cannot implement previously implemented interface %s", ZSTR_VAL(ce->name), ZSTR_VAL(ifa… in zend_do_implement_interfaces()
1473 ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) { in zend_do_implement_interfaces()
1487 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_implement_interfaces()
1488 zend_string_release_ex(ce->interface_names[i].name, 0); in zend_do_implement_interfaces()
1489 zend_string_release_ex(ce->interface_names[i].lc_name, 0); in zend_do_implement_interfaces()
1491 efree(ce->interface_names); in zend_do_implement_interfaces()
1493 ce->num_interfaces = num_interfaces; in zend_do_implement_interfaces()
1494 ce->interfaces = interfaces; in zend_do_implement_interfaces()
1495 ce->ce_flags |= ZEND_ACC_RESOLVED_INTERFACES; in zend_do_implement_interfaces()
1498 for (; i < ce->num_interfaces; i++) { in zend_do_implement_interfaces()
1499 do_interface_implementation(ce, ce->interfaces[i]); in zend_do_implement_interfaces()
1504 static void zend_add_magic_methods(zend_class_entry* ce, zend_string* mname, zend_function* fe) /* … in zend_add_magic_methods() argument
1507 ce->serialize_func = fe; in zend_add_magic_methods()
1509 ce->unserialize_func = fe; in zend_add_magic_methods()
1510 …} else if (ZSTR_LEN(ce->name) != ZSTR_LEN(mname) && (ZSTR_VAL(mname)[0] != '_' || ZSTR_VAL(mname)[… in zend_add_magic_methods()
1513 ce->clone = fe; in zend_add_magic_methods()
1515 if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) { in zend_add_magic_methods()
1516 …_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name)); in zend_add_magic_methods()
1518 ce->constructor = fe; in zend_add_magic_methods()
1520 ce->destructor = fe; in zend_add_magic_methods()
1522 ce->__get = fe; in zend_add_magic_methods()
1523 ce->ce_flags |= ZEND_ACC_USE_GUARDS; in zend_add_magic_methods()
1525 ce->__set = fe; in zend_add_magic_methods()
1526 ce->ce_flags |= ZEND_ACC_USE_GUARDS; in zend_add_magic_methods()
1528 ce->__call = fe; in zend_add_magic_methods()
1530 ce->__unset = fe; in zend_add_magic_methods()
1531 ce->ce_flags |= ZEND_ACC_USE_GUARDS; in zend_add_magic_methods()
1533 ce->__isset = fe; in zend_add_magic_methods()
1534 ce->ce_flags |= ZEND_ACC_USE_GUARDS; in zend_add_magic_methods()
1536 ce->__callstatic = fe; in zend_add_magic_methods()
1538 ce->__tostring = fe; in zend_add_magic_methods()
1540 ce->__debugInfo = fe; in zend_add_magic_methods()
1541 } else if (ZSTR_LEN(ce->name) == ZSTR_LEN(mname)) { in zend_add_magic_methods()
1542 zend_string *lowercase_name = zend_string_tolower(ce->name); in zend_add_magic_methods()
1545 if (ce->constructor && (!ce->parent || ce->constructor != ce->parent->constructor)) { in zend_add_magic_methods()
1546 …_COMPILE_ERROR, "%s has colliding constructor definitions coming from traits", ZSTR_VAL(ce->name)); in zend_add_magic_methods()
1548 ce->constructor = fe; in zend_add_magic_methods()
1556 static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_string *key, zend_fu… in zend_add_trait_method() argument
1561 if ((existing_fn = zend_hash_find_ptr(&ce->function_table, key)) != NULL) { in zend_add_trait_method()
1570 if (existing_fn->common.scope == ce) { in zend_add_trait_method()
1578 ce, fn, existing_fn, /*always_error*/ 1); in zend_add_trait_method()
1583 ce, existing_fn, fn, /*always_error*/ 1); in zend_add_trait_method()
1597 ce, existing_fn, fn, /*always_error*/ 1); in zend_add_trait_method()
1604 name, ZSTR_VAL(ce->name)); in zend_add_trait_method()
1608 ZSTR_VAL(ce->name), name, in zend_add_trait_method()
1614 do_inheritance_check_on_method(fn, existing_fn, ce, NULL); in zend_add_trait_method()
1630 fn = zend_hash_update_ptr(&ce->function_table, key, new_fn); in zend_add_trait_method()
1631 zend_add_magic_methods(ce, key, fn); in zend_add_trait_method()
1635 static void zend_fixup_trait_method(zend_function *fn, zend_class_entry *ce) /* {{{ */ in zend_fixup_trait_method() argument
1639 fn->common.scope = ce; in zend_fixup_trait_method()
1642 ce->ce_flags |= ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in zend_fixup_trait_method()
1645 ce->ce_flags |= ZEND_HAS_STATIC_IN_METHODS; in zend_fixup_trait_method()
1651 static void zend_traits_copy_functions(zend_string *fnname, zend_function *fn, zend_class_entry *ce in zend_traits_copy_functions() argument
1659 if (ce->trait_aliases) { in zend_traits_copy_functions()
1660 alias_ptr = ce->trait_aliases; in zend_traits_copy_functions()
1677 zend_add_trait_method(ce, ZSTR_VAL(alias->alias), lcname, &fn_copy, overridden); in zend_traits_copy_functions()
1701 if (ce->trait_aliases) { in zend_traits_copy_functions()
1702 alias_ptr = ce->trait_aliases; in zend_traits_copy_functions()
1729 zend_add_trait_method(ce, ZSTR_VAL(fn->common.function_name), fnname, &fn_copy, overridden); in zend_traits_copy_functions()
1734 static uint32_t zend_check_trait_usage(zend_class_entry *ce, zend_class_entry *trait, zend_class_en… in zend_check_trait_usage() argument
1743 for (i = 0; i < ce->num_traits; i++) { in zend_check_trait_usage()
1748 …_COMPILE_ERROR, "Required Trait %s wasn't added to %s", ZSTR_VAL(trait->name), ZSTR_VAL(ce->name)); in zend_check_trait_usage()
1753 static void zend_traits_init_trait_structures(zend_class_entry *ce, zend_class_entry **traits, Hash… in zend_traits_init_trait_structures() argument
1765 if (ce->trait_precedences) { in zend_traits_init_trait_structures()
1766 exclude_tables = ecalloc(ce->num_traits, sizeof(HashTable*)); in zend_traits_init_trait_structures()
1768 precedences = ce->trait_precedences; in zend_traits_init_trait_structures()
1769 ce->trait_precedences = NULL; in zend_traits_init_trait_structures()
1778 zend_check_trait_usage(ce, trait, traits); in zend_traits_init_trait_structures()
1804 trait_num = zend_check_trait_usage(ce, exclude_ce, traits); in zend_traits_init_trait_structures()
1827 ce->trait_precedences = precedences; in zend_traits_init_trait_structures()
1830 if (ce->trait_aliases) { in zend_traits_init_trait_structures()
1832 while (ce->trait_aliases[i]) { in zend_traits_init_trait_structures()
1837 while (ce->trait_aliases[i]) { in zend_traits_init_trait_structures()
1839 if (ce->trait_aliases[i]->trait_method.class_name) { in zend_traits_init_trait_structures()
1840 cur_method_ref = &ce->trait_aliases[i]->trait_method; in zend_traits_init_trait_structures()
1845 zend_check_trait_usage(ce, trait, traits); in zend_traits_init_trait_structures()
1864 static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry **traits, HashTabl… in zend_do_traits_method_binding() argument
1872 for (i = 0; i < ce->num_traits; i++) { in zend_do_traits_method_binding()
1876 zend_traits_copy_functions(key, fn, ce, &overridden, exclude_tables[i], aliases); in zend_do_traits_method_binding()
1887 for (i = 0; i < ce->num_traits; i++) { in zend_do_traits_method_binding()
1890 zend_traits_copy_functions(key, fn, ce, &overridden, NULL, aliases); in zend_do_traits_method_binding()
1896 ZEND_HASH_FOREACH_PTR(&ce->function_table, fn) { in zend_do_traits_method_binding()
1897 zend_fixup_trait_method(fn, ce); in zend_do_traits_method_binding()
1907 static zend_class_entry* find_first_definition(zend_class_entry *ce, zend_class_entry **traits, siz… in find_first_definition() argument
1911 if (coliding_ce == ce) { in find_first_definition()
1924 static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{… in zend_do_traits_property_binding() argument
1941 for (i = 0; i < ce->num_traits; i++) { in zend_do_traits_property_binding()
1963 if ((coliding_prop = zend_hash_find_ptr(&ce->properties_info, prop_name)) != NULL) { in zend_do_traits_property_binding()
1964 if ((coliding_prop->flags & ZEND_ACC_PRIVATE) && coliding_prop->ce != ce) { in zend_do_traits_property_binding()
1965 zend_hash_del(&ce->properties_info, prop_name); in zend_do_traits_property_binding()
1979 op1 = &ce->default_static_members_table[coliding_prop->offset]; in zend_do_traits_property_binding()
1984 op1 = &ce->default_properties_table[OBJ_PROP_TO_NUM(coliding_prop->offset)]; in zend_do_traits_property_binding()
1991 zval_update_constant_ex(&op1_tmp, ce); in zend_do_traits_property_binding()
1996 zval_update_constant_ex(&op2_tmp, ce); in zend_do_traits_property_binding()
2013 ZSTR_VAL(find_first_definition(ce, traits, i, prop_name, coliding_prop->ce)->name), in zend_do_traits_property_binding()
2014 ZSTR_VAL(property_info->ce->name), in zend_do_traits_property_binding()
2016 ZSTR_VAL(ce->name)); in zend_do_traits_property_binding()
2037 zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type); in zend_do_traits_property_binding()
2044 static void zend_do_check_for_inconsistent_traits_aliasing(zend_class_entry *ce, zend_class_entry *… in zend_do_check_for_inconsistent_traits_aliasing() argument
2050 if (ce->trait_aliases) { in zend_do_check_for_inconsistent_traits_aliasing()
2051 while (ce->trait_aliases[i]) { in zend_do_check_for_inconsistent_traits_aliasing()
2052 cur_alias = ce->trait_aliases[i]; in zend_do_check_for_inconsistent_traits_aliasing()
2073 if (zend_hash_exists(&ce->function_table, in zend_do_check_for_inconsistent_traits_aliasing()
2094 static void zend_do_bind_traits(zend_class_entry *ce) /* {{{ */ in zend_do_bind_traits() argument
2101 ZEND_ASSERT(ce->num_traits > 0); in zend_do_bind_traits()
2103 traits = emalloc(sizeof(zend_class_entry*) * ce->num_traits); in zend_do_bind_traits()
2105 for (i = 0; i < ce->num_traits; i++) { in zend_do_bind_traits()
2106 trait = zend_fetch_class_by_name(ce->trait_names[i].name, in zend_do_bind_traits()
2107 ce->trait_names[i].lc_name, ZEND_FETCH_CLASS_TRAIT); in zend_do_bind_traits()
2112 …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()
2126 zend_traits_init_trait_structures(ce, traits, &exclude_tables, &aliases); in zend_do_bind_traits()
2129 zend_do_traits_method_binding(ce, traits, exclude_tables, aliases); in zend_do_bind_traits()
2132 zend_do_check_for_inconsistent_traits_aliasing(ce, aliases); in zend_do_bind_traits()
2143 zend_do_traits_property_binding(ce, traits); in zend_do_bind_traits()
2148 zend_check_deprecated_constructor(ce); in zend_do_bind_traits()
2153 static zend_bool zend_has_deprecated_constructor(const zend_class_entry *ce) /* {{{ */ in zend_has_deprecated_constructor() argument
2156 if (!ce->constructor) { in zend_has_deprecated_constructor()
2159 constructor_name = ce->constructor->common.function_name; in zend_has_deprecated_constructor()
2161 ZSTR_VAL(ce->name), ZSTR_LEN(ce->name), in zend_has_deprecated_constructor()
2167 void zend_check_deprecated_constructor(const zend_class_entry *ce) /* {{{ */ in zend_check_deprecated_constructor() argument
2169 if (zend_has_deprecated_constructor(ce)) { in zend_check_deprecated_constructor()
2170 … be constructors in a future version of PHP; %s has a deprecated constructor", ZSTR_VAL(ce->name)); in zend_check_deprecated_constructor()
2209 void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */ in zend_verify_abstract_class() argument
2214 …ZEND_ASSERT((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZE… in zend_verify_abstract_class()
2217 ZEND_HASH_FOREACH_PTR(&ce->function_table, func) { in zend_verify_abstract_class()
2223 ZSTR_VAL(ce->name), ai.cnt, in zend_verify_abstract_class()
2231 ce->ce_flags &= ~ZEND_ACC_IMPLICIT_ABSTRACT_CLASS; in zend_verify_abstract_class()
2267 static HashTable *get_or_init_obligations_for_class(zend_class_entry *ce) { in get_or_init_obligations_for_class() argument
2275 key = (zend_ulong) (uintptr_t) ce; in get_or_init_obligations_for_class()
2284 ce->ce_flags |= ZEND_ACC_UNRESOLVED_VARIANCE; in get_or_init_obligations_for_class()
2288 static void add_dependency_obligation(zend_class_entry *ce, zend_class_entry *dependency_ce) { in add_dependency_obligation() argument
2289 HashTable *obligations = get_or_init_obligations_for_class(ce); in add_dependency_obligation()
2297 zend_class_entry *ce, const zend_function *child_fn, const zend_function *parent_fn, in add_compatibility_obligation() argument
2299 HashTable *obligations = get_or_init_obligations_for_class(ce); in add_compatibility_obligation()
2318 zend_class_entry *ce, const zend_property_info *child_prop, in add_property_compatibility_obligation() argument
2320 HashTable *obligations = get_or_init_obligations_for_class(ce); in add_property_compatibility_obligation()
2328 static void resolve_delayed_variance_obligations(zend_class_entry *ce);
2389 static void resolve_delayed_variance_obligations(zend_class_entry *ce) { in resolve_delayed_variance_obligations() argument
2391 zend_ulong num_key = (zend_ulong) (uintptr_t) ce; in resolve_delayed_variance_obligations()
2399 ce->ce_flags &= ~ZEND_ACC_UNRESOLVED_VARIANCE; in resolve_delayed_variance_obligations()
2400 ce->ce_flags |= ZEND_ACC_LINKED; in resolve_delayed_variance_obligations()
2405 static void report_variance_errors(zend_class_entry *ce) { in report_variance_errors() argument
2408 zend_ulong num_key = (zend_ulong) (uintptr_t) ce; in report_variance_errors()
2435 ce->ce_flags &= ~ZEND_ACC_UNRESOLVED_VARIANCE; in report_variance_errors()
2436 ce->ce_flags |= ZEND_ACC_LINKED; in report_variance_errors()
2440 static void check_unrecoverable_load_failure(zend_class_entry *ce) { in check_unrecoverable_load_failure() argument
2445 if (ce->ce_flags & ZEND_ACC_HAS_UNLINKED_USES) { in check_unrecoverable_load_failure()
2454 …"During inheritance of %s with variance dependencies: Uncaught %s", ZSTR_VAL(ce->name), ZSTR_VAL(e… in check_unrecoverable_load_failure()
2458 ZEND_API int zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name) /* {{{ */ in zend_do_link_class() argument
2466 if (ce->parent_name) { in zend_do_link_class()
2468 ce->parent_name, lc_parent_name, in zend_do_link_class()
2471 check_unrecoverable_load_failure(ce); in zend_do_link_class()
2476 if (ce->num_interfaces) { in zend_do_link_class()
2480 sizeof(zend_class_entry *) * (ce->num_interfaces + num_parent_interfaces)); in zend_do_link_class()
2485 for (i = 0; i < ce->num_interfaces; i++) { in zend_do_link_class()
2487 ce->interface_names[i].name, ce->interface_names[i].lc_name, in zend_do_link_class()
2491 check_unrecoverable_load_failure(ce); in zend_do_link_class()
2501 add_dependency_obligation(ce, parent); in zend_do_link_class()
2503 zend_do_inheritance(ce, parent); in zend_do_link_class()
2505 if (ce->ce_flags & ZEND_ACC_IMPLEMENT_TRAITS) { in zend_do_link_class()
2506 zend_do_bind_traits(ce); in zend_do_link_class()
2508 if (ce->ce_flags & ZEND_ACC_IMPLEMENT_INTERFACES) { in zend_do_link_class()
2509 zend_do_implement_interfaces(ce, interfaces); in zend_do_link_class()
2511 …if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_E… in zend_do_link_class()
2512 zend_verify_abstract_class(ce); in zend_do_link_class()
2515 zend_build_properties_info_table(ce); in zend_do_link_class()
2517 if (!(ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE)) { in zend_do_link_class()
2518 ce->ce_flags |= ZEND_ACC_LINKED; in zend_do_link_class()
2522 ce->ce_flags |= ZEND_ACC_NEARLY_LINKED; in zend_do_link_class()
2524 if (ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE) { in zend_do_link_class()
2525 resolve_delayed_variance_obligations(ce); in zend_do_link_class()
2526 if (!(ce->ce_flags & ZEND_ACC_LINKED)) { in zend_do_link_class()
2527 report_variance_errors(ce); in zend_do_link_class()
2536 static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce) /*… in zend_can_early_bind() argument
2544 zval *zv = zend_hash_find_ex(&ce->function_table, key, 1); in zend_can_early_bind()
2548 do_inheritance_check_on_method_ex(child_func, parent_func, ce, NULL, 1, 0); in zend_can_early_bind()
2566 zv = zend_hash_find_ex(&ce->properties_info, key, 1); in zend_can_early_bind()
2586 zend_bool zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcnam… in zend_try_early_bind() argument
2588 inheritance_status status = zend_can_early_bind(ce, parent_ce); in zend_try_early_bind()
2593 … declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name)); in zend_try_early_bind()
2597 if (UNEXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) == NULL)) { in zend_try_early_bind()
2601 zend_do_inheritance_ex(ce, parent_ce, status == INHERITANCE_SUCCESS); in zend_try_early_bind()
2602 zend_build_properties_info_table(ce); in zend_try_early_bind()
2603 …if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_E… in zend_try_early_bind()
2604 zend_verify_abstract_class(ce); in zend_try_early_bind()
2606 ZEND_ASSERT(!(ce->ce_flags & ZEND_ACC_UNRESOLVED_VARIANCE)); in zend_try_early_bind()
2607 ce->ce_flags |= ZEND_ACC_LINKED; in zend_try_early_bind()