diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-04-09 15:06:53 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-04-09 15:06:53 +0200 |
commit | d030ddb2cd27099dfd0d6a885b9aa9c9bdc3843c (patch) | |
tree | 7c35ccf8fd029defbee39188121d82d2510909d1 | |
parent | 696ae335e3ef271a50f7f901725bb48c5b25bda9 (diff) | |
download | php-git-d030ddb2cd27099dfd0d6a885b9aa9c9bdc3843c.tar.gz |
Export the zend_string_concat3() API
-rw-r--r-- | Zend/zend_API.c | 12 | ||||
-rw-r--r-- | Zend/zend_compile.c | 19 | ||||
-rw-r--r-- | Zend/zend_string.c | 16 | ||||
-rw-r--r-- | Zend/zend_string.h | 5 | ||||
-rw-r--r-- | ext/opcache/Optimizer/compact_literals.c | 13 |
5 files changed, 32 insertions, 33 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 4db760482a..1b132d64c9 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -30,7 +30,6 @@ #include "zend_closures.h" #include "zend_inheritance.h" #include "zend_ini.h" -#include "zend_smart_str.h" #include <stdarg.h> @@ -4315,14 +4314,11 @@ static int get_default_via_ast(zval *default_value_zval, const char *default_val zend_ast *ast; zend_arena *ast_arena; - smart_str code = {0}; - smart_str_appends(&code, "<?php "); - smart_str_appends(&code, default_value); - smart_str_appendc(&code, ';'); - smart_str_0(&code); + zend_string *code = zend_string_concat3( + "<?php ", sizeof("<?php ") - 1, default_value, strlen(default_value), ";", 1); - ast = zend_compile_string_to_ast(code.s, &ast_arena, ""); - smart_str_free(&code); + ast = zend_compile_string_to_ast(code, &ast_arena, ""); + zend_string_release(code); if (!ast) { return FAILURE; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 1f0c6325bd..1f7ee48bee 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -852,21 +852,8 @@ uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag) /* {{{ */ } /* }}} */ -zend_string *zend_concat3(char *str1, size_t str1_len, char *str2, size_t str2_len, char *str3, size_t str3_len) /* {{{ */ -{ - size_t len = str1_len + str2_len + str3_len; - zend_string *res = zend_string_alloc(len, 0); - - memcpy(ZSTR_VAL(res), str1, str1_len); - memcpy(ZSTR_VAL(res) + str1_len, str2, str2_len); - memcpy(ZSTR_VAL(res) + str1_len + str2_len, str3, str3_len); - ZSTR_VAL(res)[len] = '\0'; - - return res; -} - zend_string *zend_concat_names(char *name1, size_t name1_len, char *name2, size_t name2_len) { - return zend_concat3(name1, name1_len, "\\", 1, name2, name2_len); + return zend_string_concat3(name1, name1_len, "\\", 1, name2, name2_len); } zend_string *zend_prefix_with_ns(zend_string *name) { @@ -7173,7 +7160,7 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */ } if (op_array && op_array->function_name) { if (op_array->scope) { - ZVAL_NEW_STR(zv, zend_concat3( + ZVAL_NEW_STR(zv, zend_string_concat3( ZSTR_VAL(op_array->scope->name), ZSTR_LEN(op_array->scope->name), "::", 2, ZSTR_VAL(op_array->function_name), ZSTR_LEN(op_array->function_name))); @@ -8566,7 +8553,7 @@ void zend_compile_const_expr_class_const(zend_ast **ast_ptr) /* {{{ */ zend_string_addref(class_name); } - name = zend_concat3( + name = zend_string_concat3( ZSTR_VAL(class_name), ZSTR_LEN(class_name), "::", 2, ZSTR_VAL(const_name), ZSTR_LEN(const_name)); zend_ast_destroy(ast); diff --git a/Zend/zend_string.c b/Zend/zend_string.c index 75e7e6249f..3caeeb7a9a 100644 --- a/Zend/zend_string.c +++ b/Zend/zend_string.c @@ -461,3 +461,19 @@ ZEND_API zend_bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_ #endif #endif + +ZEND_API zend_string *zend_string_concat3( + const char *str1, size_t str1_len, + const char *str2, size_t str2_len, + const char *str3, size_t str3_len) +{ + size_t len = str1_len + str2_len + str3_len; + zend_string *res = zend_string_alloc(len, 0); + + memcpy(ZSTR_VAL(res), str1, str1_len); + memcpy(ZSTR_VAL(res) + str1_len, str2, str2_len); + memcpy(ZSTR_VAL(res) + str1_len + str2_len, str3, str3_len); + ZSTR_VAL(res)[len] = '\0'; + + return res; +} diff --git a/Zend/zend_string.h b/Zend/zend_string.h index f2076beee1..bb75d816c4 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -34,6 +34,11 @@ ZEND_API zend_ulong ZEND_FASTCALL zend_string_hash_func(zend_string *str); ZEND_API zend_ulong ZEND_FASTCALL zend_hash_func(const char *str, size_t len); ZEND_API zend_string* ZEND_FASTCALL zend_interned_string_find_permanent(zend_string *str); +ZEND_API zend_string *zend_string_concat3( + const char *str1, size_t str1_len, + const char *str2, size_t str2_len, + const char *str3, size_t str3_len); + ZEND_API void zend_interned_strings_init(void); ZEND_API void zend_interned_strings_dtor(void); ZEND_API void zend_interned_strings_activate(void); diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index bd49891429..f6f32e4514 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -92,19 +92,14 @@ static uint32_t add_static_slot(HashTable *hash, int *cache_size) { uint32_t ret; - zend_string *key; - size_t key_len; zval *class_name = &op_array->literals[op1]; zval *prop_name = &op_array->literals[op2]; zval *pos, tmp; - key_len = Z_STRLEN_P(class_name) + sizeof("::") - 1 + Z_STRLEN_P(prop_name); - key = zend_string_alloc(key_len, 0); - memcpy(ZSTR_VAL(key), Z_STRVAL_P(class_name), Z_STRLEN_P(class_name)); - memcpy(ZSTR_VAL(key) + Z_STRLEN_P(class_name), "::", sizeof("::") - 1); - memcpy(ZSTR_VAL(key) + Z_STRLEN_P(class_name) + sizeof("::") - 1, - Z_STRVAL_P(prop_name), - Z_STRLEN_P(prop_name) + 1); + zend_string *key = zend_string_concat3( + Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), + "::", sizeof("::") - 1, + Z_STRVAL_P(prop_name), Z_STRLEN_P(prop_name)); ZSTR_H(key) = zend_string_hash_func(key); ZSTR_H(key) += kind; |