Skip to content

Commit b1caa22

Browse files
committed
feat: impove zend_class_use_internal_traits naming.
1 parent 27304b6 commit b1caa22

5 files changed

Lines changed: 59 additions & 64 deletions

File tree

Zend/zend_API.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ ZEND_API zend_class_entry *zend_register_internal_class_ex(const zend_class_entr
392392
ZEND_API zend_class_entry *zend_register_internal_class_with_flags(const zend_class_entry *class_entry, zend_class_entry *parent_ce, uint32_t flags);
393393
ZEND_API zend_class_entry *zend_register_internal_interface(const zend_class_entry *orig_class_entry);
394394
ZEND_API void zend_class_implements(zend_class_entry *class_entry, int num_interfaces, ...);
395-
ZEND_API void zend_class_use_traits(zend_class_entry *class_entry, int num_traits, ...);
395+
ZEND_API void zend_class_use_internal_traits(zend_class_entry *class_entry, int num_traits, ...);
396396

397397
ZEND_API zend_result zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce, bool persistent);
398398

Zend/zend_inheritance.c

Lines changed: 55 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,66 +2247,6 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry
22472247
}
22482248
/* }}} */
22492249

2250-
static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry **traits, HashTable **exclude_tables, zend_class_entry **aliases, bool verify_abstract, bool *contains_abstract_methods);
2251-
static void zend_do_traits_constant_binding(zend_class_entry *ce, zend_class_entry **traits);
2252-
static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_entry **traits);
2253-
static void zend_fixup_trait_method(zend_function *fn, zend_class_entry *ce);
2254-
2255-
ZEND_API void zend_class_use_traits(zend_class_entry *class_entry, int num_traits, ...) /* {{{ */
2256-
{
2257-
zend_class_entry *trait_entry;
2258-
va_list trait_list;
2259-
zend_class_entry **traits;
2260-
zend_function *fn;
2261-
bool contains_abstract_methods = false;
2262-
2263-
ZEND_ASSERT(class_entry->ce_flags & ZEND_ACC_LINKED);
2264-
2265-
if (num_traits == 0) {
2266-
return;
2267-
}
2268-
2269-
traits = safe_emalloc(num_traits, sizeof(zend_class_entry *), 0);
2270-
class_entry->trait_names = safe_pemalloc(num_traits, sizeof(zend_class_name), 0, 1);
2271-
class_entry->num_traits = num_traits;
2272-
2273-
va_start(trait_list, num_traits);
2274-
for (int i = 0; i < num_traits; i++) {
2275-
trait_entry = va_arg(trait_list, zend_class_entry *);
2276-
class_entry->trait_names[i].name = zend_string_copy(trait_entry->name);
2277-
class_entry->trait_names[i].lc_name = zend_string_tolower_ex(zend_string_copy(trait_entry->name), 1);
2278-
2279-
if (UNEXPECTED(!(trait_entry->ce_flags & ZEND_ACC_TRAIT))) {
2280-
efree(traits);
2281-
zend_error_noreturn(E_ERROR, "Class %s cannot use %s - it is not a trait",
2282-
ZSTR_VAL(class_entry->name), ZSTR_VAL(trait_entry->name));
2283-
return;
2284-
}
2285-
traits[i] = trait_entry;
2286-
}
2287-
va_end(trait_list);
2288-
2289-
zend_do_traits_method_binding(class_entry, traits, NULL, NULL, false, &contains_abstract_methods);
2290-
2291-
zend_do_traits_constant_binding(class_entry, traits);
2292-
2293-
zend_do_traits_property_binding(class_entry, traits);
2294-
2295-
ZEND_HASH_MAP_FOREACH_PTR(&class_entry->function_table, fn) {
2296-
zend_fixup_trait_method(fn, class_entry);
2297-
} ZEND_HASH_FOREACH_END();
2298-
2299-
if (contains_abstract_methods) {
2300-
zend_do_traits_method_binding(class_entry, traits, NULL, NULL, true, &contains_abstract_methods);
2301-
ZEND_HASH_MAP_FOREACH_PTR(&class_entry->function_table, fn) {
2302-
zend_fixup_trait_method(fn, class_entry);
2303-
} ZEND_HASH_FOREACH_END();
2304-
}
2305-
2306-
efree(traits);
2307-
}
2308-
/* }}} */
2309-
23102250
static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry **interfaces) /* {{{ */
23112251
{
23122252
uint32_t num_parent_interfaces = ce->parent ? ce->parent->num_interfaces : 0;
@@ -3072,6 +3012,61 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent
30723012
}
30733013
/* }}} */
30743014

3015+
ZEND_API void zend_class_use_internal_traits(zend_class_entry *class_entry, int num_traits, ...) /* {{{ */
3016+
{
3017+
zend_class_entry *trait_entry;
3018+
va_list trait_list;
3019+
zend_class_entry **traits;
3020+
zend_function *fn;
3021+
bool contains_abstract_methods = false;
3022+
3023+
ZEND_ASSERT(class_entry->ce_flags & ZEND_ACC_LINKED);
3024+
3025+
if (num_traits == 0) {
3026+
return;
3027+
}
3028+
3029+
traits = safe_emalloc(num_traits, sizeof(zend_class_entry *), 0);
3030+
class_entry->trait_names = safe_pemalloc(num_traits, sizeof(zend_class_name), 0, 1);
3031+
class_entry->num_traits = num_traits;
3032+
3033+
va_start(trait_list, num_traits);
3034+
for (int i = 0; i < num_traits; i++) {
3035+
trait_entry = va_arg(trait_list, zend_class_entry *);
3036+
class_entry->trait_names[i].name = zend_string_copy(trait_entry->name);
3037+
class_entry->trait_names[i].lc_name = zend_string_tolower_ex(zend_string_copy(trait_entry->name), 1);
3038+
3039+
if (UNEXPECTED(!(trait_entry->ce_flags & ZEND_ACC_TRAIT))) {
3040+
efree(traits);
3041+
zend_error_noreturn(E_ERROR, "Class %s cannot use %s - it is not a trait",
3042+
ZSTR_VAL(class_entry->name), ZSTR_VAL(trait_entry->name));
3043+
return;
3044+
}
3045+
traits[i] = trait_entry;
3046+
}
3047+
va_end(trait_list);
3048+
3049+
zend_do_traits_method_binding(class_entry, traits, NULL, NULL, false, &contains_abstract_methods);
3050+
3051+
zend_do_traits_constant_binding(class_entry, traits);
3052+
3053+
zend_do_traits_property_binding(class_entry, traits);
3054+
3055+
ZEND_HASH_MAP_FOREACH_PTR(&class_entry->function_table, fn) {
3056+
zend_fixup_trait_method(fn, class_entry);
3057+
} ZEND_HASH_FOREACH_END();
3058+
3059+
if (contains_abstract_methods) {
3060+
zend_do_traits_method_binding(class_entry, traits, NULL, NULL, true, &contains_abstract_methods);
3061+
ZEND_HASH_MAP_FOREACH_PTR(&class_entry->function_table, fn) {
3062+
zend_fixup_trait_method(fn, class_entry);
3063+
} ZEND_HASH_FOREACH_END();
3064+
}
3065+
3066+
efree(traits);
3067+
}
3068+
/* }}} */
3069+
30753070
#define MAX_ABSTRACT_INFO_CNT 3
30763071
#define MAX_ABSTRACT_INFO_FMT "%s%s%s%s"
30773072
#define DISPLAY_ABSTRACT_FN(idx) \

build/gen_stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3601,7 +3601,7 @@ function (Name $item) {
36013601
);
36023602

36033603
if (!empty($traits)) {
3604-
$code .= "\tzend_class_use_traits(class_entry, " . count($traits) . ", " . implode(", ", $traits) . ");\n";
3604+
$code .= "\tzend_class_use_internal_traits(class_entry, " . count($traits) . ", " . implode(", ", $traits) . ");\n";
36053605
}
36063606

36073607
if ($this->alias) {

ext/zend_test/test_arginfo.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/zend_test/tests/internal_class_trait.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--TEST--
2-
Test internal class using trait via zend_class_use_traits
2+
Test internal class using trait via zend_class_use_internal_traits
33
--EXTENSIONS--
44
zend_test
55
--FILE--

0 commit comments

Comments
 (0)