Skip to content

Commit cea4096

Browse files
committed
Separate trait constant binding from property binding and a bit of cleanup
1 parent 92960ad commit cea4096

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
@@ -2135,23 +2135,6 @@ static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry
21352135
}
21362136
/* }}} */
21372137

2138-
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) /* {{{ */
2139-
{
2140-
size_t i;
2141-
2142-
if (colliding_ce == ce) {
2143-
for (i = 0; i < current_trait; i++) {
2144-
if (traits[i]
2145-
&& zend_hash_exists(&traits[i]->properties_info, prop_name)) {
2146-
return traits[i];
2147-
}
2148-
}
2149-
}
2150-
2151-
return colliding_ce;
2152-
}
2153-
/* }}} */
2154-
21552138
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) /* {{{ */
21562139
{
21572140
size_t i;
@@ -2169,9 +2152,8 @@ static zend_class_entry* find_first_constant_definition(zend_class_entry *ce, ze
21692152
}
21702153
/* }}} */
21712154

2172-
static bool do_trait_constant_check(
2173-
zend_class_entry *ce, zend_class_constant *trait_constant, zend_string *name, zend_class_entry **traits, size_t current_trait
2174-
) {
2155+
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) /* {{{ */
2156+
{
21752157
bool is_compatible = false;
21762158
uint32_t flags_mask = ZEND_ACC_PPP_MASK | ZEND_ACC_FINAL;
21772159

@@ -2197,33 +2179,63 @@ static bool do_trait_constant_check(
21972179
}
21982180
/* }}} */
21992181

2200-
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) /* {{{ */
2182+
static void zend_do_traits_constant_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{ */
22012183
{
2202-
if (do_trait_constant_check(ce, c, name, traits, current_trait)) {
2203-
zend_class_constant *ct = NULL;
2184+
size_t i;
22042185

2205-
ct = zend_arena_alloc(&CG(arena),sizeof(zend_class_constant));
2206-
memcpy(ct, c, sizeof(zend_class_constant));
2207-
c = ct;
2186+
for (i = 0; i < ce->num_traits; i++) {
2187+
zend_string *constant_name;
2188+
zend_class_constant *constant;
22082189

2209-
if (Z_TYPE(c->value) == IS_CONSTANT_AST) {
2210-
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
2211-
ce->ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS;
2190+
if (!traits[i]) {
2191+
continue;
22122192
}
22132193

2214-
c->ce = ce;
2215-
Z_TRY_ADDREF(c->value);
2216-
c->doc_comment = c->doc_comment ? zend_string_copy(c->doc_comment) : NULL;
2217-
if (c->attributes && (!(GC_FLAGS(c->attributes) & IS_ARRAY_IMMUTABLE))) {
2218-
GC_ADDREF(c->attributes);
2219-
}
2194+
ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->constants_table, constant_name, constant) {
2195+
if (do_trait_constant_check(ce, constant, constant_name, traits, i)) {
2196+
zend_class_constant *ct = NULL;
22202197

2221-
zend_hash_update_ptr(&ce->constants_table, name, c);
2198+
ct = zend_arena_alloc(&CG(arena),sizeof(zend_class_constant));
2199+
memcpy(ct, constant, sizeof(zend_class_constant));
2200+
constant = ct;
2201+
2202+
if (Z_TYPE(constant->value) == IS_CONSTANT_AST) {
2203+
ce->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED;
2204+
ce->ce_flags |= ZEND_ACC_HAS_AST_CONSTANTS;
2205+
}
2206+
2207+
constant->ce = ce;
2208+
Z_TRY_ADDREF(constant->value);
2209+
constant->doc_comment = constant->doc_comment ? zend_string_copy(constant->doc_comment) : NULL;
2210+
if (constant->attributes && (!(GC_FLAGS(constant->attributes) & IS_ARRAY_IMMUTABLE))) {
2211+
GC_ADDREF(constant->attributes);
2212+
}
2213+
2214+
zend_hash_update_ptr(&ce->constants_table, constant_name, constant);
2215+
}
2216+
} ZEND_HASH_FOREACH_END();
2217+
}
2218+
}
2219+
/* }}} */
2220+
2221+
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) /* {{{ */
2222+
{
2223+
size_t i;
2224+
2225+
if (colliding_ce == ce) {
2226+
for (i = 0; i < current_trait; i++) {
2227+
if (traits[i]
2228+
&& zend_hash_exists(&traits[i]->properties_info, prop_name)) {
2229+
return traits[i];
2230+
}
2231+
}
22222232
}
2233+
2234+
return colliding_ce;
22232235
}
22242236
/* }}} */
22252237

2226-
static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{ */
2238+
static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_entry **traits) /* {{{ */
22272239
{
22282240
size_t i;
22292241
zend_property_info *property_info;
@@ -2232,8 +2244,6 @@ static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, z
22322244
zend_string* prop_name;
22332245
zval* prop_value;
22342246
zend_string *doc_comment;
2235-
zend_string *constant_name;
2236-
zend_class_constant *constant;
22372247

22382248
/* In the following steps the properties are inserted into the property table
22392249
* for that, a very strict approach is applied:
@@ -2244,10 +2254,6 @@ static void zend_do_traits_property_and_constant_binding(zend_class_entry *ce, z
22442254
if (!traits[i]) {
22452255
continue;
22462256
}
2247-
ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->constants_table, constant_name, constant) {
2248-
do_inherit_trait_constant(constant_name, constant, ce, traits, i);
2249-
} ZEND_HASH_FOREACH_END();
2250-
22512257
ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&traits[i]->properties_info, prop_name, property_info) {
22522258
uint32_t flags = property_info->flags;
22532259

@@ -2338,8 +2344,9 @@ static void zend_do_bind_traits(zend_class_entry *ce, zend_class_entry **traits)
23382344
efree(exclude_tables);
23392345
}
23402346

2341-
/* then flatten the properties into it, to, mostly to notify developer about problems */
2342-
zend_do_traits_property_and_constant_binding(ce, traits);
2347+
/* then flatten the constants and properties into it, to, mostly to notify developer about problems */
2348+
zend_do_traits_constant_binding(ce, traits);
2349+
zend_do_traits_property_binding(ce, traits);
23432350
}
23442351
/* }}} */
23452352

0 commit comments

Comments
 (0)