Skip to content

Commit bac5137

Browse files
committed
Add zend_create_member_string() API
This is a recurring pattern.
1 parent d0006b5 commit bac5137

File tree

4 files changed

+15
-26
lines changed

4 files changed

+15
-26
lines changed

Zend/zend_API.c

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3102,25 +3102,13 @@ static zend_always_inline int zend_is_callable_check_func(int check_flags, zval
31023102
}
31033103
/* }}} */
31043104

3105-
static zend_string *zend_create_method_string(zend_string *class_name, zend_string *method_name) {
3106-
zend_string *callable_name = zend_string_alloc(
3107-
ZSTR_LEN(class_name) + ZSTR_LEN(method_name) + sizeof("::") - 1, 0);
3108-
char *ptr = ZSTR_VAL(callable_name);
3109-
memcpy(ptr, ZSTR_VAL(class_name), ZSTR_LEN(class_name));
3110-
ptr += ZSTR_LEN(class_name);
3111-
memcpy(ptr, "::", sizeof("::") - 1);
3112-
ptr += sizeof("::") - 1;
3113-
memcpy(ptr, ZSTR_VAL(method_name), ZSTR_LEN(method_name) + 1);
3114-
return callable_name;
3115-
}
3116-
31173105
ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, zend_object *object) /* {{{ */
31183106
{
31193107
try_again:
31203108
switch (Z_TYPE_P(callable)) {
31213109
case IS_STRING:
31223110
if (object) {
3123-
return zend_create_method_string(object->ce->name, Z_STR_P(callable));
3111+
return zend_create_member_string(object->ce->name, Z_STR_P(callable));
31243112
}
31253113
return zend_string_copy(Z_STR_P(callable));
31263114

@@ -3139,9 +3127,9 @@ ZEND_API zend_string *zend_get_callable_name_ex(zval *callable, zend_object *obj
31393127
}
31403128

31413129
if (Z_TYPE_P(obj) == IS_STRING) {
3142-
return zend_create_method_string(Z_STR_P(obj), Z_STR_P(method));
3130+
return zend_create_member_string(Z_STR_P(obj), Z_STR_P(method));
31433131
} else if (Z_TYPE_P(obj) == IS_OBJECT) {
3144-
return zend_create_method_string(Z_OBJCE_P(obj)->name, Z_STR_P(method));
3132+
return zend_create_member_string(Z_OBJCE_P(obj)->name, Z_STR_P(method));
31453133
} else {
31463134
return ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED);
31473135
}

Zend/zend_compile.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,13 @@ uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag) /* {{{ */
852852
}
853853
/* }}} */
854854

855+
ZEND_API zend_string *zend_create_member_string(zend_string *class_name, zend_string *member_name) {
856+
return zend_string_concat3(
857+
ZSTR_VAL(class_name), ZSTR_LEN(class_name),
858+
"::", sizeof("::") - 1,
859+
ZSTR_VAL(member_name), ZSTR_LEN(member_name));
860+
}
861+
855862
zend_string *zend_concat_names(char *name1, size_t name1_len, char *name2, size_t name2_len) {
856863
return zend_string_concat3(name1, name1_len, "\\", 1, name2, name2_len);
857864
}
@@ -7160,10 +7167,8 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
71607167
}
71617168
if (op_array && op_array->function_name) {
71627169
if (op_array->scope) {
7163-
ZVAL_NEW_STR(zv, zend_string_concat3(
7164-
ZSTR_VAL(op_array->scope->name), ZSTR_LEN(op_array->scope->name),
7165-
"::", 2,
7166-
ZSTR_VAL(op_array->function_name), ZSTR_LEN(op_array->function_name)));
7170+
ZVAL_NEW_STR(zv,
7171+
zend_create_member_string(op_array->scope->name, op_array->function_name));
71677172
} else {
71687173
ZVAL_STR_COPY(zv, op_array->function_name);
71697174
}
@@ -8553,8 +8558,7 @@ void zend_compile_const_expr_class_const(zend_ast **ast_ptr) /* {{{ */
85538558
zend_string_addref(class_name);
85548559
}
85558560

8556-
name = zend_string_concat3(
8557-
ZSTR_VAL(class_name), ZSTR_LEN(class_name), "::", 2, ZSTR_VAL(const_name), ZSTR_LEN(const_name));
8561+
name = zend_create_member_string(class_name, const_name);
85588562

85598563
zend_ast_destroy(ast);
85608564
zend_string_release_ex(class_name, 0);

Zend/zend_compile.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,7 @@ ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle);
783783
ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce);
784784
ZEND_API void zend_cleanup_internal_classes(void);
785785
ZEND_API void zend_type_release(zend_type type, zend_bool persistent);
786+
ZEND_API zend_string *zend_create_member_string(zend_string *class_name, zend_string *member_name);
786787

787788

788789
ZEND_API ZEND_COLD void zend_user_exception_handler(void);

ext/opcache/Optimizer/compact_literals.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,7 @@ static uint32_t add_static_slot(HashTable *hash,
9696
zval *prop_name = &op_array->literals[op2];
9797
zval *pos, tmp;
9898

99-
zend_string *key = zend_string_concat3(
100-
Z_STRVAL_P(class_name), Z_STRLEN_P(class_name),
101-
"::", sizeof("::") - 1,
102-
Z_STRVAL_P(prop_name), Z_STRLEN_P(prop_name));
103-
99+
zend_string *key = zend_create_member_string(Z_STR_P(class_name), Z_STR_P(prop_name));
104100
ZSTR_H(key) = zend_string_hash_func(key);
105101
ZSTR_H(key) += kind;
106102

0 commit comments

Comments
 (0)