]> granicus.if.org Git - php/commitdiff
Export the zend_string_concat3() API
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 9 Apr 2020 13:06:53 +0000 (15:06 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 9 Apr 2020 13:06:53 +0000 (15:06 +0200)
Zend/zend_API.c
Zend/zend_compile.c
Zend/zend_string.c
Zend/zend_string.h
ext/opcache/Optimizer/compact_literals.c

index 4db760482ae1f7d1d1e01ff5d413e5ecec835451..1b132d64c90dca5774fdf503b3dec6662dcd21fa 100644 (file)
@@ -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;
index 1f0c6325bd2dc816ade9feae73e1f5063421280a..1f7ee48beef23df59debfe83533a897cdcfd4643 100644 (file)
@@ -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);
index 75e7e6249f48a92f707b6076bf0359750d4e28fb..3caeeb7a9ac3e191d97e399905eac175f4d93efe 100644 (file)
@@ -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;
+}
index f2076beee10c836749dcabbd8a94b9004568003e..bb75d816c44114a7900f97b339d772bd0c004ef9 100644 (file)
@@ -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);
index bd49891429db9c6424a2330b90b6fcd298d7f666..f6f32e45145fe64e11b61c2127681241ad8641a9 100644 (file)
@@ -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;