Avoid allocation in zend_enum_get_case_cstr() (#18239)

Future uses of this internal API are planned, and we can easily avoid an
allocation by factoring out the common code.
This commit is contained in:
Niels Dossche 2025-04-04 18:02:47 +02:00 committed by GitHub
parent bda9ff8338
commit d80682e753
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -610,8 +610,7 @@ ZEND_API void zend_enum_add_case_cstr(zend_class_entry *ce, const char *name, zv
zend_string_release(name_str); zend_string_release(name_str);
} }
ZEND_API zend_object *zend_enum_get_case(zend_class_entry *ce, zend_string *name) { static zend_object *zend_enum_case_from_class_constant(zend_class_constant *c) {
zend_class_constant *c = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), name);
ZEND_ASSERT(c && "Must be a valid enum case"); ZEND_ASSERT(c && "Must be a valid enum case");
ZEND_ASSERT(ZEND_CLASS_CONST_FLAGS(c) & ZEND_CLASS_CONST_IS_CASE); ZEND_ASSERT(ZEND_CLASS_CONST_FLAGS(c) & ZEND_CLASS_CONST_IS_CASE);
@ -624,9 +623,12 @@ ZEND_API zend_object *zend_enum_get_case(zend_class_entry *ce, zend_string *name
return Z_OBJ(c->value); return Z_OBJ(c->value);
} }
ZEND_API zend_object *zend_enum_get_case_cstr(zend_class_entry *ce, const char *name) { ZEND_API zend_object *zend_enum_get_case(zend_class_entry *ce, zend_string *name) {
zend_string *name_str = zend_string_init(name, strlen(name), 0); zend_class_constant *c = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), name);
zend_object *result = zend_enum_get_case(ce, name_str); return zend_enum_case_from_class_constant(c);
zend_string_release(name_str); }
return result;
ZEND_API zend_object *zend_enum_get_case_cstr(zend_class_entry *ce, const char *name) {
zend_class_constant *c = zend_hash_str_find_ptr(CE_CONSTANTS_TABLE(ce), name, strlen(name));
return zend_enum_case_from_class_constant(c);
} }