36# define __alignof__ __alignof
40# define __alignof__(type) offsetof (struct { char c; type member;}, member)
49struct mhash_bc_entry {
55#define MHASH_NUM_ALGOS 42
57static struct mhash_bc_entry mhash_to_hash[MHASH_NUM_ALGOS] = {
58 {
"CRC32",
"crc32", 0},
61 {
"HAVAL256",
"haval256,3", 3},
63 {
"RIPEMD160",
"ripemd160", 5},
65 {
"TIGER",
"tiger192,3", 7},
67 {
"CRC32B",
"crc32b", 9},
68 {
"HAVAL224",
"haval224,3", 10},
69 {
"HAVAL192",
"haval192,3", 11},
70 {
"HAVAL160",
"haval160,3", 12},
71 {
"HAVAL128",
"haval128,3", 13},
72 {
"TIGER128",
"tiger128,3", 14},
73 {
"TIGER160",
"tiger160,3", 15},
75 {
"SHA256",
"sha256", 17},
76 {
"ADLER32",
"adler32", 18},
77 {
"SHA224",
"sha224", 19},
78 {
"SHA512",
"sha512", 20},
79 {
"SHA384",
"sha384", 21},
80 {
"WHIRLPOOL",
"whirlpool", 22},
81 {
"RIPEMD128",
"ripemd128", 23},
82 {
"RIPEMD256",
"ripemd256", 24},
83 {
"RIPEMD320",
"ripemd320", 25},
85 {
"SNEFRU256",
"snefru256", 27},
87 {
"FNV132",
"fnv132", 29},
88 {
"FNV1A32",
"fnv1a32", 30},
89 {
"FNV164",
"fnv164", 31},
90 {
"FNV1A64",
"fnv1a64", 32},
91 {
"JOAAT",
"joaat", 33},
92 {
"CRC32C",
"crc32c", 34},
93 {
"MURMUR3A",
"murmur3a", 35},
94 {
"MURMUR3C",
"murmur3c", 36},
95 {
"MURMUR3F",
"murmur3f", 37},
96 {
"XXH32",
"xxh32", 38},
97 {
"XXH64",
"xxh64", 39},
99 {
"XXH128",
"xxh128", 41},
108 const php_hash_ops *
ops = zend_hash_find_ptr(&php_hash_hashtable, lower);
109 zend_string_release(lower);
117 size_t algo_len =
strlen(algo);
134static inline size_t align_to(
size_t pos,
size_t alignment) {
139static size_t parse_serialize_spec(
140 const char **specp,
size_t *
pos,
size_t *sz,
size_t *max_alignment) {
141 size_t count, alignment;
142 const char *spec = *specp;
144 if (*spec ==
's' || *spec ==
'S') {
147 }
else if (*spec ==
'l' || *spec ==
'L') {
150 }
else if (*spec ==
'q' || *spec ==
'Q') {
153 }
else if (*spec ==
'i' || *spec ==
'I') {
162 *
pos = align_to(*
pos, alignment);
163 *max_alignment = *max_alignment < alignment ? alignment : *max_alignment;
166 if (isdigit((
unsigned char) *spec)) {
168 while (isdigit((
unsigned char) *spec)) {
179static uint64_t one_from_buffer(
size_t sz,
const unsigned char *
buf) {
181 const uint16_t *x = (
const uint16_t *)
buf;
183 }
else if (sz == 4) {
184 const uint32_t *x = (
const uint32_t *)
buf;
186 }
else if (sz == 8) {
187 const uint64_t *x = (
const uint64_t *)
buf;
195static void one_to_buffer(
size_t sz,
unsigned char *
buf, uint64_t
val) {
197 uint16_t *x = (uint16_t *)
buf;
199 }
else if (sz == 4) {
200 uint32_t *x = (uint32_t *)
buf;
202 }
else if (sz == 8) {
203 uint64_t *x = (uint64_t *)
buf;
234 size_t pos = 0, max_alignment = 1;
235 unsigned char *
buf = (
unsigned char *)
hash->context;
241 while (*spec !=
'\0' && *spec !=
'.') {
242 char spec_ch = *spec;
243 size_t sz,
count = parse_serialize_spec(&spec, &
pos, &sz, &max_alignment);
247 if (isupper((
unsigned char) spec_ch)) {
249 }
else if (sz == 1 &&
count > 1) {
255 uint64_t
val = one_from_buffer(sz,
buf +
pos);
267 if (*spec ==
'.' && align_to(
pos, max_alignment) !=
hash->ops->context_size) {
282 size_t pos = 0, max_alignment = 1,
j = 0;
283 unsigned char *
buf = (
unsigned char *)
hash->context;
288 while (*spec !=
'\0' && *spec !=
'.') {
289 char spec_ch = *spec;
290 size_t sz,
count = parse_serialize_spec(&spec, &
pos, &sz, &max_alignment);
294 if (isupper((
unsigned char) spec_ch)) {
296 }
else if (sz == 1 &&
count > 1) {
327 if (*spec ==
'.' && align_to(
pos, max_alignment) !=
hash->ops->context_size) {
336 if (
hash->ops->serialize_spec) {
347 if (
hash->ops->serialize_spec
358static void php_hash_do_hash(
402 digest = zend_string_alloc(
ops->digest_size, 0);
410 zend_string *hex_digest = zend_string_safe_alloc(
ops->digest_size, 2, 0, 0);
412 php_hash_bin2hex(
ZSTR_VAL(hex_digest), (
unsigned char *)
ZSTR_VAL(digest),
ops->digest_size);
464static inline void php_hash_string_xor_char(
unsigned char *
out,
const unsigned char *in,
const unsigned char xor_with,
const size_t length) {
466 for (i=0; i < length; i++) {
467 out[i] = in[i] ^ xor_with;
471static inline void php_hash_string_xor(
unsigned char *
out,
const unsigned char *in,
const unsigned char *xor_with,
const size_t length) {
473 for (i=0; i < length; i++) {
474 out[i] = in[i] ^ xor_with[i];
478static inline void php_hash_hmac_prep_key(
unsigned char *
K,
const php_hash_ops *
ops,
void *
context,
const unsigned char *
key,
const size_t key_len) {
480 if (key_len >
ops->block_size) {
489 php_hash_string_xor_char(
K,
K, 0x36,
ops->block_size);
499static void php_hash_do_hash_hmac(
509 if (!
ops || !
ops->is_crypto) {
529 digest = zend_string_alloc(
ops->digest_size, 0);
531 php_hash_hmac_prep_key(
K,
ops,
context, (
unsigned char *)
key, key_len);
545 zend_string_release(digest);
554 php_hash_string_xor_char(
K,
K, 0x6A,
ops->block_size);
567 zend_string *hex_digest = zend_string_safe_alloc(
ops->digest_size, 2, 0, 0);
569 php_hash_bin2hex(
ZSTR_VAL(hex_digest), (
unsigned char *)
ZSTR_VAL(digest),
ops->digest_size);
583 size_t data_len, key_len;
600 size_t data_len, key_len;
632 if (!
ops->is_crypto) {
656 size_t i, block_size;
671 block_size =
ops->block_size;
672 for(i = 0; i < block_size; i++) {
676 hash->key = (
unsigned char *)
K;
681#define PHP_HASHCONTEXT_VERIFY(hash) { \
682 if (!hash->context) { \
683 zend_argument_type_error(1, "must be a valid, non-finalized HashContext"); \
699 hash = php_hashcontext_from_object(
Z_OBJ_P(zhash));
710 zval *zhash, *zstream;
719 hash = php_hashcontext_from_object(
Z_OBJ_P(zhash));
728 if (length > 0 && toread > length) {
735 hash->ops->hash_update(
hash->context, (
unsigned char *)
buf,
n);
759 hash = php_hashcontext_from_object(
Z_OBJ_P(zhash));
770 hash->ops->hash_update(
hash->context, (
unsigned char *)
buf,
n);
791 hash = php_hashcontext_from_object(
Z_OBJ_P(zhash));
794 digest_len =
hash->ops->digest_size;
795 digest = zend_string_alloc(digest_len, 0);
798 size_t i, block_size;
801 block_size =
hash->ops->block_size;
802 for(i = 0; i < block_size; i++) {
803 hash->key[i] ^= 0x6A;
809 hash->ops->hash_update(
hash->context, (
unsigned char *)
ZSTR_VAL(digest),
hash->ops->digest_size);
826 zend_string *hex_digest = zend_string_safe_alloc(digest_len, 2, 0, 0);
828 php_hash_bin2hex(
ZSTR_VAL(hex_digest), (
unsigned char *)
ZSTR_VAL(digest), digest_len);
829 ZSTR_VAL(hex_digest)[2 * digest_len] = 0;
888 if (
ops->is_crypto) {
900 unsigned char *prk, *digest, *
K;
911 if (!
ops || !
ops->is_crypto) {
924 }
else if (length == 0) {
925 length =
ops->digest_size;
926 }
else if (length > (
zend_long) (
ops->digest_size * 255)) {
941 php_hash_string_xor_char(
K,
K, 0x6A,
ops->block_size);
946 returnval = zend_string_alloc(length, 0);
948 for (i = 1, rounds = (length - 1) /
ops->digest_size + 1; i <= rounds; i++) {
967 php_hash_string_xor_char(
K,
K, 0x6A,
ops->block_size);
968 php_hash_hmac_round(digest,
ops,
context,
K, digest,
ops->digest_size);
970 ZSTR_VAL(returnval) + ((i - 1) *
ops->digest_size),
972 (i == rounds ? length - ((i - 1) *
ops->digest_size) :
ops->digest_size)
993 unsigned char *computed_salt, *digest, *temp, *
result, *K1, *K2 =
NULL;
994 zend_long loops, i,
j, iterations, digest_length = 0, length = 0;
995 size_t pass_len, salt_len = 0;
1001 if (
zend_parse_parameters(
ZEND_NUM_ARGS(),
"Sssl|lbh", &algo, &
pass, &pass_len, &salt, &salt_len, &iterations, &length, &raw_output, &
args) ==
FAILURE) {
1006 if (!
ops || !
ops->is_crypto) {
1016 if (iterations <= 0) {
1035 php_hash_hmac_prep_key(K1,
ops,
context, (
unsigned char *)
pass, pass_len);
1037 php_hash_string_xor_char(K2, K1, 0x6A,
ops->block_size);
1041 length =
ops->digest_size;
1043 length = length * 2;
1046 digest_length = length;
1051 loops = (
zend_long)
ceil((
float) digest_length / (
float)
ops->digest_size);
1056 memcpy(computed_salt, (
unsigned char *) salt, salt_len);
1058 for (i = 1; i <= loops; i++) {
1062 computed_salt[salt_len] = (
unsigned char) (i >> 24);
1063 computed_salt[salt_len + 1] = (
unsigned char) ((i & 0xFF0000) >> 16);
1064 computed_salt[salt_len + 2] = (
unsigned char) ((i & 0xFF00) >> 8);
1065 computed_salt[salt_len + 3] = (
unsigned char) (i & 0xFF);
1068 php_hash_hmac_round(digest,
ops,
context, K2, digest,
ops->digest_size);
1078 for (
j = 1;
j < iterations;
j++) {
1080 php_hash_hmac_round(digest,
ops,
context, K1, digest,
ops->digest_size);
1081 php_hash_hmac_round(digest,
ops,
context, K2, digest,
ops->digest_size);
1084 php_hash_string_xor(temp, temp, digest,
ops->digest_size);
1095 efree(computed_salt);
1100 returnval = zend_string_alloc(length, 0);
1116 zval *known_zval, *user_zval;
1150#define PHP_HASH_HAVAL_REGISTER(p,b) php_hash_register_algo("haval" #b "," #p , &php_hash_##p##haval##b##_ops);
1183 int algo_number = 0;
1185 for (algo_number = 0; algo_number < MHASH_NUM_ALGOS; algo_number++) {
1186 struct mhash_bc_entry algorithm = mhash_to_hash[algo_number];
1187 if (algorithm.mhash_name ==
NULL) {
1204 size_t data_len, key_len = 0;
1211 if (algorithm >= 0 && algorithm < MHASH_NUM_ALGOS) {
1212 struct mhash_bc_entry algorithm_lookup = mhash_to_hash[algorithm];
1213 if (algorithm_lookup.hash_name) {
1214 algo = zend_string_init(algorithm_lookup.hash_name,
strlen(algorithm_lookup.hash_name), 0);
1229 zend_string_release(algo);
1243 if (algorithm >= 0 && algorithm < MHASH_NUM_ALGOS) {
1244 struct mhash_bc_entry algorithm_lookup = mhash_to_hash[algorithm];
1245 if (algorithm_lookup.mhash_name) {
1273 if (algorithm >= 0 && algorithm < MHASH_NUM_ALGOS) {
1274 struct mhash_bc_entry algorithm_lookup = mhash_to_hash[algorithm];
1275 if (algorithm_lookup.mhash_name) {
1276 const php_hash_ops *
ops = zend_hash_str_find_ptr(&php_hash_hashtable, algorithm_lookup.hash_name,
strlen(algorithm_lookup.hash_name));
1292 char *password, *salt;
1293 size_t password_len, salt_len;
1294 char padded_salt[SALT_SIZE];
1300 bytes = (int)l_bytes;
1306 salt_len =
MIN(salt_len, SALT_SIZE);
1308 memcpy(padded_salt, salt, salt_len);
1309 if (salt_len < SALT_SIZE) {
1310 memset(padded_salt + salt_len, 0, SALT_SIZE - salt_len);
1312 salt_len = SALT_SIZE;
1315 if (algorithm >= 0 && algorithm < MHASH_NUM_ALGOS) {
1316 struct mhash_bc_entry algorithm_lookup = mhash_to_hash[algorithm];
1317 if (algorithm_lookup.mhash_name) {
1318 const php_hash_ops *
ops = zend_hash_str_find_ptr(&php_hash_hashtable, algorithm_lookup.hash_name,
strlen(algorithm_lookup.hash_name));
1320 unsigned char null =
'\0';
1324 size_t block_size =
ops->digest_size;
1325 size_t times = bytes / block_size;
1327 if ((bytes % block_size) != 0) {
1337 for (i = 0; i < times; i++) {
1343 ops->hash_update(
context, (
unsigned char *)padded_salt, salt_len);
1344 ops->hash_update(
context, (
unsigned char *)password, password_len);
1345 ops->hash_final((
unsigned char *)digest,
context);
1346 memcpy( &
key[i*block_size], digest, block_size);
1371 zobj->handlers = &php_hashcontext_handlers;
1378static void php_hashcontext_dtor(
zend_object *obj) {
1381 if (
hash->context) {
1394static void php_hashcontext_free(
zend_object *obj) {
1395 php_hashcontext_dtor(obj);
1412 newobj->
ops = oldobj->
ops;
1414 newobj->
context = php_hash_alloc_context(newobj->
ops);
1465 if (!
hash->ops->hash_serialize) {
1466 goto serialize_failure;
1479 goto serialize_failure;
1505 zval *algo_zv, *magic_zv, *options_zv, *hash_zv, *members_zv;
1507 int unserialize_result;
1514 if (
hash->context) {
1545 }
else if (!
ops->hash_unserialize) {
1551 hash->context = php_hash_alloc_context(
ops);
1555 unserialize_result =
ops->hash_unserialize(
hash,
magic, hash_zv);
1556 if (unserialize_result !=
SUCCESS) {
1559 php_hashcontext_dtor(
Z_OBJ_P(
object));
1651 register_hash_symbols(module_number);
1659 php_hashcontext_handlers.free_obj = php_hashcontext_free;
1660 php_hashcontext_handlers.clone_obj = php_hashcontext_clone;
count(Countable|array $value, int $mode=COUNT_NORMAL)
memset(ptr, 0, type->size)
zend_ffi_ctype_name_buf buf
const php_stream_filter_ops * ops
PHP_HASH_API zend_result php_hash_serialize(const php_hashcontext_object *hash, zend_long *magic, zval *zv)
PHP_HASH_API zend_result php_hash_serialize_spec(const php_hashcontext_object *hash, zval *zv, const char *spec)
PHP_HASH_API zend_result php_hash_copy(const void *ops, const void *orig_context, void *dest_context)
#define PHP_HASH_HAVAL_REGISTER(p, b)
#define __alignof__(type)
zend_module_entry hash_module_entry
PHP_HASH_API void php_hash_register_algo(const char *algo, const php_hash_ops *ops)
zend_class_entry * php_hashcontext_ce
PHP_HASH_API int php_hash_unserialize_spec(php_hashcontext_object *hash, const zval *zv, const char *spec)
#define PHP_HASHCONTEXT_VERIFY(hash)
PHP_HASH_API int php_hash_unserialize(php_hashcontext_object *hash, zend_long magic, const zval *zv)
PHP_HASH_API const php_hash_ops * php_hash_fetch_ops(zend_string *algo)
mhash_get_hash_name(int $algo)
mhash_get_block_size(int $algo)
hash_update(HashContext $context, string $data)
hash_update_stream(HashContext $context, $stream, int $length=-1)
hash_file(string $algo, string $filename, bool $binary=false, array $options=[])
hash_equals(#[\SensitiveParameter] string $known_string, #[\SensitiveParameter] string $user_string)
hash_hmac_file(string $algo, string $filename, #[\SensitiveParameter] string $key, bool $binary=false)
hash_init(string $algo, int $flags=0, #[\SensitiveParameter] string $key="", array $options=[])
hash_final(HashContext $context, bool $binary=false)
hash_hmac(string $algo, string $data, #[\SensitiveParameter] string $key, bool $binary=false)
hash_hkdf(string $algo, #[\SensitiveParameter] string $key, int $length=0, string $info="", string $salt="")
hash_pbkdf2(string $algo, #[\SensitiveParameter] string $password, string $salt, int $iterations, int $length=0, bool $binary=false, array $options=[])
hash(string $algo, string $data, bool $binary=false, array $options=[])
mhash(int $algo, string $data, ?string $key=null)
hash_update_file(HashContext $context, string $filename, $stream_context=null)
mhash_keygen_s2k(int $algo, string $password, string $salt, int $length)
hash_copy(HashContext $context)
const php_hash_ops php_hash_adler32_ops
const php_hash_ops php_hash_crc32c_ops
const php_hash_ops php_hash_crc32b_ops
const php_hash_ops php_hash_crc32_ops
const php_hash_ops php_hash_fnv1a32_ops
const php_hash_ops php_hash_fnv1a64_ops
const php_hash_ops php_hash_fnv132_ops
const php_hash_ops php_hash_fnv164_ops
const php_hash_ops php_hash_gost_crypto_ops
const php_hash_ops php_hash_gost_ops
const php_hash_ops php_hash_joaat_ops
const php_hash_ops php_hash_md2_ops
const php_hash_ops php_hash_md4_ops
const php_hash_ops php_hash_md5_ops
const php_hash_ops php_hash_murmur3c_ops
const php_hash_ops php_hash_murmur3f_ops
const php_hash_ops php_hash_murmur3a_ops
const php_hash_ops php_hash_ripemd128_ops
const php_hash_ops php_hash_ripemd160_ops
const php_hash_ops php_hash_ripemd320_ops
const php_hash_ops php_hash_ripemd256_ops
const php_hash_ops php_hash_sha256_ops
const php_hash_ops php_hash_sha384_ops
const php_hash_ops php_hash_sha1_ops
const php_hash_ops php_hash_sha512_224_ops
const php_hash_ops php_hash_sha224_ops
const php_hash_ops php_hash_sha512_256_ops
const php_hash_ops php_hash_sha512_ops
const php_hash_ops php_hash_snefru_ops
#define pass(a, b, c, mul)
const php_hash_ops php_hash_whirlpool_ops
const php_hash_ops php_hash_xxh32_ops
const php_hash_ops php_hash_xxh3_128_ops
const php_hash_ops php_hash_xxh3_64_ops
const php_hash_ops php_hash_xxh64_ops
php_info_print_table_start()
php_info_print_table_row(2, "PDO Driver for Firebird", "enabled")
php_info_print_table_end()
#define PHP_MSHUTDOWN_FUNCTION
#define PHP_MINIT_FUNCTION
#define PHP_MINFO_FUNCTION
PHPAPI int php_safe_bcmp(const zend_string *a, const zend_string *b)
unsigned const char * pos
const php_hash_ops php_hash_sha3_256_ops
const php_hash_ops php_hash_sha3_224_ops
struct _php_hashcontext_object php_hashcontext_object
const php_hash_ops php_hash_4tiger128_ops
const php_hash_ops php_hash_3tiger128_ops
const php_hash_ops php_hash_3tiger192_ops
const php_hash_ops php_hash_4tiger160_ops
const php_hash_ops php_hash_sha3_384_ops
#define PHP_MHASH_VERSION
const php_hash_ops php_hash_4tiger192_ops
const php_hash_ops php_hash_3tiger160_ops
struct _php_hash_ops php_hash_ops
#define PHP_HASH_SERIALIZE_MAGIC_SPEC
const php_hash_ops php_hash_sha3_512_ops
PHP_JSON_API size_t int options
reflection_object_handlers clone_obj
unsigned char key[REFLECTION_KEY_LEN]
#define php_stream_context_from_zval(zcontext, nocontext)
struct _php_stream php_stream
struct _php_stream_context php_stream_context
#define php_stream_read(stream, buf, count)
#define php_stream_from_zval(xstr, pzval)
#define php_stream_open_wrapper_ex(path, mode, options, opened, context)
#define php_stream_close(stream)
php_hash_copy_func_t hash_copy
php_hash_init_func_t hash_init
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API const char * zend_zval_value_name(const zval *arg)
ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *class_type)
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type)
ZEND_API ZEND_COLD void zend_argument_must_not_be_empty_error(uint32_t arg_num)
ZEND_API ZEND_COLD void zend_argument_value_error(uint32_t arg_num, const char *format,...)
ZEND_API ZEND_COLD void zend_argument_type_error(uint32_t arg_num, const char *format,...)
ZEND_API void object_properties_load(zend_object *object, HashTable *properties)
ZEND_API zend_result add_next_index_str(zval *arg, zend_string *str)
#define CHECK_NULL_PATH(p, l)
#define ZEND_PARSE_PARAMETERS_END()
#define ZEND_PARSE_PARAMETERS_NONE()
#define ZVAL_STRING(z, s)
#define zend_parse_parameters_none()
#define Z_PARAM_STRING(dest, dest_len)
#define Z_PARAM_STR(dest)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define RETURN_NEW_STR(s)
#define ZEND_METHOD(classname, name)
#define Z_PARAM_ARRAY_HT(dest)
#define Z_PARAM_BOOL(dest)
#define ZVAL_STRINGL(z, s, l)
#define RETVAL_STRINGL(s, l)
#define ecalloc(nmemb, size)
#define safe_emalloc(nmemb, size, offset)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API void zend_register_long_constant(const char *name, size_t name_len, zend_long lval, int flags, int module_number)
ZEND_API zend_class_entry * zend_ce_value_error
ZEND_API ZEND_COLD zend_object * zend_throw_exception(zend_class_entry *exception_ce, const char *message, zend_long code)
ZEND_API ZEND_COLD zend_object * zend_throw_exception_ex(zend_class_entry *exception_ce, zend_long code, const char *format,...)
ZEND_API zend_class_entry * zend_ce_error
ZEND_API void ZEND_FASTCALL zend_hash_destroy(HashTable *ht)
ZEND_API zval *ZEND_FASTCALL zend_hash_next_index_insert(HashTable *ht, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_str_update(HashTable *ht, const char *str, size_t len, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h)
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
#define ZEND_HASH_MAP_FOREACH_STR_KEY(ht, _key)
#define ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(ht, _key, _ptr)
#define ZEND_HASH_FOREACH_END()
struct _zend_string zend_string
#define STANDARD_MODULE_HEADER
#define INIT_FUNC_ARGS_PASSTHRU
struct _zend_module_entry zend_module_entry
#define STANDARD_MODULE_PROPERTIES
ZEND_API HashTable * zend_std_get_properties(zend_object *zobj)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, zend_object *old_object)
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
ZEND_API char *ZEND_FASTCALL zend_str_tolower_dup(const char *source, size_t length)
#define ZEND_SECURE_ZERO(var, size)
#define XtOffsetOf(s_type, field)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
ZEND_API zend_string_init_interned_func_t zend_string_init_interned
#define Z_OBJ_HANDLER_P(zv_p, hf)
#define Z_STRVAL_P(zval_p)
#define Z_ARRVAL_P(zval_p)
struct _zend_array HashTable
#define Z_STRLEN_P(zval_p)
ZEND_RESULT_CODE zend_result
struct _zend_object_handlers zend_object_handlers
ZEND_API void zval_ptr_dtor(zval *zval_ptr)