43 const
char *str1,
size_t str1_len,
44 const
char *str2,
size_t str2_len);
46 const
char *str1,
size_t str1_len,
47 const
char *str2,
size_t str2_len,
48 const
char *str3,
size_t str3_len);
68#define ZSTR_VAL(zstr) (zstr)->val
69#define ZSTR_LEN(zstr) (zstr)->len
70#define ZSTR_H(zstr) (zstr)->h
71#define ZSTR_HASH(zstr) zend_string_hash_val(zstr)
75#define IS_INTERNED(s) ZSTR_IS_INTERNED(s)
76#define STR_EMPTY_ALLOC() ZSTR_EMPTY_ALLOC()
77#define _STR_HEADER_SIZE _ZSTR_HEADER_SIZE
78#define STR_ALLOCA_ALLOC(str, _len, use_heap) ZSTR_ALLOCA_ALLOC(str, _len, use_heap)
79#define STR_ALLOCA_INIT(str, s, len, use_heap) ZSTR_ALLOCA_INIT(str, s, len, use_heap)
80#define STR_ALLOCA_FREE(str, use_heap) ZSTR_ALLOCA_FREE(str, use_heap)
84#define ZSTR_IS_INTERNED(s) (GC_FLAGS(s) & IS_STR_INTERNED)
85#define ZSTR_IS_VALID_UTF8(s) (GC_FLAGS(s) & IS_STR_VALID_UTF8)
90#define ZSTR_COPYABLE_CONCAT_PROPERTIES (IS_STR_VALID_UTF8)
92#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES(s) (GC_FLAGS(s) & ZSTR_COPYABLE_CONCAT_PROPERTIES)
94#define ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH(s1, s2) (GC_FLAGS(s1) & GC_FLAGS(s2) & ZSTR_COPYABLE_CONCAT_PROPERTIES)
96#define ZSTR_COPY_CONCAT_PROPERTIES(out, in) do { \
97 zend_string *_out = (out); \
98 uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES((in)); \
99 GC_ADD_FLAGS(_out, properties); \
102#define ZSTR_COPY_CONCAT_PROPERTIES_BOTH(out, in1, in2) do { \
103 zend_string *_out = (out); \
104 uint32_t properties = ZSTR_GET_COPYABLE_CONCAT_PROPERTIES_BOTH((in1), (in2)); \
105 GC_ADD_FLAGS(_out, properties); \
108#define ZSTR_EMPTY_ALLOC() zend_empty_string
109#define ZSTR_CHAR(c) zend_one_char_string[c]
110#define ZSTR_KNOWN(idx) zend_known_strings[idx]
112#define _ZSTR_HEADER_SIZE XtOffsetOf(zend_string, val)
114#define _ZSTR_STRUCT_SIZE(len) (_ZSTR_HEADER_SIZE + len + 1)
116#define ZSTR_MAX_OVERHEAD (ZEND_MM_ALIGNED_SIZE(_ZSTR_HEADER_SIZE + 1))
117#define ZSTR_MAX_LEN (SIZE_MAX - ZSTR_MAX_OVERHEAD)
119#define ZSTR_ALLOCA_ALLOC(str, _len, use_heap) do { \
120 (str) = (zend_string *)do_alloca(ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE(_len), 8), (use_heap)); \
121 GC_SET_REFCOUNT(str, 1); \
122 GC_TYPE_INFO(str) = GC_STRING; \
124 ZSTR_LEN(str) = _len; \
127#define ZSTR_ALLOCA_INIT(str, s, len, use_heap) do { \
128 ZSTR_ALLOCA_ALLOC(str, len, use_heap); \
129 memcpy(ZSTR_VAL(str), (s), (len)); \
130 ZSTR_VAL(str)[(len)] = '\0'; \
133#define ZSTR_ALLOCA_FREE(str, use_heap) free_alloca(str, use_heap)
135#define ZSTR_INIT_LITERAL(s, persistent) (zend_string_init((s), strlen(s), (persistent)))
208 return zend_string_init(str,
len, 0);
209 }
else if (
len == 0) {
242 zend_string_forget_hash_val(
s);
254 zend_string_forget_hash_val(
ret);
275 zend_string_forget_hash_val(
ret);
296 zend_string_forget_hash_val(
ret);
316 zend_string_forget_hash_val(
ret);
373#if defined(__GNUC__) && (defined(__i386__) || (defined(__x86_64__) && !defined(__ILP32__)))
391 return s1 == s2 || zend_string_equal_content(s1, s2);
394#define zend_string_equals_ci(s1, s2) \
395 (ZSTR_LEN(s1) == ZSTR_LEN(s2) && !zend_binary_strcasecmp(ZSTR_VAL(s1), ZSTR_LEN(s1), ZSTR_VAL(s2), ZSTR_LEN(s2)))
397#define zend_string_equals_literal_ci(str, c) \
398 (ZSTR_LEN(str) == sizeof("" c) - 1 && !zend_binary_strcasecmp(ZSTR_VAL(str), ZSTR_LEN(str), (c), sizeof(c) - 1))
400#define zend_string_equals_literal(str, literal) \
401 zend_string_equals_cstr(str, "" literal, sizeof(literal) - 1)
413#define zend_string_starts_with_literal(str, prefix) \
414 zend_string_starts_with_cstr(str, prefix, strlen(prefix))
426#define zend_string_starts_with_literal_ci(str, prefix) \
427 zend_string_starts_with_cstr_ci(str, prefix, strlen(prefix))
466#if defined(_WIN32) || defined(__i386__) || defined(__x86_64__) || defined(__aarch64__)
468 for (;
len >= 8;
len -= 8, str += 8) {
469# if defined(__aarch64__) && !defined(WORDS_BIGENDIAN)
474 memcpy(&chunk, str,
sizeof(chunk));
476 hash * 33 * 33 * 33 * 33 +
477 ((chunk >> (8 * 0)) & 0xff) * 33 * 33 * 33 +
478 ((chunk >> (8 * 1)) & 0xff) * 33 * 33 +
479 ((chunk >> (8 * 2)) & 0xff) * 33 +
480 ((chunk >> (8 * 3)) & 0xff);
482 hash * 33 * 33 * 33 * 33 +
483 ((chunk >> (8 * 4)) & 0xff) * 33 * 33 * 33 +
484 ((chunk >> (8 * 5)) & 0xff) * 33 * 33 +
485 ((chunk >> (8 * 6)) & 0xff) * 33 +
486 ((chunk >> (8 * 7)) & 0xff);
489 hash *
Z_L(33 * 33 * 33 * 33) +
490 str[0] *
Z_L(33 * 33 * 33) +
491 str[1] *
Z_L(33 * 33) +
495 hash *
Z_L(33 * 33 * 33 * 33) +
496 str[4] *
Z_L(33 * 33 * 33) +
497 str[5] *
Z_L(33 * 33) +
504 hash *
Z_L(33 * 33 * 33 * 33) +
505 str[0] *
Z_L(33 * 33 * 33) +
506 str[1] *
Z_L(33 * 33) +
516 str[0] *
Z_L(33 * 33) +
525 }
else if (
len != 0) {
530 for (;
len >= 8;
len -= 8) {
554#if SIZEOF_ZEND_LONG == 8
555 return hash |
Z_UL(0x8000000000000000);
556#elif SIZEOF_ZEND_LONG == 4
559# error "Unknown SIZEOF_ZEND_LONG"
563#define ZEND_KNOWN_STRINGS(_) \
564 _(ZEND_STR_FILE, "file") \
565 _(ZEND_STR_LINE, "line") \
566 _(ZEND_STR_FUNCTION, "function") \
567 _(ZEND_STR_CLASS, "class") \
568 _(ZEND_STR_OBJECT, "object") \
569 _(ZEND_STR_TYPE, "type") \
570 _(ZEND_STR_OBJECT_OPERATOR, "->") \
571 _(ZEND_STR_PAAMAYIM_NEKUDOTAYIM, "::") \
572 _(ZEND_STR_ARGS, "args") \
573 _(ZEND_STR_UNKNOWN, "unknown") \
574 _(ZEND_STR_UNKNOWN_CAPITALIZED, "Unknown") \
575 _(ZEND_STR_EXIT, "exit") \
576 _(ZEND_STR_EVAL, "eval") \
577 _(ZEND_STR_INCLUDE, "include") \
578 _(ZEND_STR_REQUIRE, "require") \
579 _(ZEND_STR_INCLUDE_ONCE, "include_once") \
580 _(ZEND_STR_REQUIRE_ONCE, "require_once") \
581 _(ZEND_STR_SCALAR, "scalar") \
582 _(ZEND_STR_ERROR_REPORTING, "error_reporting") \
583 _(ZEND_STR_STATIC, "static") \
584 _(ZEND_STR_THIS, "this") \
585 _(ZEND_STR_VALUE, "value") \
586 _(ZEND_STR_KEY, "key") \
587 _(ZEND_STR_MAGIC_INVOKE, "__invoke") \
588 _(ZEND_STR_PREVIOUS, "previous") \
589 _(ZEND_STR_CODE, "code") \
590 _(ZEND_STR_MESSAGE, "message") \
591 _(ZEND_STR_SEVERITY, "severity") \
592 _(ZEND_STR_STRING, "string") \
593 _(ZEND_STR_TRACE, "trace") \
594 _(ZEND_STR_SCHEME, "scheme") \
595 _(ZEND_STR_HOST, "host") \
596 _(ZEND_STR_PORT, "port") \
597 _(ZEND_STR_USER, "user") \
598 _(ZEND_STR_PASS, "pass") \
599 _(ZEND_STR_PATH, "path") \
600 _(ZEND_STR_QUERY, "query") \
601 _(ZEND_STR_FRAGMENT, "fragment") \
602 _(ZEND_STR_NULL, "NULL") \
603 _(ZEND_STR_BOOLEAN, "boolean") \
604 _(ZEND_STR_INTEGER, "integer") \
605 _(ZEND_STR_DOUBLE, "double") \
606 _(ZEND_STR_ARRAY, "array") \
607 _(ZEND_STR_RESOURCE, "resource") \
608 _(ZEND_STR_CLOSED_RESOURCE, "resource (closed)") \
609 _(ZEND_STR_NAME, "name") \
610 _(ZEND_STR_ARGV, "argv") \
611 _(ZEND_STR_ARGC, "argc") \
612 _(ZEND_STR_ARRAY_CAPITALIZED, "Array") \
613 _(ZEND_STR_BOOL, "bool") \
614 _(ZEND_STR_INT, "int") \
615 _(ZEND_STR_FLOAT, "float") \
616 _(ZEND_STR_CALLABLE, "callable") \
617 _(ZEND_STR_ITERABLE, "iterable") \
618 _(ZEND_STR_VOID, "void") \
619 _(ZEND_STR_NEVER, "never") \
620 _(ZEND_STR_FALSE, "false") \
621 _(ZEND_STR_TRUE, "true") \
622 _(ZEND_STR_NULL_LOWERCASE, "null") \
623 _(ZEND_STR_MIXED, "mixed") \
624 _(ZEND_STR_TRAVERSABLE, "Traversable") \
625 _(ZEND_STR_SLEEP, "__sleep") \
626 _(ZEND_STR_WAKEUP, "__wakeup") \
627 _(ZEND_STR_CASES, "cases") \
628 _(ZEND_STR_FROM, "from") \
629 _(ZEND_STR_TRYFROM, "tryFrom") \
630 _(ZEND_STR_TRYFROM_LOWERCASE, "tryfrom") \
631 _(ZEND_STR_AUTOGLOBAL_SERVER, "_SERVER") \
632 _(ZEND_STR_AUTOGLOBAL_ENV, "_ENV") \
633 _(ZEND_STR_AUTOGLOBAL_REQUEST, "_REQUEST") \
634 _(ZEND_STR_COUNT, "count") \
635 _(ZEND_STR_SENSITIVEPARAMETER, "SensitiveParameter") \
636 _(ZEND_STR_CONST_EXPR_PLACEHOLDER, "[constant expression]") \
637 _(ZEND_STR_DEPRECATED_CAPITALIZED, "Deprecated") \
638 _(ZEND_STR_SINCE, "since") \
639 _(ZEND_STR_GET, "get") \
640 _(ZEND_STR_SET, "set") \
644#define _ZEND_STR_ID(id, str) id,
hash(string $algo, string $data, bool $binary=false, array $options=[])
#define perealloc(ptr, size, persistent)
#define ZEND_MM_ALIGNED_SIZE(size)
#define pefree(ptr, persistent)
#define pemalloc(size, persistent)
#define safe_perealloc(ptr, nmemb, size, offset, persistent)
#define safe_pemalloc(nmemb, size, offset, persistent)
zend_string_release_ex(func->internal_function.function_name, 0)
#define strncasecmp(s1, s2, n)
struct _zend_string zend_string
#define EXPECTED(condition)
#define zend_always_inline
#define EMPTY_SWITCH_DEFAULT_CASE()
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)
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_STRUCT_SIZE(len)
#define ZSTR_IS_INTERNED(s)
enum _zend_known_string_id zend_known_string_id
ZEND_API zend_ulong ZEND_FASTCALL zend_string_hash_func(zend_string *str)
#define _ZEND_STR_ID(id, str)
void(* zend_string_copy_storage_func_t)(void)
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 GC_SET_REFCOUNT(p, rc)
#define IS_STR_VALID_UTF8
#define GC_DEL_FLAGS(p, flags)
#define IS_STR_PERSISTENT
fbc internal_function handler(call, ret)