ReflectionClass::isCloneable(): reduce duplication (GH-17795)

When the `zend_class_entry` has a `zend_function` entry for `clone`, the logic
is the same regardless of if the `reflection_object` entry has an object or
not; the determination is based solely on the flags of the `zend_function`.
This commit is contained in:
DanielEScherzer 2025-02-14 07:50:33 -08:00 committed by GitHub
parent 77d748617a
commit 07e5f6fc3d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4828,24 +4828,19 @@ ZEND_METHOD(ReflectionClass, isCloneable)
if (ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS | ZEND_ACC_IMPLICIT_ABSTRACT_CLASS | ZEND_ACC_ENUM)) { if (ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS | ZEND_ACC_IMPLICIT_ABSTRACT_CLASS | ZEND_ACC_ENUM)) {
RETURN_FALSE; RETURN_FALSE;
} }
if (ce->clone) {
RETURN_BOOL(ce->clone->common.fn_flags & ZEND_ACC_PUBLIC);
}
if (!Z_ISUNDEF(intern->obj)) { if (!Z_ISUNDEF(intern->obj)) {
if (ce->clone) { RETURN_BOOL(Z_OBJ_HANDLER(intern->obj, clone_obj) != NULL);
RETURN_BOOL(ce->clone->common.fn_flags & ZEND_ACC_PUBLIC);
} else {
RETURN_BOOL(Z_OBJ_HANDLER(intern->obj, clone_obj) != NULL);
}
} else { } else {
if (ce->clone) { if (UNEXPECTED(object_init_ex(&obj, ce) != SUCCESS)) {
RETURN_BOOL(ce->clone->common.fn_flags & ZEND_ACC_PUBLIC); return;
} else {
if (UNEXPECTED(object_init_ex(&obj, ce) != SUCCESS)) {
return;
}
/* We're not calling the constructor, so don't call the destructor either. */
zend_object_store_ctor_failed(Z_OBJ(obj));
RETVAL_BOOL(Z_OBJ_HANDLER(obj, clone_obj) != NULL);
zval_ptr_dtor(&obj);
} }
/* We're not calling the constructor, so don't call the destructor either. */
zend_object_store_ctor_failed(Z_OBJ(obj));
RETVAL_BOOL(Z_OBJ_HANDLER(obj, clone_obj) != NULL);
zval_ptr_dtor(&obj);
} }
} }
/* }}} */ /* }}} */