37#define DEBUG_OBJECT_HANDLERS 0
39#define ZEND_WRONG_PROPERTY_OFFSET 0
40#define ZEND_HOOKED_PROPERTY_OFFSET 1
43#define IN_GET ZEND_GUARD_PROPERTY_GET
44#define IN_SET ZEND_GUARD_PROPERTY_SET
45#define IN_UNSET ZEND_GUARD_PROPERTY_UNSET
46#define IN_ISSET ZEND_GUARD_PROPERTY_ISSET
47#define IN_HOOK ZEND_GUARD_PROPERTY_HOOK
51#ifdef ZEND_CHECK_STACK_LIMIT
52 return zend_call_stack_overflowed(
EG(stack_limit));
77 if (!
zobj->properties) {
102 return zobj->properties;
146 return zend_std_get_properties_ex(
zobj);
155 && zend_lazy_object_initialized(
zobj))) {
160 if (!
zobj->properties) {
163 return zobj->properties;
168 return zobj->handlers->get_properties(
zobj);
176 return zobj->handlers->get_properties(
zobj);
180 }
else if (
zobj->properties) {
183 return zobj->properties;
185 *table =
zobj->properties_table;
186 *
n =
zobj->ce->default_properties_count;
200 if (
UNEXPECTED(zend_object_is_lazy(
object))) {
205 return object->handlers->get_properties(
object);
238 zend_call_known_instance_method_with_1_params(
zobj->ce->__get,
zobj,
retval, &member);
255 zend_call_known_instance_method_with_1_params(
zobj->ce->__unset,
zobj,
NULL, &member);
263 zend_call_known_instance_method_with_1_params(
zobj->ce->__isset,
zobj,
retval, &member);
270 child_class = child_class->
parent;
271 while (child_class) {
272 if (child_class == parent_class) {
275 child_class = child_class->
parent;
285 (is_derived_class(ce,
scope) || is_derived_class(
scope, ce));
353 return EG(fake_scope);
375 zend_bad_property_name();
393 if (property_info->
ce !=
scope) {
410 if (property_info->
ce != ce) {
416 zend_bad_property_access(property_info, ce, member);
437 if (property_info->
hooks) {
438 *info_ptr = property_info;
448 property_info =
NULL;
450 *info_ptr = property_info;
465 zend_get_property_offset(ce, member, 0,
NULL, &dummy);
479 zend_bad_property_name();
492 if (property_info->
ce !=
scope) {
505 if (property_info->
ce != ce) {
511 zend_bad_property_access(property_info, ce, member);
530 return property_info;
537 const char *class_name =
NULL;
538 const char *prop_name;
540 size_t prop_name_len;
542 if (
ZSTR_VAL(prop_info_name)[0] == 0) {
548 member = zend_string_init(prop_name, prop_name_len, 0);
555 if (class_name[0] !=
'*') {
569 if (property_info ==
NULL) {
591static void zend_property_guard_dtor(
zval *el) {
601 return zobj->properties_table +
zobj->ce->default_properties_count;
612 zv = zend_get_guard_value(
zobj);
617 EXPECTED(zend_string_equal_content(str, member))) {
620 zval_ptr_dtor_str(
zv);
627 zend_hash_add_new_ptr(guards, str,
629 zval_ptr_dtor_str(
zv);
637 return (uint32_t*)(((uintptr_t)
Z_PTR_P(
zv)) & ~1);
648 return (uint32_t*)zend_hash_add_new_ptr(guards, member,
ptr);
691 if (parent_obj == obj) {
695 if (zend_object_is_lazy_proxy(parent_obj)
696 && zend_lazy_object_initialized(parent_obj)
707 is_read ?
"read from" :
"write to",
711static bool zend_call_get_hook(
717 zend_throw_no_prop_backing_value_access(
zobj->ce->name, prop_name,
true);
722 zend_call_known_instance_method_with_0_params(get,
zobj,
rv);
730 uintptr_t property_offset;
732 uint32_t *guard =
NULL;
734#if DEBUG_OBJECT_HANDLERS
779 if (
EXPECTED(idx < zobj->properties->nNumUsed *
sizeof(
Bucket))) {
795 uintptr_t idx = (
char*)
retval - (
char*)
zobj->properties->arData;
807 return &
EG(uninitialized_zval);
837 return &
EG(uninitialized_zval);
892 zend_std_call_issetter(
zobj,
name, &tmp_result);
903 if (
zobj->ce->__get && !((*guard) &
IN_GET)) {
907 }
else if (
zobj->ce->__get && !((*guard) &
IN_GET)) {
908 goto call_getter_addref;
910 }
else if (
zobj->ce->__get) {
913 if (!((*guard) &
IN_GET)) {
962 if (!((*guard) & guard_type)) {
963 (*guard) |= guard_type;
965 (*guard) &= ~guard_type;
1006 return &
EG(error_zval);
1011 if (!((*guard) &
IN_SET)) {
1034 uintptr_t property_offset;
1036 uint32_t *guard =
NULL;
1109 &&
EX(opline)->result_type) {
1115 gc_check_possible_root_no_ref(
garbage);
1127 goto write_std_property;
1161 zend_throw_no_prop_backing_value_access(
zobj->ce->name,
name,
false);
1187 zend_call_known_instance_method_with_1_params(set,
zobj,
NULL,
value);
1198 if (
zobj->ce->__set) {
1203 if (!((*guard) &
IN_SET)) {
1216 goto write_std_property;
1235 goto typed_property;
1241 zend_forbidden_dynamic_property(
zobj->ce,
name);
1261 return forward_write_to_lazy_object(
zobj,
name,
value, cache_slot,
1289 zend_call_known_instance_method_with_1_params(funcs->
zf_offsetexists,
object,
rv, &tmp_offset);
1295 if (!i_zend_is_true(
rv)) {
1299 return &
EG(uninitialized_zval);
1304 zend_call_known_instance_method_with_1_params(funcs->
zf_offsetget,
object,
rv, &tmp_offset);
1317 zend_bad_array_access(ce);
1340 zend_bad_array_access(ce);
1356 zend_call_known_instance_method_with_1_params(funcs->
zf_offsetexists,
object, &
retval, &tmp_offset);
1360 zend_call_known_instance_method_with_1_params(funcs->
zf_offsetget,
object, &
retval, &tmp_offset);
1367 zend_bad_array_access(ce);
1378 uintptr_t property_offset;
1381#if DEBUG_OBJECT_HANDLERS
1396 return &
EG(error_zval);
1443 zend_forbidden_dynamic_property(
zobj->ce,
name);
1444 return &
EG(error_zval);
1448 return &
EG(error_zval);
1454 return &
EG(error_zval);
1477 uintptr_t property_offset;
1479 uint32_t *guard =
NULL;
1519 if (
zobj->properties) {
1558 if (
zobj->ce->__unset) {
1565 zend_std_call_unsetter(
zobj,
name);
1609 zend_call_known_instance_method_with_1_params(funcs->
zf_offsetunset,
object,
NULL, &tmp_offset);
1613 zend_bad_array_access(ce);
1647 if (fbc_scope==
scope) {
1650 fbc_scope = fbc_scope->
parent;
1674 static const void *dummy = (
void*)(intptr_t)2;
1680 func = &
EG(trampoline).op_array;
1686 func->arg_flags[0] = 0;
1687 func->arg_flags[1] = 0;
1688 func->arg_flags[2] = 0;
1694 func->attributes =
fbc->common.attributes;
1698 func->opcodes = &
EG(call_trampoline_op);
1700 func->scope =
fbc->common.scope;
1717 func->function_name = zend_string_init(
ZSTR_VAL(method_name), mname_len, 0);
1719 func->function_name = zend_string_copy(method_name);
1725 func->required_num_args = 0;
1751 zend_string_release(
EX(
func)->common.function_name);
1770 zend_string_release(
EX(
func)->common.function_name);
1782 func = &EG(trampoline);
1784 func = (zend_function *)(uintptr_t)ecalloc(1, sizeof(zend_internal_function));
1787 func->common.arg_flags[0] = 0;
1788 func->common.arg_flags[1] = 0;
1789 func->common.arg_flags[2] = 0;
1797 func->common.required_num_args =
args;
1803 ?
ZEND_FN(zend_parent_hook_get_trampoline)
1804 :
ZEND_FN(zend_parent_hook_set_trampoline);
1805 func->internal_function.module =
NULL;
1807 func->internal_function.reserved[0] = prop_name;
1808 func->internal_function.reserved[1] =
NULL;
1823 scope ?
"scope " :
"global scope",
1847#ifdef ZEND_ALLOCA_MAX_SIZE
1859 if (
zobj->ce->__call) {
1860 return zend_get_user_call_function(
zobj->ce, method_name);
1885 if (
zobj->ce->__call) {
1886 fbc = zend_get_user_call_function(
zobj->ce, method_name);
1888 zend_bad_method_call(
fbc, method_name,
scope);
1897 zend_abstract_method_call(
fbc);
1919 instanceof_function(
object->ce, ce)) {
1924 return zend_get_user_call_function(
object->ce, function_name);
1926 return zend_get_user_callstatic_function(ce, function_name);
1938 lc_function_name = zend_string_tolower(function_name);
1950 zend_function *fallback_fbc = get_static_method_fallback(ce, function_name);
1951 if (!fallback_fbc) {
1952 zend_bad_method_call(
fbc, function_name,
scope);
1959 fbc = get_static_method_fallback(ce, function_name);
1968 zend_abstract_method_call(
fbc);
1972 "Calling static trait method %s::%s is deprecated, "
1973 "it should only be called on a class using the trait",
1999 if (class_type->
parent) {
2021 *property_info_ptr = property_info;
2024 goto undeclared_property;
2029 if (property_info->
ce !=
scope) {
2033 zend_bad_property_access(property_info, ce, property_name);
2064 zend_throw_error(
NULL,
"Typed static property %s::$%s must not be accessed before initialization",
2071 "Accessing static trait property %s::$%s is deprecated, "
2072 "it should only be accessed on a class using the trait",
2116 zend_bad_constructor_call(constructor,
scope);
2117 zend_object_store_ctor_failed(
zobj);
2132 if (zend_objects_check_stack_limit()) {
2166 return object_lhs ? 1 : -1;
2177 if (zobj1 == zobj2) {
2180 if (zobj1->
ce != zobj2->
ce) {
2184 && !zend_object_is_lazy(zobj1) && !zend_object_is_lazy(zobj2)) {
2240 zend_std_get_properties_ex(zobj1),
2241 zend_std_get_properties_ex(zobj2));
2256 uintptr_t property_offset;
2259 property_offset = zend_get_property_offset(
zobj->ce,
name, 1, cache_slot, &
prop_info);
2276 if (
EXPECTED(idx < zobj->properties->nNumUsed *
sizeof(
Bucket))) {
2292 uintptr_t idx = (
char*)
value - (
char*)
zobj->properties->arData;
2354 if (!
zobj->ce->__isset) {
2422 return zend_string_copy(
zobj->ce->name);
2434 zend_call_known_instance_method_with_0_params(ce->
__tostring, readobj, &
retval);
2435 zend_object_release(readobj);
2487 if (
ht && !is_temp) {
2511 if (zend_object_is_lazy(obj)
2512 && !zend_lazy_object_initialize_on_serialize(obj)) {
2531 if (
zobj->handlers->get_properties_for) {
2532 return zobj->handlers->get_properties_for(
zobj, purpose);
fprintf($stream, string $format, mixed ... $values)
reflection_object_handlers write_property
unsigned char key[REFLECTION_KEY_LEN]
zend_function * zf_offsetget
zend_function * zf_offsetunset
zend_function * zf_offsetset
zend_function * zf_offsetexists
zend_function * __debugInfo
zend_object *(* create_object)(zend_class_entry *class_type)
zend_function * __tostring
zval * default_static_members_table
uint32_t num_hooked_props
HashTable properties_info
zend_class_arrayaccess_funcs * arrayaccess_funcs_ptr
int default_properties_count
int default_static_members_count
struct _zend_property_info ** properties_info_table
zend_class_entry * parent
const zend_object_handlers * default_object_handlers
zend_function * __callstatic
zend_object_get_debug_info_t get_debug_info
zend_object_read_property_t read_property
zend_object_get_properties_t get_properties
const zend_object_handlers * handlers
const zend_property_info * prototype
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format,...)
ZEND_API ZEND_COLD void zend_throw_error(zend_class_entry *exception_ce, const char *format,...)
ZEND_API ZEND_COLD void zend_error(int type, const char *format,...)
ZEND_API zend_result zend_update_class_constants(zend_class_entry *class_type)
ZEND_API const char * zend_get_type_by_const(int type)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_parameters_none_error(void)
#define CE_STATIC_MEMBERS(ce)
ZEND_API void zend_call_known_instance_method_with_2_params(zend_function *fn, zend_object *object, zval *retval_ptr, zval *param1, zval *param2)
#define ZEND_PARSE_PARAMETERS_END_EX(failure)
#define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args)
#define Z_PARAM_ZVAL(dest)
#define ZEND_FUNCTION(name)
#define RETVAL_COPY_VALUE(zv)
#define efree_size(ptr, size)
#define ecalloc(nmemb, size)
#define ALLOC_HASHTABLE(ht)
exit(string|int $status=0)
strcmp(string $string1, string $string2)
zend_string_release_ex(func->internal_function.function_name, 0)
ZEND_API zend_result zend_unmangle_property_name_ex(const zend_string *name, const char **class_name, const char **prop_name, size_t *prop_len)
#define ZEND_ACC_NO_DYNAMIC_PROPERTIES
#define ZEND_USER_CODE(type)
#define ZEND_ACC_STRICT_TYPES
#define ZEND_INTERNAL_FUNCTION
#define ZEND_ACC_ABSTRACT
#define ZEND_ACC_READONLY
#define ZEND_ACC_PROTECTED_SET
#define ZEND_ACC_PPP_SET_MASK
#define ZEND_USER_FUNCTION
#define ZEND_ACC_CALL_VIA_TRAMPOLINE
struct _zend_op_array zend_op_array
#define OBJ_PROP(obj, offset)
struct _zend_property_info zend_property_info
#define ZEND_ACC_USE_GUARDS
#define ZEND_ACC_CONSTANTS_UPDATED
#define ZEND_CALL_USES_STRICT_TYPES(call)
#define ZEND_ACC_ALLOW_DYNAMIC_PROPERTIES
struct _zend_arg_info zend_arg_info
#define ZEND_ACC_PUBLIC_SET
#define ZEND_ACC_VARIADIC
#define ZEND_DEBUGINFO_FUNC_NAME
#define ZEND_ACC_DEPRECATED
#define ZEND_ACC_RETURN_REFERENCE
char * zend_visibility_string(uint32_t fn_flags)
#define ZEND_FN_SCOPE_NAME(function)
#define ZEND_ACC_PROTECTED
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_indirect_modification_error(const zend_property_info *info)
ZEND_API bool zend_never_inline zend_verify_property_type(const zend_property_info *info, zval *property, bool strict)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_object_released_while_assigning_to_property_error(const zend_property_info *info)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_asymmetric_visibility_property_modification_error(const zend_property_info *prop_info, const char *operation)
ZEND_API bool ZEND_FASTCALL zend_verify_prop_assignable_by_ref_ex(const zend_property_info *prop_info, zval *orig_val, bool strict, zend_verify_prop_assignable_by_ref_context context)
ZEND_API ZEND_COLD void ZEND_FASTCALL zend_readonly_property_modification_error(const zend_property_info *info)
#define CACHED_PTR_EX(slot)
#define ZEND_REF_HAS_TYPE_SOURCES(ref)
#define ZEND_REF_DEL_TYPE_SOURCE(ref, source)
ZEND_API zend_class_entry * zend_get_executed_scope(void)
ZEND_API void(* zend_execute_ex)(zend_execute_data *execute_data)
ZEND_API zend_object * zend_get_this_object(zend_execute_data *ex)
ZEND_API void execute_ex(zend_execute_data *execute_data)
#define CACHE_PTR_EX(slot, ptr)
#define CACHE_POLYMORPHIC_PTR_EX(slot, ce, ptr)
ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info)
@ ZEND_VERIFY_PROP_ASSIGNABLE_BY_REF_CONTEXT_MAGIC_GET
union _zend_function zend_function
ZEND_API zval *ZEND_FASTCALL zend_hash_add_new(HashTable *ht, zend_string *key, zval *pData)
ZEND_API zval *ZEND_FASTCALL zend_hash_find_known_hash(const HashTable *ht, const zend_string *key)
ZEND_API HashTable *ZEND_FASTCALL zend_array_dup(HashTable *source)
ZEND_API void ZEND_FASTCALL zend_hash_real_init_mixed(HashTable *ht)
ZEND_API zend_result ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key)
ZEND_API zval *ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key)
ZEND_API zval *ZEND_FASTCALL zend_hash_add(HashTable *ht, zend_string *key, zval *pData)
#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent)
#define zend_new_array(size)
#define HASH_FLAG_HAS_EMPTY_IND
struct _zend_class_arrayaccess_funcs zend_class_arrayaccess_funcs
HashTable * zend_lazy_object_debug_info(zend_object *object, int *is_temp)
zend_object * zend_lazy_object_get_instance(zend_object *obj)
HashTable * zend_lazy_object_get_gc(zend_object *zobj, zval **table, int *n)
ZEND_API zend_object * zend_lazy_object_init(zend_object *obj)
struct _zend_string zend_string
#define ZEND_MAP_PTR_INIT(ptr, val)
#define ZEND_MAP_PTR_SET(ptr, val)
ZEND_API zval * zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *name, int type, void **cache_slot)
ZEND_API zval * zend_std_get_static_property_with_info(zend_class_entry *ce, zend_string *property_name, int type, zend_property_info **property_info_ptr)
#define ZEND_HOOKED_PROPERTY_OFFSET
ZEND_API zend_result zend_check_property_access(const zend_object *zobj, zend_string *prop_info_name, bool is_dynamic)
ZEND_API HashTable * zend_get_properties_for(zval *obj, zend_prop_purpose purpose)
ZEND_API zend_function * zend_get_call_trampoline_func(const zend_class_entry *ce, zend_string *method_name, bool is_static)
ZEND_API HashTable * zend_std_get_debug_info(zend_object *object, int *is_temp)
ZEND_API HashTable * zend_get_properties_no_lazy_init(zend_object *zobj)
ZEND_API zend_string * zend_std_get_class_name(const zend_object *zobj)
ZEND_API void zend_class_init_statics(zend_class_entry *class_type)
#define ZEND_WRONG_PROPERTY_OFFSET
ZEND_API zend_function * zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key)
ZEND_API zend_result zend_std_cast_object_tostring(zend_object *readobj, zval *writeobj, int type)
ZEND_API uint32_t * zend_get_recursion_guard(zend_object *zobj)
ZEND_API int zend_std_has_dimension(zend_object *object, zval *offset, int check_empty)
ZEND_API bool zend_check_protected(const zend_class_entry *ce, const zend_class_entry *scope)
ZEND_API int zend_objects_not_comparable(zval *o1, zval *o2)
ZEND_API HashTable * zend_std_get_properties_for(zend_object *obj, zend_prop_purpose purpose)
ZEND_API HashTable * zend_std_get_properties(zend_object *zobj)
ZEND_API ZEND_COLD bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name)
ZEND_API int zend_std_has_property(zend_object *zobj, zend_string *name, int has_set_exists, void **cache_slot)
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API HashTable * zend_std_build_object_properties_array(zend_object *zobj)
ZEND_API zval * zend_std_write_property(zend_object *zobj, zend_string *name, zval *value, void **cache_slot)
ZEND_API zend_property_info * zend_get_property_info(const zend_class_entry *ce, zend_string *member, int silent)
ZEND_API void zend_std_unset_property(zend_object *zobj, zend_string *name, void **cache_slot)
ZEND_API void zend_std_unset_dimension(zend_object *object, zval *offset)
ZEND_API uint32_t * zend_get_property_guard(zend_object *zobj, zend_string *member)
ZEND_API zval * zend_std_read_property(zend_object *zobj, zend_string *name, int type, void **cache_slot, zval *rv)
ZEND_API zval * zend_std_read_dimension(zend_object *object, zval *offset, int type, zval *rv)
ZEND_API int zend_std_compare_objects(zval *o1, zval *o2)
ZEND_API void zend_std_write_dimension(zend_object *object, zval *offset, zval *value)
ZEND_API zend_function * zend_get_property_hook_trampoline(const zend_property_info *prop_info, zend_property_hook_kind kind, zend_string *prop_name)
ZEND_API bool ZEND_FASTCALL zend_asymmetric_property_has_set_access(const zend_property_info *prop_info)
ZEND_API HashTable * rebuild_object_properties_internal(zend_object *zobj)
ZEND_API HashTable * zend_std_get_gc(zend_object *zobj, zval **table, int *n)
ZEND_API zend_function * zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name, const zval *key)
ZEND_API zend_function * zend_std_get_constructor(zend_object *zobj)
ZEND_API zend_result zend_std_get_closure(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only)
ZEND_API zval * zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type)
#define ZEND_WRONG_PROPERTY_INFO
#define IS_WRONG_PROPERTY_OFFSET(offset)
#define ZEND_SET_PROPERTY_HOOK_SIMPLE_WRITE(cache_slot)
#define ZEND_PROPERTY_ISSET
enum _zend_prop_purpose zend_prop_purpose
#define ZEND_DECODE_DYN_PROP_OFFSET(offset)
#define ZEND_SET_PROPERTY_HOOK_SIMPLE_READ(cache_slot)
#define ZEND_SET_PROPERTY_HOOK_SIMPLE_GET(cache_slot)
#define zend_get_function_root_class(fbc)
#define ZEND_ENCODE_DYN_PROP_OFFSET(offset)
#define IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(offset)
#define ZEND_PROPERTY_NOT_EMPTY
@ ZEND_PROP_PURPOSE_DEBUG
@ ZEND_PROP_PURPOSE_SERIALIZE
@ ZEND_PROP_PURPOSE_ARRAY_CAST
@ ZEND_PROP_PURPOSE_GET_OBJECT_VARS
@ ZEND_PROP_PURPOSE_VAR_EXPORT
#define IS_HOOKED_PROPERTY_OFFSET(offset)
#define ZEND_PROPERTY_EXISTS
#define ZEND_DYNAMIC_PROPERTY_OFFSET
#define IS_VALID_PROPERTY_OFFSET(offset)
#define zend_free_trampoline(func)
#define IS_DYNAMIC_PROPERTY_OFFSET(offset)
ZEND_API void zend_objects_destroy_object(zend_object *object)
ZEND_API zend_object * zend_objects_clone_obj(zend_object *old_object)
ZEND_API void zend_object_std_dtor(zend_object *object)
ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object)
#define ZEND_OBSERVER_ENABLED
ZEND_API char *ZEND_FASTCALL zend_str_tolower_copy(char *dest, const char *source, size_t length)
ZEND_API int ZEND_FASTCALL zend_compare(zval *op1, zval *op2)
ZEND_API bool ZEND_FASTCALL zend_is_true(const zval *op)
ZEND_API int ZEND_FASTCALL zend_compare_symbol_tables(HashTable *ht1, HashTable *ht2)
#define ZEND_UNCOMPARABLE
#define ALLOCA_FLAG(name)
#define zend_never_inline
#define EXPECTED(condition)
#define zend_always_inline
#define ZEND_UNREACHABLE()
#define UNEXPECTED(condition)
ZEND_API zend_array * zend_hooked_object_build_properties(zend_object *zobj)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
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)
#define ZSTR_ALLOCA_FREE(str, use_heap)
#define ZSTR_EMPTY_ALLOC()
#define ZSTR_ALLOCA_ALLOC(str, _len, use_heap)
#define Z_ISREF_P(zval_p)
#define Z_TRY_ADDREF_P(pz)
#define Z_REFVAL_P(zval_p)
#define ZEND_GUARD_PROPERTY_MASK
#define Z_ISUNDEF_P(zval_p)
#define Z_ARRVAL_P(zval_p)
#define ZVAL_STR_COPY(z, s)
#define ZVAL_INDIRECT(z, v)
struct _zend_array HashTable
#define ZVAL_COPY_OR_DUP(z, v)
#define IS_PROP_REINITABLE
#define Z_OBJ_HT_P(zval_p)
#define ZVAL_COPY_DEREF(z, v)
#define Z_REFCOUNTED(zval)
#define Z_UNPROTECT_RECURSION_P(zv)
#define Z_OBJCE_P(zval_p)
#define ZEND_TYPE_IS_SET(t)
struct _zend_refcounted zend_refcounted
#define Z_GUARD_P(zval_p)
#define ZVAL_DOUBLE(z, d)
#define Z_PROTECT_RECURSION_P(zv)
ZEND_RESULT_CODE zend_result
#define IS_ARRAY_IMMUTABLE
struct _zend_object_handlers zend_object_handlers
struct _zend_execute_data zend_execute_data
#define ZVAL_COPY_VALUE(z, v)
#define ZVAL_DEINDIRECT(z)
#define Z_IS_RECURSIVE_P(zv)
ZEND_API void ZEND_FASTCALL rc_dtor_func(zend_refcounted *p)
ZEND_API void zval_ptr_dtor(zval *zval_ptr)
zend_property_info * prop_info
zend_refcounted * garbage