Skip to content

Commit d80682e

Browse files
authored
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.
1 parent bda9ff8 commit d80682e

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

Zend/zend_enum.c

+8-6
Original file line numberDiff line numberDiff line change
@@ -610,8 +610,7 @@ ZEND_API void zend_enum_add_case_cstr(zend_class_entry *ce, const char *name, zv
610610
zend_string_release(name_str);
611611
}
612612

613-
ZEND_API zend_object *zend_enum_get_case(zend_class_entry *ce, zend_string *name) {
614-
zend_class_constant *c = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), name);
613+
static zend_object *zend_enum_case_from_class_constant(zend_class_constant *c) {
615614
ZEND_ASSERT(c && "Must be a valid enum case");
616615
ZEND_ASSERT(ZEND_CLASS_CONST_FLAGS(c) & ZEND_CLASS_CONST_IS_CASE);
617616

@@ -624,9 +623,12 @@ ZEND_API zend_object *zend_enum_get_case(zend_class_entry *ce, zend_string *name
624623
return Z_OBJ(c->value);
625624
}
626625

626+
ZEND_API zend_object *zend_enum_get_case(zend_class_entry *ce, zend_string *name) {
627+
zend_class_constant *c = zend_hash_find_ptr(CE_CONSTANTS_TABLE(ce), name);
628+
return zend_enum_case_from_class_constant(c);
629+
}
630+
627631
ZEND_API zend_object *zend_enum_get_case_cstr(zend_class_entry *ce, const char *name) {
628-
zend_string *name_str = zend_string_init(name, strlen(name), 0);
629-
zend_object *result = zend_enum_get_case(ce, name_str);
630-
zend_string_release(name_str);
631-
return result;
632+
zend_class_constant *c = zend_hash_str_find_ptr(CE_CONSTANTS_TABLE(ce), name, strlen(name));
633+
return zend_enum_case_from_class_constant(c);
632634
}

0 commit comments

Comments
 (0)