23# include "valgrind/callgrind.h"
26#if __has_feature(memory_sanitizer)
27# include <sanitizer/msan_interface.h>
45static HashTable interned_strings_permanent;
62 return zend_inline_hash_func(str,
len);
65static void _str_dtor(
zval *
zv)
71static const char *known_strings[] = {
72#define _ZEND_STR_DSC(id, str) str,
92 interned_string_request_handler = zend_new_interned_string_request;
93 interned_string_init_request_handler = zend_string_init_interned_request;
94 interned_string_init_existing_request_handler = zend_string_init_existing_interned_request;
99 zend_init_interned_strings_ht(&interned_strings_permanent, 1);
106 str = zend_string_alloc(
sizeof(
"")-1, 1);
112 for (i = 0; i < 256; i++) {
122 for (i = 0; i < (
sizeof(known_strings) /
sizeof(known_strings[0])) - 1; i++) {
123 str = zend_string_init(known_strings[i],
strlen(known_strings[i]), 1);
144 idx =
HT_HASH(interned_strings, nIndex);
147 if ((
p->h == h) && zend_string_equals_cstr(
p->key, str,
size)) {
164 idx =
HT_HASH(interned_strings, nIndex);
167 if ((
p->h == h) && zend_string_equal_content(
p->key, str)) {
194 zend_string_hash_val(str);
195 return zend_interned_string_ht_lookup(str, &interned_strings_permanent);
202 zend_string_delref(str);
217 zend_string_hash_val(str);
218 ret = zend_interned_string_ht_lookup(str, &interned_strings_permanent);
220 zend_string_release(str);
226 str = zend_init_string_for_interning(str,
true);
229 return zend_add_interned_string(str, &interned_strings_permanent,
IS_STR_PERMANENT);
240 zend_string_hash_val(str);
243 ret = zend_interned_string_ht_lookup(str, &interned_strings_permanent);
245 zend_string_release(str);
249 ret = zend_interned_string_ht_lookup(str, &
CG(interned_strings));
251 zend_string_release(str);
264 str = zend_init_string_for_interning(str,
false);
267 ret = zend_add_interned_string(str, &
CG(interned_strings), 0);
277 ret = zend_interned_string_ht_lookup_ex(h, str,
size, &interned_strings_permanent);
283 ret = zend_string_init(str,
size, permanent);
291 zend_string *
ret = zend_interned_string_ht_lookup_ex(h, str,
size, &interned_strings_permanent);
297 ret = zend_string_init(str,
size, permanent);
308 ret = zend_interned_string_ht_lookup_ex(h, str,
size, &interned_strings_permanent);
313 ret = zend_interned_string_ht_lookup_ex(h, str,
size, &
CG(interned_strings));
325 ret = zend_string_init(str,
size, permanent);
329 return zend_add_interned_string(
ret, &
CG(interned_strings), 0);
335 zend_string *
ret = zend_interned_string_ht_lookup_ex(h, str,
size, &interned_strings_permanent);
340 ret = zend_interned_string_ht_lookup_ex(h, str,
size, &
CG(interned_strings));
346 ret = zend_string_init(str,
size, permanent);
353 zend_init_interned_strings_ht(&
CG(interned_strings), 0);
363 interned_string_request_handler =
handler;
364 interned_string_init_request_handler = init_handler;
365 interned_string_init_existing_request_handler = init_existing_handler;
381#if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__)))
384#ifndef I_REPLACE_SONAME_FNNAME_ZU
385# define I_REPLACE_SONAME_FNNAME_ZU(soname, fnname) _vgr00000ZU_ ## soname ## _ ## fnname
389#if __has_attribute(noipa)
390# define NOIPA __attribute__((noipa))
401#if defined(__GNUC__) && defined(__i386__)
405 uintptr_t delta = (uintptr_t) s2 - (uintptr_t) s1;
411 "movl (%2,%3), %0\n\t"
426 "lea 0x20(,%1,8), %1\n\t"
439#elif defined(__GNUC__) && defined(__x86_64__) && !defined(__ILP32__)
443 uintptr_t delta = (uintptr_t) s2 - (uintptr_t) s1;
449 "movq (%2,%3), %0\n\t"
464 "lea 0x40(,%1,8), %1\n\t"
479 const char *str1,
size_t str1_len,
480 const char *str2,
size_t str2_len)
482 size_t len = str1_len + str2_len;
493 const char *str1,
size_t str1_len,
494 const char *str2,
size_t str2_len,
495 const char *str3,
size_t str3_len)
497 size_t len = str1_len + str2_len + str3_len;
509#if __has_feature(memory_sanitizer)
510static size_t (*libc_strlcpy)(
char *__restrict,
const char *__restrict, size_t);
511size_t strlcpy(
char *__restrict dest,
const char *__restrict src,
size_t n)
514 libc_strlcpy = dlsym(RTLD_NEXT,
"strlcpy");
516 size_t result = libc_strlcpy(dest, src,
n);
517 __msan_unpoison_string(dest);
520static size_t (*libc_strlcat)(
char *__restrict,
const char *__restrict, size_t);
521size_t strlcat (
char *__restrict dest,
const char *restrict src,
size_t n)
524 libc_strlcat = dlsym(RTLD_NEXT,
"strlcat");
526 size_t result = libc_strlcat(dest, src,
n);
527 __msan_unpoison_string(dest);
#define pefree(ptr, persistent)
#define pemalloc(size, persistent)
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
ZEND_API zval *ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData)
ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht)
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
struct _zend_string zend_string
#define zend_never_inline
#define zend_always_inline
ZEND_API zend_string * zend_string_concat2(const char *str1, size_t str1_len, const char *str2, size_t str2_len)
ZEND_API zend_string * zend_one_char_string[256]
ZEND_API void zend_interned_strings_init(void)
ZEND_API void zend_interned_strings_set_request_storage_handlers(zend_new_interned_string_func_t handler, zend_string_init_interned_func_t init_handler, zend_string_init_existing_interned_func_t init_existing_handler)
ZEND_API void zend_interned_strings_deactivate(void)
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 void zend_interned_strings_dtor(void)
ZEND_API zend_ulong ZEND_FASTCALL zend_string_hash_func(zend_string *str)
ZEND_API zend_string_init_existing_interned_func_t zend_string_init_existing_interned
ZEND_API zend_string ** zend_known_strings
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 zend_string_init_interned_func_t zend_string_init_interned
ZEND_API zend_new_interned_string_func_t zend_new_interned_string
ZEND_API void zend_interned_strings_activate(void)
#define _ZEND_STR_DSC(id, str)
ZEND_API void zend_interned_strings_switch_storage(bool request)
ZEND_API zend_string * zend_empty_string
#define ZEND_KNOWN_STRINGS(_)
zend_string *(ZEND_FASTCALL * zend_string_init_existing_interned_func_t)(const char *str, size_t size, bool permanent)
#define ZSTR_IS_INTERNED(s)
zend_string *(ZEND_FASTCALL * zend_string_init_interned_func_t)(const char *str, size_t size, bool permanent)
zend_string *(ZEND_FASTCALL * zend_new_interned_string_func_t)(zend_string *str)
#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s)
#define GC_SET_REFCOUNT(p, rc)
#define HT_HASH_TO_BUCKET(ht, idx)
struct _zend_array HashTable
#define IS_STR_VALID_UTF8
#define ZVAL_INTERNED_STR(z, s)
#define IS_STR_PERSISTENT
#define GC_ADD_FLAGS(p, flags)
fbc internal_function handler(call, ret)