Skip to content

Commit f78216f

Browse files
committed
Extract early binding registration code
This is the same for the cached and uncached cases and will make GH-7311 a bit simpler.
1 parent 19061e3 commit f78216f

File tree

1 file changed

+16
-20
lines changed

1 file changed

+16
-20
lines changed

Zend/zend_inheritance.c

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3015,6 +3015,18 @@ static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_e
30153015
}
30163016
/* }}} */
30173017

3018+
static zend_always_inline bool register_early_bound_ce(zval *delayed_early_binding, zend_string *lcname, zend_class_entry *ce) {
3019+
if (delayed_early_binding) {
3020+
if (UNEXPECTED(zend_hash_set_bucket_key(EG(class_table), (Bucket *)delayed_early_binding, lcname) == NULL)) {
3021+
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
3022+
return false;
3023+
}
3024+
Z_CE_P(delayed_early_binding) = ce;
3025+
return true;
3026+
}
3027+
return zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL;
3028+
}
3029+
30183030
zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *parent_ce, zend_string *lcname, zval *delayed_early_binding) /* {{{ */
30193031
{
30203032
inheritance_status status;
@@ -3027,16 +3039,8 @@ zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *pa
30273039
if (zend_inheritance_cache_get && zend_inheritance_cache_add) {
30283040
zend_class_entry *ret = zend_inheritance_cache_get(ce, parent_ce, NULL);
30293041
if (ret) {
3030-
if (delayed_early_binding) {
3031-
if (UNEXPECTED(zend_hash_set_bucket_key(EG(class_table), (Bucket*)delayed_early_binding, lcname) == NULL)) {
3032-
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
3033-
return NULL;
3034-
}
3035-
Z_CE_P(delayed_early_binding) = ret;
3036-
} else {
3037-
if (UNEXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ret) == NULL)) {
3038-
return NULL;
3039-
}
3042+
if (UNEXPECTED(!register_early_bound_ce(delayed_early_binding, lcname, ret))) {
3043+
return NULL;
30403044
}
30413045
if (ZSTR_HAS_CE_CACHE(ret->name)) {
30423046
ZSTR_SET_CE_CACHE(ret->name, ret);
@@ -3063,16 +3067,8 @@ zend_class_entry *zend_try_early_bind(zend_class_entry *ce, zend_class_entry *pa
30633067
ce->ce_flags &= ~ZEND_ACC_FILE_CACHED;
30643068
}
30653069

3066-
if (delayed_early_binding) {
3067-
if (UNEXPECTED(zend_hash_set_bucket_key(EG(class_table), (Bucket*)delayed_early_binding, lcname) == NULL)) {
3068-
zend_error_noreturn(E_COMPILE_ERROR, "Cannot declare %s %s, because the name is already in use", zend_get_object_type(ce), ZSTR_VAL(ce->name));
3069-
return NULL;
3070-
}
3071-
Z_CE_P(delayed_early_binding) = ce;
3072-
} else {
3073-
if (UNEXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) == NULL)) {
3074-
return NULL;
3075-
}
3070+
if (UNEXPECTED(!register_early_bound_ce(delayed_early_binding, lcname, ce))) {
3071+
return NULL;
30763072
}
30773073

30783074
orig_linking_class = CG(current_linking_class);

0 commit comments

Comments
 (0)