Skip to content

Commit 366baeb

Browse files
committed
fix CI
1 parent 1692bfd commit 366baeb

3 files changed

Lines changed: 34 additions & 10 deletions

File tree

Zend/zend_execute.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,9 +345,16 @@ static zend_always_inline void zend_vm_init_call_frame(zend_execute_data *call,
345345
* call-frame teardown skips destroying it. VERIFY_GENERIC_ARGUMENTS may
346346
* still overwrite type_args later for explicit-turbofish calls. */
347347
if (UNEXPECTED(func->common.fn_flags & ZEND_ACC_CLOSURE)) {
348+
#if defined(__GNUC__) && !defined(__clang__)
349+
# pragma GCC diagnostic push
350+
# pragma GCC diagnostic ignored "-Warray-bounds"
351+
#endif
348352
const zend_closure *closure =
349353
(const zend_closure *) ZEND_CLOSURE_OBJECT(func);
350354
call->type_args = closure->captured_type_args;
355+
#if defined(__GNUC__) && !defined(__clang__)
356+
# pragma GCC diagnostic pop
357+
#endif
351358
} else if (UNEXPECTED(ZEND_USER_CODE(func->type)
352359
&& (func->op_array.fn_flags2 & ZEND_ACC2_MONOMORPH_TYPE_ARGS))) {
353360
/* Monomorph reached via by-name dispatch: bind its concrete type-arg table. */

Zend/zend_inheritance.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6107,6 +6107,8 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
61076107
zval *zv;
61086108
zend_string *synthesized_lc_parent = NULL;
61096109
zend_class_entry *cache_key_proto = NULL;
6110+
zend_class_name *detached_interface_names = NULL;
6111+
uint32_t detached_interface_count = 0;
61106112
ALLOCA_FLAG(use_heap)
61116113

61126114
SET_ALLOCA_FLAG(use_heap);
@@ -6142,6 +6144,8 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
61426144
zend_string_addref(ce->interface_names[k].name);
61436145
zend_string_addref(ce->interface_names[k].lc_name);
61446146
}
6147+
detached_interface_names = ce->interface_names;
6148+
detached_interface_count = ce->num_interfaces;
61456149
}
61466150
if (ce->num_traits) {
61476151
zend_class_name *src = ce->trait_names;
@@ -6230,9 +6234,8 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62306234
? ce->generic_types->trait_uses : NULL;
62316235
bool ce_is_mono_for_trait = zend_class_is_monomorph(ce);
62326236
bool *trait_skip_mono = NULL;
6233-
ALLOCA_FLAG(trait_skip_use_heap)
62346237
if (trait_uses_table_for_synth && ce->num_traits > 1) {
6235-
trait_skip_mono = do_alloca(sizeof(bool) * ce->num_traits, trait_skip_use_heap);
6238+
trait_skip_mono = emalloc(sizeof(bool) * ce->num_traits);
62366239
zend_mark_duplicate_lc_names(ce->trait_names, ce->num_traits, trait_skip_mono);
62376240
}
62386241

@@ -6257,14 +6260,14 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62576260
ZEND_FETCH_CLASS_TRAIT | ZEND_FETCH_CLASS_EXCEPTION);
62586261
if (UNEXPECTED(base_trait == NULL)) {
62596262
free_alloca(traits_and_interfaces, use_heap);
6260-
if (trait_skip_mono) free_alloca(trait_skip_mono, trait_skip_use_heap);
6263+
if (trait_skip_mono) efree(trait_skip_mono);
62616264
return NULL;
62626265
}
62636266
if (UNEXPECTED(!(base_trait->ce_flags & ZEND_ACC_TRAIT))) {
62646267
zend_throw_error(NULL, "%s cannot use %s - it is not a trait",
62656268
ZSTR_VAL(ce->name), ZSTR_VAL(base_trait->name));
62666269
free_alloca(traits_and_interfaces, use_heap);
6267-
if (trait_skip_mono) free_alloca(trait_skip_mono, trait_skip_use_heap);
6270+
if (trait_skip_mono) efree(trait_skip_mono);
62686271
return NULL;
62696272
}
62706273
if (base_trait->generic_parameters) {
@@ -6273,15 +6276,15 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62736276
if (EG(exception)) {
62746277
check_unrecoverable_load_failure(ce);
62756278
free_alloca(traits_and_interfaces, use_heap);
6276-
if (trait_skip_mono) free_alloca(trait_skip_mono, trait_skip_use_heap);
6279+
if (trait_skip_mono) efree(trait_skip_mono);
62776280
return NULL;
62786281
}
62796282
zend_class_entry *mono = zend_synthesize_monomorph(
62806283
base_trait, nwa->args, nwa->count);
62816284
if (!mono) {
62826285
check_unrecoverable_load_failure(ce);
62836286
free_alloca(traits_and_interfaces, use_heap);
6284-
if (trait_skip_mono) free_alloca(trait_skip_mono, trait_skip_use_heap);
6287+
if (trait_skip_mono) efree(trait_skip_mono);
62856288
return NULL;
62866289
}
62876290
zend_string_release(ce->trait_names[i].name);
@@ -6295,20 +6298,20 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
62956298
ce->trait_names[i].lc_name, ZEND_FETCH_CLASS_TRAIT | ZEND_FETCH_CLASS_EXCEPTION);
62966299
if (UNEXPECTED(trait == NULL)) {
62976300
free_alloca(traits_and_interfaces, use_heap);
6298-
if (trait_skip_mono) free_alloca(trait_skip_mono, trait_skip_use_heap);
6301+
if (trait_skip_mono) efree(trait_skip_mono);
62996302
return NULL;
63006303
}
63016304
if (UNEXPECTED(!(trait->ce_flags & ZEND_ACC_TRAIT))) {
63026305
zend_throw_error(NULL, "%s cannot use %s - it is not a trait", ZSTR_VAL(ce->name), ZSTR_VAL(trait->name));
63036306
free_alloca(traits_and_interfaces, use_heap);
6304-
if (trait_skip_mono) free_alloca(trait_skip_mono, trait_skip_use_heap);
6307+
if (trait_skip_mono) efree(trait_skip_mono);
63056308
return NULL;
63066309
}
63076310
if (UNEXPECTED(trait->ce_flags & ZEND_ACC_DEPRECATED)) {
63086311
zend_use_of_deprecated_trait(trait, ce->name);
63096312
if (UNEXPECTED(EG(exception))) {
63106313
free_alloca(traits_and_interfaces, use_heap);
6311-
if (trait_skip_mono) free_alloca(trait_skip_mono, trait_skip_use_heap);
6314+
if (trait_skip_mono) efree(trait_skip_mono);
63126315
return NULL;
63136316
}
63146317
}
@@ -6339,7 +6342,7 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
63396342
}
63406343
}
63416344
if (trait_skip_mono) {
6342-
free_alloca(trait_skip_mono, trait_skip_use_heap);
6345+
efree(trait_skip_mono);
63436346
}
63446347
}
63456348

@@ -6559,6 +6562,13 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
65596562
sizeof(zend_class_entry *) * ce->num_interfaces);
65606563

65616564
zend_do_implement_interfaces(ce, interfaces);
6565+
if (detached_interface_names) {
6566+
for (uint32_t k = 0; k < detached_interface_count; k++) {
6567+
zend_string_release_ex(detached_interface_names[k].name, 0);
6568+
zend_string_release_ex(detached_interface_names[k].lc_name, 0);
6569+
}
6570+
efree(detached_interface_names);
6571+
}
65626572
} else if (parent && parent->num_interfaces) {
65636573
zend_do_inherit_interfaces(ce, parent);
65646574
}

Zend/zend_opcode.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,13 @@ ZEND_API void destroy_zend_class(zval *zv)
657657
if (ce->num_traits > 0) {
658658
_destroy_zend_class_traits_info(ce);
659659
}
660+
} else if (ce->num_traits > 0) {
661+
uint32_t i;
662+
for (i = 0; i < ce->num_traits; i++) {
663+
zend_string_release_ex(ce->trait_names[i].name, 0);
664+
zend_string_release_ex(ce->trait_names[i].lc_name, 0);
665+
}
666+
efree(ce->trait_names);
660667
}
661668

662669
if (ce->default_properties_table) {

0 commit comments

Comments
 (0)