20#ifndef ZEND_OBJECT_HANDLERS_H
21#define ZEND_OBJECT_HANDLERS_H
32#define ZEND_WRONG_PROPERTY_INFO \
33 ((struct _zend_property_info*)((intptr_t)-1))
35#define ZEND_DYNAMIC_PROPERTY_OFFSET ((uintptr_t)(intptr_t)(-1))
40#define ZEND_FIRST_PROPERTY_OFFSET (1 << 4)
41#define IS_VALID_PROPERTY_OFFSET(offset) ((intptr_t)(offset) >= ZEND_FIRST_PROPERTY_OFFSET)
42#define IS_WRONG_PROPERTY_OFFSET(offset) ((intptr_t)(offset) == 0)
43#define IS_HOOKED_PROPERTY_OFFSET(offset) \
44 ((intptr_t)(offset) > 0 && (intptr_t)(offset) < 16)
45#define IS_DYNAMIC_PROPERTY_OFFSET(offset) ((intptr_t)(offset) < 0)
47#define ZEND_PROPERTY_HOOK_SIMPLE_READ_BIT 2u
48#define ZEND_PROPERTY_HOOK_SIMPLE_WRITE_BIT 4u
49#define ZEND_PROPERTY_HOOK_SIMPLE_GET_BIT 8u
50#define ZEND_IS_PROPERTY_HOOK_SIMPLE_READ(offset) \
51 (((offset) & ZEND_PROPERTY_HOOK_SIMPLE_READ_BIT) != 0)
52#define ZEND_IS_PROPERTY_HOOK_SIMPLE_WRITE(offset) \
53 (((offset) & ZEND_PROPERTY_HOOK_SIMPLE_WRITE_BIT) != 0)
54#define ZEND_IS_PROPERTY_HOOK_SIMPLE_GET(offset) \
55 (((offset) & ZEND_PROPERTY_HOOK_SIMPLE_GET_BIT) != 0)
56#define ZEND_SET_PROPERTY_HOOK_SIMPLE_READ(cache_slot) \
58 void **__cache_slot = (cache_slot); \
60 CACHE_PTR_EX(__cache_slot + 1, (void*)((uintptr_t)CACHED_PTR_EX(__cache_slot + 1) | ZEND_PROPERTY_HOOK_SIMPLE_READ_BIT)); \
63#define ZEND_SET_PROPERTY_HOOK_SIMPLE_WRITE(cache_slot) \
65 void **__cache_slot = (cache_slot); \
67 CACHE_PTR_EX(__cache_slot + 1, (void*)((uintptr_t)CACHED_PTR_EX(__cache_slot + 1) | ZEND_PROPERTY_HOOK_SIMPLE_WRITE_BIT)); \
70#define ZEND_SET_PROPERTY_HOOK_SIMPLE_GET(cache_slot) \
72 void **__cache_slot = (cache_slot); \
74 CACHE_PTR_EX(__cache_slot + 1, (void*)((uintptr_t)CACHED_PTR_EX(__cache_slot + 1) | ZEND_PROPERTY_HOOK_SIMPLE_GET_BIT)); \
78#define IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(offset) (offset == ZEND_DYNAMIC_PROPERTY_OFFSET)
79#define ZEND_DECODE_DYN_PROP_OFFSET(offset) ((uintptr_t)(-(intptr_t)(offset) - 2))
80#define ZEND_ENCODE_DYN_PROP_OFFSET(offset) ((uintptr_t)(-((intptr_t)(offset) + 2)))
238#define zend_get_std_object_handlers() \
239 (&std_object_handlers)
241#define zend_get_function_root_class(fbc) \
242 ((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope)
244#define ZEND_PROPERTY_ISSET 0x0
245#define ZEND_PROPERTY_NOT_EMPTY ZEND_ISEMPTY
246#define ZEND_PROPERTY_EXISTS 0x2
278 if (
UNEXPECTED(zend_lazy_object_must_init(
object))) {
281 if (!
object->properties) {
284 return object->properties;
290#define ZEND_STD_BUILD_OBJECT_PROPERTIES_ARRAY_COMPATIBLE(object) ( \
293 Z_OBJ_P(object)->properties == NULL \
294 && Z_OBJ_HT_P(object)->get_properties_for == NULL \
295 && Z_OBJ_HT_P(object)->get_properties == zend_std_get_properties \
298 !zend_object_is_lazy_proxy(Z_OBJ_P(object)) \
299 || !zend_lazy_object_initialized(Z_OBJ_P(object)) \
335#define zend_release_properties(ht) do { \
336 if ((ht) && !(GC_FLAGS(ht) & GC_IMMUTABLE) && !GC_DELREF(ht)) { \
337 zend_array_destroy(ht); \
341#define zend_free_trampoline(func) do { \
342 if ((func) == &EG(trampoline)) { \
343 EG(trampoline).common.attributes = NULL; \
344 EG(trampoline).common.function_name = NULL; \
353#define ZEND_COMPARE_OBJECTS_FALLBACK(op1, op2) \
354 if (Z_TYPE_P(op1) != IS_OBJECT || \
355 Z_TYPE_P(op2) != IS_OBJECT || \
356 Z_OBJ_HT_P(op1)->compare != Z_OBJ_HT_P(op2)->compare) { \
357 return zend_std_compare_objects(op1, op2); \
count(Countable|array $value, int $mode=COUNT_NORMAL)
unsigned char key[REFLECTION_KEY_LEN]
zend_object_write_property_t write_property
zend_object_compare_t compare
zend_object_dtor_obj_t dtor_obj
zend_object_unset_property_t unset_property
zend_object_get_class_name_t get_class_name
zend_object_unset_dimension_t unset_dimension
zend_object_get_property_ptr_ptr_t get_property_ptr_ptr
zend_object_get_closure_t get_closure
zend_object_free_obj_t free_obj
zend_object_get_debug_info_t get_debug_info
zend_object_get_gc_t get_gc
zend_object_has_dimension_t has_dimension
zend_object_get_method_t get_method
zend_object_do_operation_t do_operation
zend_object_read_property_t read_property
zend_object_cast_t cast_object
zend_object_has_property_t has_property
zend_object_read_dimension_t read_dimension
zend_object_get_constructor_t get_constructor
zend_object_get_properties_for_t get_properties_for
zend_object_clone_obj_t clone_obj
zend_object_count_elements_t count_elements
zend_object_get_properties_t get_properties
zend_object_write_dimension_t write_dimension
struct _zend_property_info zend_property_info
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
union _zend_function zend_function
ZEND_API HashTable * zend_lazy_object_get_properties(zend_object *object)
struct _zend_string zend_string
ZEND_API const zend_object_handlers std_object_handlers
void(* zend_object_free_obj_t)(zend_object *object)
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 zval * zend_std_get_property_ptr_ptr(zend_object *object, zend_string *member, int type, void **cache_slot)
ZEND_API HashTable * zend_get_properties_no_lazy_init(zend_object *zobj)
void(* zend_object_unset_dimension_t)(zend_object *object, zval *offset)
ZEND_API zend_string * zend_std_get_class_name(const zend_object *zobj)
zval *(* zend_object_get_property_ptr_ptr_t)(zend_object *object, zend_string *member, int type, void **cache_slot)
enum _zend_prop_purpose zend_prop_purpose
ZEND_API zval * zend_std_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv)
ZEND_API int zend_std_has_property(zend_object *object, zend_string *member, int has_set_exists, void **cache_slot)
ZEND_API struct _zend_property_info * zend_get_property_info(const zend_class_entry *ce, zend_string *member, int silent)
ZEND_API HashTable * zend_std_get_gc(zend_object *object, zval **table, int *n)
void(* zend_object_unset_property_t)(zend_object *object, zend_string *member, void **cache_slot)
HashTable *(* zend_object_get_debug_info_t)(zend_object *object, int *is_temp)
ZEND_API zval * zend_std_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot)
zend_result(* zend_object_do_operation_t)(uint8_t opcode, zval *result, zval *op1, zval *op2)
HashTable *(* zend_object_get_properties_t)(zend_object *object)
ZEND_API zend_function * zend_std_get_method(zend_object **obj_ptr, zend_string *method_name, const zval *key)
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_result(* zend_object_get_closure_t)(zend_object *obj, zend_class_entry **ce_ptr, zend_function **fptr_ptr, zend_object **obj_ptr, bool check_only)
ZEND_API ZEND_COLD bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name)
ZEND_API zend_function * zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key)
zval *(* zend_object_read_dimension_t)(zend_object *object, zval *offset, int type, zval *rv)
ZEND_API HashTable * zend_std_build_object_properties_array(zend_object *zobj)
int(* zend_object_has_property_t)(zend_object *object, zend_string *member, int has_set_exists, void **cache_slot)
zval *(* zend_object_read_property_t)(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv)
zend_object *(* zend_object_clone_obj_t)(zend_object *object)
zend_array *(* zend_object_get_properties_for_t)(zend_object *object, zend_prop_purpose purpose)
ZEND_API void zend_std_unset_dimension(zend_object *object, zval *offset)
int(* zend_object_compare_t)(zval *object1, zval *object2)
ZEND_API uint32_t * zend_get_property_guard(zend_object *zobj, zend_string *member)
ZEND_API HashTable * zend_std_get_properties(zend_object *object)
zend_function *(* zend_object_get_constructor_t)(zend_object *object)
int(* zend_object_has_dimension_t)(zend_object *object, zval *member, int check_empty)
void(* zend_object_write_dimension_t)(zend_object *object, zval *offset, zval *value)
zend_result(* zend_object_count_elements_t)(zend_object *object, zend_long *count)
@ ZEND_PROP_PURPOSE_DEBUG
@ ZEND_PROP_PURPOSE_SERIALIZE
@ ZEND_PROP_PURPOSE_ARRAY_CAST
@ ZEND_PROP_PURPOSE_GET_OBJECT_VARS
@ ZEND_PROP_PURPOSE_VAR_EXPORT
@ _ZEND_PROP_PURPOSE_NON_EXHAUSTIVE_ENUM
ZEND_API zval * zend_std_read_dimension(zend_object *object, zval *offset, int type, zval *rv)
zend_string *(* zend_object_get_class_name_t)(const zend_object *object)
ZEND_API zend_function * zend_std_get_constructor(zend_object *object)
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 zval * zend_std_get_static_property_with_info(zend_class_entry *ce, zend_string *property_name, int type, struct _zend_property_info **prop_info)
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_result(* zend_object_cast_t)(zend_object *readobj, zval *retval, int type)
ZEND_API zend_result zend_std_cast_object_tostring(zend_object *object, zval *writeobj, int type)
ZEND_API void zend_std_unset_property(zend_object *object, zend_string *member, void **cache_slot)
ZEND_API HashTable * rebuild_object_properties_internal(zend_object *zobj)
HashTable *(* zend_object_get_gc_t)(zend_object *object, zval **table, int *n)
zval *(* zend_object_write_property_t)(zend_object *object, zend_string *member, zval *value, void **cache_slot)
void(* zend_object_dtor_obj_t)(zend_object *object)
zend_function *(* zend_object_get_method_t)(zend_object **object, zend_string *method, const zval *key)
ZEND_API void zend_class_init_statics(zend_class_entry *ce)
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_always_inline
#define UNEXPECTED(condition)
struct _zend_array zend_array
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
struct _zend_array HashTable
ZEND_RESULT_CODE zend_result
struct _zend_object_handlers zend_object_handlers
zend_property_info * prop_info