1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #ifndef ZEND_OBJECT_HANDLERS_H
23 #define ZEND_OBJECT_HANDLERS_H
24
25 struct _zend_property_info;
26
27 #define ZEND_WRONG_PROPERTY_INFO \
28 ((struct _zend_property_info*)((zend_intptr_t)-1))
29
30 #define ZEND_DYNAMIC_PROPERTY_OFFSET (-1)
31 #define ZEND_WRONG_PROPERTY_OFFSET (-2)
32
33
34
35
36
37
38 typedef zval *(*zend_object_read_property_t)(zval *object, zval *member, int type, void **cache_slot, zval *rv);
39
40
41 typedef zval *(*zend_object_read_dimension_t)(zval *object, zval *offset, int type, zval *rv);
42
43
44
45
46
47
48
49
50 typedef void (*zend_object_write_property_t)(zval *object, zval *member, zval *value, void **cache_slot);
51
52
53 typedef void (*zend_object_write_dimension_t)(zval *object, zval *offset, zval *value);
54
55
56
57 typedef zval *(*zend_object_get_property_ptr_ptr_t)(zval *object, zval *member, int type, void **cache_slot);
58
59
60
61 typedef void (*zend_object_set_t)(zval *object, zval *value);
62
63
64
65
66 typedef zval* (*zend_object_get_t)(zval *object, zval *rv);
67
68
69
70
71
72
73
74 typedef int (*zend_object_has_property_t)(zval *object, zval *member, int has_set_exists, void **cache_slot);
75
76
77 typedef int (*zend_object_has_dimension_t)(zval *object, zval *member, int check_empty);
78
79
80 typedef void (*zend_object_unset_property_t)(zval *object, zval *member, void **cache_slot);
81
82
83 typedef void (*zend_object_unset_dimension_t)(zval *object, zval *offset);
84
85
86 typedef HashTable *(*zend_object_get_properties_t)(zval *object);
87
88 typedef HashTable *(*zend_object_get_debug_info_t)(zval *object, int *is_temp);
89
90
91
92
93
94 typedef int (*zend_object_call_method_t)(zend_string *method, zend_object *object, INTERNAL_FUNCTION_PARAMETERS);
95 typedef union _zend_function *(*zend_object_get_method_t)(zend_object **object, zend_string *method, const zval *key);
96 typedef union _zend_function *(*zend_object_get_constructor_t)(zend_object *object);
97
98
99 typedef void (*zend_object_dtor_obj_t)(zend_object *object);
100 typedef void (*zend_object_free_obj_t)(zend_object *object);
101 typedef zend_object* (*zend_object_clone_obj_t)(zval *object);
102
103
104
105 typedef zend_string *(*zend_object_get_class_name_t)(const zend_object *object);
106
107 typedef int (*zend_object_compare_t)(zval *object1, zval *object2);
108 typedef int (*zend_object_compare_zvals_t)(zval *resul, zval *op1, zval *op2);
109
110
111
112 typedef int (*zend_object_cast_t)(zval *readobj, zval *retval, int type);
113
114
115
116 typedef int (*zend_object_count_elements_t)(zval *object, zend_long *count);
117
118 typedef int (*zend_object_get_closure_t)(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zend_object **obj_ptr);
119
120 typedef HashTable *(*zend_object_get_gc_t)(zval *object, zval **table, int *n);
121
122 typedef int (*zend_object_do_operation_t)(zend_uchar opcode, zval *result, zval *op1, zval *op2);
123
124 struct _zend_object_handlers {
125
126 int offset;
127
128 zend_object_free_obj_t free_obj;
129 zend_object_dtor_obj_t dtor_obj;
130 zend_object_clone_obj_t clone_obj;
131
132 zend_object_read_property_t read_property;
133 zend_object_write_property_t write_property;
134 zend_object_read_dimension_t read_dimension;
135 zend_object_write_dimension_t write_dimension;
136 zend_object_get_property_ptr_ptr_t get_property_ptr_ptr;
137 zend_object_get_t get;
138 zend_object_set_t set;
139 zend_object_has_property_t has_property;
140 zend_object_unset_property_t unset_property;
141 zend_object_has_dimension_t has_dimension;
142 zend_object_unset_dimension_t unset_dimension;
143 zend_object_get_properties_t get_properties;
144 zend_object_get_method_t get_method;
145 zend_object_call_method_t call_method;
146 zend_object_get_constructor_t get_constructor;
147 zend_object_get_class_name_t get_class_name;
148 zend_object_compare_t compare_objects;
149 zend_object_cast_t cast_object;
150 zend_object_count_elements_t count_elements;
151 zend_object_get_debug_info_t get_debug_info;
152 zend_object_get_closure_t get_closure;
153 zend_object_get_gc_t get_gc;
154 zend_object_do_operation_t do_operation;
155 zend_object_compare_zvals_t compare;
156 };
157
158 extern ZEND_API zend_object_handlers std_object_handlers;
159
160 #define zend_get_function_root_class(fbc) \
161 ((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope)
162
163 BEGIN_EXTERN_C()
164 ZEND_API union _zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key);
165 ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent);
166 ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name);
167 ZEND_API union _zend_function *zend_std_get_constructor(zend_object *object);
168 ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent);
169 ZEND_API HashTable *zend_std_get_properties(zval *object);
170 ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp);
171 ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int type);
172 ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot);
173 ZEND_API void rebuild_object_properties(zend_object *zobj);
174
175 ZEND_API int zend_check_private(union _zend_function *fbc, zend_class_entry *ce, zend_string *function_name);
176
177 ZEND_API int zend_check_protected(zend_class_entry *ce, zend_class_entry *scope);
178
179 ZEND_API int zend_check_property_access(zend_object *zobj, zend_string *prop_info_name);
180
181 ZEND_API zend_function *zend_get_call_trampoline_func(zend_class_entry *ce, zend_string *method_name, int is_static);
182
183 #define zend_free_trampoline(func) do { \
184 if ((func) == &EG(trampoline)) { \
185 EG(trampoline).common.function_name = NULL; \
186 } else { \
187 efree(func); \
188 } \
189 } while (0)
190
191 END_EXTERN_C()
192
193 #endif
194
195
196
197
198
199
200
201