From 278ee78d08c2876e490cce2b1e99f106ba911cef Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 15 Oct 2026 01:23:03 +0100 Subject: [PATCH] Zend: add zend_cannot_instantiate_class() --- Zend/zend_API.c | 11 +---------- Zend/zend_lazy_objects.c | 6 +----- Zend/zend_objects_API.c | 15 +++++++++++++++ Zend/zend_objects_API.h | 2 ++ 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index c3a0b4cfbafb..de7c3bfc341b 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1873,16 +1873,7 @@ ZEND_API void object_properties_load(zend_object *object, const HashTable *prope static zend_always_inline zend_result _object_and_properties_init(zval *arg, zend_class_entry *ce, HashTable *properties) /* {{{ */ { if (UNEXPECTED(ce->ce_flags & ZEND_ACC_UNINSTANTIABLE)) { - if (ce->ce_flags & ZEND_ACC_INTERFACE) { - zend_throw_error(NULL, "Cannot instantiate interface %s", ZSTR_VAL(ce->name)); - } else if (ce->ce_flags & ZEND_ACC_TRAIT) { - zend_throw_error(NULL, "Cannot instantiate trait %s", ZSTR_VAL(ce->name)); - } else if (ce->ce_flags & ZEND_ACC_ENUM) { - zend_throw_error(NULL, "Cannot instantiate enum %s", ZSTR_VAL(ce->name)); - } else { - ZEND_ASSERT(ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)); - zend_throw_error(NULL, "Cannot instantiate abstract class %s", ZSTR_VAL(ce->name)); - } + zend_cannot_instantiate_class(ce); ZVAL_NULL(arg); Z_OBJ_P(arg) = NULL; return FAILURE; diff --git a/Zend/zend_lazy_objects.c b/Zend/zend_lazy_objects.c index de9538bbb4c4..17f2f3a344c5 100644 --- a/Zend/zend_lazy_objects.c +++ b/Zend/zend_lazy_objects.c @@ -260,11 +260,7 @@ ZEND_API zend_object *zend_object_make_lazy(zend_object *obj, if (!obj) { if (UNEXPECTED(reflection_ce->ce_flags & ZEND_ACC_UNINSTANTIABLE)) { - zval zobj; - /* Call object_init_ex() for the generated exception */ - zend_result result = object_init_ex(&zobj, reflection_ce); - ZEND_ASSERT(result == FAILURE && EG(exception)); - (void)result; + zend_cannot_instantiate_class(reflection_ce); return NULL; } diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 537cad8a3644..12362ab929b7 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -211,3 +211,18 @@ ZEND_API ZEND_COLD zend_property_info *zend_get_property_info_for_slot_slow(zend } ZEND_HASH_FOREACH_END(); return NULL; } + +ZEND_API ZEND_COLD zend_never_inline void zend_cannot_instantiate_class( + const zend_class_entry *ce +) { + ZEND_ASSERT(ce->ce_flags & ZEND_ACC_UNINSTANTIABLE); + if (ce->ce_flags & ZEND_ACC_INTERFACE) { + zend_throw_error(NULL, "Cannot instantiate interface %s", ZSTR_VAL(ce->name)); + } else if (ce->ce_flags & ZEND_ACC_TRAIT) { + zend_throw_error(NULL, "Cannot instantiate trait %s", ZSTR_VAL(ce->name)); + } else if (ce->ce_flags & ZEND_ACC_ENUM) { + zend_throw_error(NULL, "Cannot instantiate enum %s", ZSTR_VAL(ce->name)); + } else if (ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) { + zend_throw_error(NULL, "Cannot instantiate abstract class %s", ZSTR_VAL(ce->name)); + } +} diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h index b66a3d307e55..0c1acb90f598 100644 --- a/Zend/zend_objects_API.h +++ b/Zend/zend_objects_API.h @@ -160,4 +160,6 @@ static zend_always_inline bool zend_check_method_accessible(const zend_function return true; } +ZEND_API ZEND_COLD zend_never_inline void zend_cannot_instantiate_class(const zend_class_entry *ce); + #endif /* ZEND_OBJECTS_H */