Skip to content

Commit 15ffed3

Browse files
committed
Separate trait constant binding from property binding and a bit of cleanup
1 parent e5123ce commit 15ffed3

File tree

1 file changed

+52
-45
lines changed

1 file changed

+52
-45
lines changed

Zend/zend_inheritance.c

Lines changed: 52 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2204,23 +2204,6 @@ static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry
22042204
}
22052205
/* }}} */
22062206

2207-
static zend_class_entry* find_first_property_definition(zend_class_entry *ce, zend_class_entry **traits, size_t current_trait, zend_string *prop_name, zend_class_entry *colliding_ce) /* {{{ */
2208-
{
2209-
size_t i;
2210-
2211-
if (colliding_ce == ce) {
2212-
for (i = 0; i < current_trait; i++) {
2213-
if (traits[i]
2214-
&& zend_hash_exists(&traits[i]->properties_info, prop_name)) {
2215-
return traits[i];
2216-
}
2217-
}
2218-
}
2219-
2220-
return colliding_ce;
2221-
}
2222-
/* }}} */
2223-
22242207
static zend_class_entry* find_first_constant_definition(zend_class_entry *ce, zend_class_entry **traits, size_t current_trait, zend_string *constant_name, zend_class_entry *colliding_ce) /* {{{ */
22252208
{
22262209
size_t i;
@@ -2238,9 +2221,8 @@ static zend_class_entry* find_first_constant_definition(zend_class_entry *ce, ze
22382221
}
22392222
/* }}} */
22402223

2241-
static bool do_trait_constant_check(
2242-
zend_class_entry *ce, zend_class_constant *trait_constant, zend_string *name, zend_class_entry **traits, size_t current_trait
2243-
) {
2224+
static bool do_trait_constant_check(zend_class_entry *ce, zend_class_constant *trait_constant, zend_string *name, zend_class_entry **traits, size_t current_trait) /* {{{ */
2225+
{
22442226
bool is_compatible = false;
22452227
uint32_t flags_mask = ZEND_ACC_PPP_MASK | ZEND_ACC_FINAL;
22462228

@@ -2266,33 +2248,63 @@ static bool do_trait_constant_check(
22662248
}
22672249
/* }}} */
22682250

2269-
static void do_inherit_trait_constant(zend_string *name, zend_class_constant *c, zend_class_entry *ce, zend_class_entry **traits, size_t current_trait) /* {{{ */
2251+
static void zend_do_traits_constant_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{ */
22702252
{
2271-
if (do_trait_constant_check(ce, c, name, traits, current_trait)) {
2272-
zend_class_constant *ct = NULL;
2253+
size_t i;
22732254

2274-
ct = zend_arena_alloc(&CG(arena),sizeof(zend_class_constant));
2275-
memcpy(ct, c, sizeof(zend_class_constant));
2276-
c = ct;
2255+
for (i = 0; i < ce->num_traits; i++) {
2256+
zend_string *constant_name;
2257+
zend_class_constant *constant;
22772258

2278-
if (Z_TYPE(c->value) == IS_CONSTANT_AST) {
2279-
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
2280-
ce->ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS;
2259+
if (!traits[i]) {
2260+
continue;
22812261
}
22822262

2283-
c->ce = ce;
2284-
Z_TRY_ADDREF(c->value);
2285-
c->doc_comment = c->doc_comment ? zend_string_copy(c->doc_comment) : NULL;
2286-
if (c->attributes && (!(GC_FLAGS(c->attributes) & IS_ARRAY_IMMUTABLE))) {
2287-
GC_ADDREF(c->attributes);
2288-
}
2263+
ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->constants_table, constant_name, constant) {
2264+
if (do_trait_constant_check(ce, constant, constant_name, traits, i)) {
2265+
zend_class_constant *ct = NULL;
22892266

2290-
zend_hash_update_ptr(&ce->constants_table, name, c);
2267+
ct = zend_arena_alloc(&CG(arena),sizeof(zend_class_constant));
2268+
memcpy(ct, constant, sizeof(zend_class_constant));
2269+
constant = ct;
2270+
2271+
if (Z_TYPE(constant->value) == IS_CONSTANT_AST) {
2272+
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
2273+
ce->ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS;
2274+
}
2275+
2276+
constant->ce = ce;
2277+
Z_TRY_ADDREF(constant->value);
2278+
constant->doc_comment = constant->doc_comment ? zend_string_copy(constant->doc_comment) : NULL;
2279+
if (constant->attributes && (!(GC_FLAGS(constant->attributes) & IS_ARRAY_IMMUTABLE))) {
2280+
GC_ADDREF(constant->attributes);
2281+
}
2282+
2283+
zend_hash_update_ptr(&ce->constants_table, constant_name, constant);
2284+
}
2285+
} ZEND_HASH_FOREACH_END();
2286+
}
2287+
}
2288+
/* }}} */
2289+
2290+
static zend_class_entry* find_first_property_definition(zend_class_entry *ce, zend_class_entry **traits, size_t current_trait, zend_string *prop_name, zend_class_entry *colliding_ce) /* {{{ */
2291+
{
2292+
size_t i;
2293+
2294+
if (colliding_ce == ce) {
2295+
for (i = 0; i < current_trait; i++) {
2296+
if (traits[i]
2297+
&& zend_hash_exists(&traits[i]->properties_info, prop_name)) {
2298+
return traits[i];
2299+
}
2300+
}
22912301
}
2302+
2303+
return colliding_ce;
22922304
}
22932305
/* }}} */
22942306

2295-
static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{ */
2307+
static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{ */
22962308
{
22972309
size_t i;
22982310
zend_property_info *property_info;
@@ -2301,8 +2313,6 @@ static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, z
23012313
zend_string* prop_name;
23022314
zval* prop_value;
23032315
zend_string *doc_comment;
2304-
zend_string *constant_name;
2305-
zend_class_constant *constant;
23062316

23072317
/* In the following steps the properties are inserted into the property table
23082318
* for that, a very strict approach is applied:
@@ -2313,10 +2323,6 @@ static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, z
23132323
if (!traits[i]) {
23142324
continue;
23152325
}
2316-
ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->constants_table, constant_name, constant) {
2317-
do_inherit_trait_constant(constant_name, constant, ce, traits, i);
2318-
} ZEND_HASH_FOREACH_END();
2319-
23202326
ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->properties_info, prop_name, property_info) {
23212327
uint32_t flags = property_info->flags;
23222328

@@ -2407,8 +2413,9 @@ static void zend_do_bind_traits(zend_class_entry *ce, zend_class_entry **traits)
24072413
efree(exclude_tables);
24082414
}
24092415

2410-
/* then flatten the properties into it, to, mostly to notify developer about problems */
2411-
zend_do_traits_property_and_constant_binding(ce, traits);
2416+
/* then flatten the constants and properties into it, to, mostly to notify developer about problems */
2417+
zend_do_traits_constant_binding(ce, traits);
2418+
zend_do_traits_property_binding(ce, traits);
24122419
}
24132420
/* }}} */
24142421

0 commit comments

Comments
 (0)