Skip to content

Commit 2c21995

Browse files
committed
Setup handlers
1 parent ec237b0 commit 2c21995

19 files changed

+191
-47
lines changed

php_phongo.c

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -162,48 +162,6 @@ static HashTable* php_phongo_std_get_gc(zend_object* object, zval** table, int*
162162
return object->handlers->get_properties(object);
163163
}
164164

165-
static zval* php_phongo_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv)
166-
{
167-
return zend_hash_find(object->handlers->get_properties(object), member);
168-
}
169-
170-
static zval *php_phongo_write_property(zend_object *zobj, zend_string *name, zval *value, void **cache_slot)
171-
{
172-
Z_TRY_ADDREF_P(value);
173-
return zend_hash_add_new(zobj->handlers->get_properties(zobj), name, value);
174-
}
175-
static int php_phongo_has_property(zend_object *zobj, zend_string *name, int has_set_exists, void **cache_slot)
176-
{
177-
zval *value = zend_hash_find(zobj->handlers->get_properties(zobj), name);
178-
if (value) {
179-
if (has_set_exists == ZEND_PROPERTY_NOT_EMPTY) {
180-
return zend_is_true(value);
181-
}
182-
if (has_set_exists < ZEND_PROPERTY_NOT_EMPTY) {
183-
ZEND_ASSERT(has_set_exists == ZEND_PROPERTY_ISSET);
184-
ZVAL_DEREF(value);
185-
return (Z_TYPE_P(value) != IS_NULL);
186-
}
187-
ZEND_ASSERT(has_set_exists == ZEND_PROPERTY_EXISTS);
188-
return true;
189-
}
190-
return false;
191-
}
192-
static void php_phongo_unset_property(zend_object *zobj, zend_string *name, void **cache_slot)
193-
{
194-
zend_hash_del(zobj->handlers->get_properties(zobj), name);
195-
}
196-
197-
static zval *php_phongo_get_property_ptr_ptr(zend_object *zobj, zend_string *name, int type, void **cache_slot)
198-
{
199-
HashTable *props = zobj->handlers->get_properties(zobj);
200-
201-
zval *value = zend_hash_find(props, name);
202-
if (value) {
203-
return value;
204-
}
205-
return zend_hash_add(props, name, &EG(uninitialized_zval));
206-
}
207165

208166
PHP_MINIT_FUNCTION(mongodb) /* {{{ */
209167
{
@@ -243,11 +201,6 @@ PHP_MINIT_FUNCTION(mongodb) /* {{{ */
243201
/* Ensure that get_gc delegates to zend_std_get_properties directly in case
244202
* our class defines a get_properties handler for debugging purposes. */
245203
phongo_std_object_handlers.get_gc = php_phongo_std_get_gc;
246-
phongo_std_object_handlers.read_property = php_phongo_read_property;
247-
phongo_std_object_handlers.write_property = php_phongo_write_property;
248-
phongo_std_object_handlers.has_property = php_phongo_has_property;
249-
phongo_std_object_handlers.unset_property = php_phongo_unset_property;
250-
phongo_std_object_handlers.get_property_ptr_ptr = php_phongo_get_property_ptr_ptr;
251204

252205
/* Initialize zend_class_entry dependencies.
253206
*

php_phongo.h

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,79 @@ zend_object_handlers* phongo_get_std_object_handlers(void);
8484
} \
8585
} while (0)
8686

87+
#define PHONGO_GET_PROPERTY_HANDLERS(_name, _intern_extractor) \
88+
static zval* php_phongo_##_name##_read_property(zend_object *zobj, zend_string *member, int type, void **cache_slot, zval *rv) \
89+
{ \
90+
HashTable *props = _intern_extractor(zobj)->php_properties; \
91+
if (!props) { \
92+
ALLOC_HASHTABLE(props); \
93+
zend_hash_init(props, 0, NULL, ZVAL_PTR_DTOR, 0); \
94+
_intern_extractor(zobj)->php_properties = props; \
95+
} \
96+
return zend_hash_find(props, member); \
97+
} \
98+
\
99+
static zval *php_phongo_##_name##_write_property(zend_object *zobj, zend_string *name, zval *value, void **cache_slot) \
100+
{ \
101+
Z_TRY_ADDREF_P(value); \
102+
HashTable *props = _intern_extractor(zobj)->php_properties; \
103+
if (!props) { \
104+
ALLOC_HASHTABLE(props); \
105+
zend_hash_init(props, 0, NULL, ZVAL_PTR_DTOR, 0); \
106+
_intern_extractor(zobj)->php_properties = props; \
107+
} \
108+
return zend_hash_add_new(props, name, value); \
109+
} \
110+
static int php_phongo_##_name##_has_property(zend_object *zobj, zend_string *name, int has_set_exists, void **cache_slot) \
111+
{ \
112+
HashTable *props = _intern_extractor(zobj)->php_properties; \
113+
if (!props) { \
114+
ALLOC_HASHTABLE(props); \
115+
zend_hash_init(props, 0, NULL, ZVAL_PTR_DTOR, 0); \
116+
_intern_extractor(zobj)->php_properties = props; \
117+
} \
118+
zval *value = zend_hash_find(props, name); \
119+
if (value) { \
120+
if (has_set_exists == ZEND_PROPERTY_NOT_EMPTY) { \
121+
return zend_is_true(value); \
122+
} \
123+
if (has_set_exists < ZEND_PROPERTY_NOT_EMPTY) { \
124+
ZEND_ASSERT(has_set_exists == ZEND_PROPERTY_ISSET); \
125+
ZVAL_DEREF(value); \
126+
return (Z_TYPE_P(value) != IS_NULL); \
127+
} \
128+
ZEND_ASSERT(has_set_exists == ZEND_PROPERTY_EXISTS); \
129+
return true; \
130+
} \
131+
return false; \
132+
} \
133+
static void php_phongo_##_name##_unset_property(zend_object *zobj, zend_string *name, void **cache_slot) \
134+
{ \
135+
HashTable *props = _intern_extractor(zobj)->php_properties; \
136+
if (!props) { \
137+
ALLOC_HASHTABLE(props); \
138+
zend_hash_init(props, 0, NULL, ZVAL_PTR_DTOR, 0); \
139+
_intern_extractor(zobj)->php_properties = props; \
140+
} \
141+
zend_hash_del(props, name); \
142+
} \
143+
\
144+
static zval *php_phongo_##_name##_get_property_ptr_ptr(zend_object *zobj, zend_string *name, int type, void **cache_slot) \
145+
{ \
146+
HashTable *props = _intern_extractor(zobj)->php_properties; \
147+
if (!props) { \
148+
ALLOC_HASHTABLE(props); \
149+
zend_hash_init(props, 0, NULL, ZVAL_PTR_DTOR, 0); \
150+
_intern_extractor(zobj)->php_properties = props; \
151+
} \
152+
\
153+
zval *value = zend_hash_find(props, name); \
154+
if (value) { \
155+
return value; \
156+
} \
157+
return zend_hash_add(props, name, &EG(uninitialized_zval)); \
158+
}
159+
87160
#define PHONGO_ZVAL_EXCEPTION_NAME(e) (ZSTR_VAL(e->ce->name))
88161

89162
#define PHONGO_SET_CREATED_BY_PID(intern) \

src/BSON/Binary.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ static HashTable* php_phongo_binary_get_properties(zend_object* object)
283283
return php_phongo_binary_get_properties_hash(object, false);
284284
}
285285

286+
PHONGO_GET_PROPERTY_HANDLERS(binary, Z_OBJ_BINARY);
287+
286288
void php_phongo_binary_init_ce(INIT_FUNC_ARGS)
287289
{
288290
php_phongo_binary_ce = register_class_MongoDB_BSON_Binary(php_phongo_binary_interface_ce, php_phongo_json_serializable_ce, php_phongo_type_ce, zend_ce_stringable);
@@ -293,6 +295,11 @@ void php_phongo_binary_init_ce(INIT_FUNC_ARGS)
293295
php_phongo_handler_binary.clone_obj = php_phongo_binary_clone_object;
294296
php_phongo_handler_binary.get_debug_info = php_phongo_binary_get_debug_info;
295297
php_phongo_handler_binary.get_properties = php_phongo_binary_get_properties;
298+
php_phongo_handler_binary.read_property = php_phongo_binary_read_property;
299+
php_phongo_handler_binary.write_property = php_phongo_binary_write_property;
300+
php_phongo_handler_binary.has_property = php_phongo_binary_has_property;
301+
php_phongo_handler_binary.unset_property = php_phongo_binary_unset_property;
302+
php_phongo_handler_binary.get_property_ptr_ptr = php_phongo_binary_get_property_ptr_ptr;
296303
php_phongo_handler_binary.free_obj = php_phongo_binary_free_object;
297304
php_phongo_handler_binary.offset = XtOffsetOf(php_phongo_binary_t, std);
298305
}

src/BSON/DBPointer.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ static HashTable* php_phongo_dbpointer_get_properties(zend_object* object)
243243
return php_phongo_dbpointer_get_properties_hash(object, false);
244244
}
245245

246+
PHONGO_GET_PROPERTY_HANDLERS(dbpointer, Z_OBJ_DBPOINTER);
247+
246248
void php_phongo_dbpointer_init_ce(INIT_FUNC_ARGS)
247249
{
248250
php_phongo_dbpointer_ce = register_class_MongoDB_BSON_DBPointer(php_phongo_json_serializable_ce, php_phongo_type_ce, zend_ce_stringable);
@@ -253,6 +255,11 @@ void php_phongo_dbpointer_init_ce(INIT_FUNC_ARGS)
253255
php_phongo_handler_dbpointer.clone_obj = php_phongo_dbpointer_clone_object;
254256
php_phongo_handler_dbpointer.get_debug_info = php_phongo_dbpointer_get_debug_info;
255257
php_phongo_handler_dbpointer.get_properties = php_phongo_dbpointer_get_properties;
258+
php_phongo_handler_dbpointer.read_property = php_phongo_dbpointer_read_property;
259+
php_phongo_handler_dbpointer.write_property = php_phongo_dbpointer_write_property;
260+
php_phongo_handler_dbpointer.has_property = php_phongo_dbpointer_has_property;
261+
php_phongo_handler_dbpointer.unset_property = php_phongo_dbpointer_unset_property;
262+
php_phongo_handler_dbpointer.get_property_ptr_ptr = php_phongo_dbpointer_get_property_ptr_ptr;
256263
php_phongo_handler_dbpointer.free_obj = php_phongo_dbpointer_free_object;
257264
php_phongo_handler_dbpointer.offset = XtOffsetOf(php_phongo_dbpointer_t, std);
258265
}

src/BSON/Decimal128.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ static HashTable* php_phongo_decimal128_get_properties(zend_object* object)
218218
return php_phongo_decimal128_get_properties_hash(object, false);
219219
}
220220

221+
PHONGO_GET_PROPERTY_HANDLERS(decimal128, Z_OBJ_DECIMAL128);
222+
221223
void php_phongo_decimal128_init_ce(INIT_FUNC_ARGS)
222224
{
223225
php_phongo_decimal128_ce = register_class_MongoDB_BSON_Decimal128(php_phongo_decimal128_interface_ce, php_phongo_json_serializable_ce, php_phongo_type_ce, zend_ce_stringable);
@@ -227,6 +229,11 @@ void php_phongo_decimal128_init_ce(INIT_FUNC_ARGS)
227229
php_phongo_handler_decimal128.clone_obj = php_phongo_decimal128_clone_object;
228230
php_phongo_handler_decimal128.get_debug_info = php_phongo_decimal128_get_debug_info;
229231
php_phongo_handler_decimal128.get_properties = php_phongo_decimal128_get_properties;
232+
php_phongo_handler_decimal128.read_property = php_phongo_decimal128_read_property;
233+
php_phongo_handler_decimal128.write_property = php_phongo_decimal128_write_property;
234+
php_phongo_handler_decimal128.has_property = php_phongo_decimal128_has_property;
235+
php_phongo_handler_decimal128.unset_property = php_phongo_decimal128_unset_property;
236+
php_phongo_handler_decimal128.get_property_ptr_ptr = php_phongo_decimal128_get_property_ptr_ptr;
230237
php_phongo_handler_decimal128.free_obj = php_phongo_decimal128_free_object;
231238
php_phongo_handler_decimal128.offset = XtOffsetOf(php_phongo_decimal128_t, std);
232239
}

src/BSON/Int64.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,8 @@ static HashTable* php_phongo_int64_get_properties(zend_object* object)
556556
return php_phongo_int64_get_properties_hash(object, false);
557557
}
558558

559+
PHONGO_GET_PROPERTY_HANDLERS(int64, Z_OBJ_INT64);
560+
559561
void php_phongo_int64_init_ce(INIT_FUNC_ARGS)
560562
{
561563
php_phongo_int64_ce = register_class_MongoDB_BSON_Int64(php_phongo_json_serializable_ce, php_phongo_type_ce, zend_ce_stringable);
@@ -566,6 +568,11 @@ void php_phongo_int64_init_ce(INIT_FUNC_ARGS)
566568
php_phongo_handler_int64.clone_obj = php_phongo_int64_clone_object;
567569
php_phongo_handler_int64.get_debug_info = php_phongo_int64_get_debug_info;
568570
php_phongo_handler_int64.get_properties = php_phongo_int64_get_properties;
571+
php_phongo_handler_int64.read_property = php_phongo_int64_read_property;
572+
php_phongo_handler_int64.write_property = php_phongo_int64_write_property;
573+
php_phongo_handler_int64.has_property = php_phongo_int64_has_property;
574+
php_phongo_handler_int64.unset_property = php_phongo_int64_unset_property;
575+
php_phongo_handler_int64.get_property_ptr_ptr = php_phongo_int64_get_property_ptr_ptr;
569576
php_phongo_handler_int64.free_obj = php_phongo_int64_free_object;
570577
php_phongo_handler_int64.offset = XtOffsetOf(php_phongo_int64_t, std);
571578
php_phongo_handler_int64.cast_object = php_phongo_int64_cast_object;

src/BSON/Iterator.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ static zend_object_iterator* php_phongo_iterator_get_iterator(zend_class_entry*
379379

380380
return iterator;
381381
}
382+
PHONGO_GET_PROPERTY_HANDLERS(iterator, Z_OBJ_ITERATOR);
382383

383384
void php_phongo_iterator_init_ce(INIT_FUNC_ARGS)
384385
{
@@ -390,6 +391,11 @@ void php_phongo_iterator_init_ce(INIT_FUNC_ARGS)
390391
php_phongo_handler_iterator.clone_obj = php_phongo_iterator_clone_object;
391392
php_phongo_handler_iterator.get_debug_info = php_phongo_iterator_get_debug_info;
392393
php_phongo_handler_iterator.get_properties = php_phongo_iterator_get_properties;
394+
php_phongo_handler_iterator.read_property = php_phongo_iterator_read_property;
395+
php_phongo_handler_iterator.write_property = php_phongo_iterator_write_property;
396+
php_phongo_handler_iterator.has_property = php_phongo_iterator_has_property;
397+
php_phongo_handler_iterator.unset_property = php_phongo_iterator_unset_property;
398+
php_phongo_handler_iterator.get_property_ptr_ptr = php_phongo_iterator_get_property_ptr_ptr;
393399
php_phongo_handler_iterator.free_obj = php_phongo_iterator_free_object;
394400
php_phongo_handler_iterator.offset = XtOffsetOf(php_phongo_iterator_t, std);
395401
}

src/BSON/Javascript.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ static HashTable* php_phongo_javascript_get_properties(zend_object* object)
324324
return php_phongo_javascript_get_properties_hash(object, false);
325325
}
326326

327+
PHONGO_GET_PROPERTY_HANDLERS(javascript, Z_OBJ_JAVASCRIPT);
328+
327329
void php_phongo_javascript_init_ce(INIT_FUNC_ARGS)
328330
{
329331
php_phongo_javascript_ce = register_class_MongoDB_BSON_Javascript(php_phongo_javascript_interface_ce, php_phongo_json_serializable_ce, php_phongo_type_ce, zend_ce_stringable);
@@ -334,6 +336,11 @@ void php_phongo_javascript_init_ce(INIT_FUNC_ARGS)
334336
php_phongo_handler_javascript.clone_obj = php_phongo_javascript_clone_object;
335337
php_phongo_handler_javascript.get_debug_info = php_phongo_javascript_get_debug_info;
336338
php_phongo_handler_javascript.get_properties = php_phongo_javascript_get_properties;
339+
php_phongo_handler_javascript.read_property = php_phongo_javascript_read_property;
340+
php_phongo_handler_javascript.write_property = php_phongo_javascript_write_property;
341+
php_phongo_handler_javascript.has_property = php_phongo_javascript_has_property;
342+
php_phongo_handler_javascript.unset_property = php_phongo_javascript_unset_property;
343+
php_phongo_handler_javascript.get_property_ptr_ptr = php_phongo_javascript_get_property_ptr_ptr;
337344
php_phongo_handler_javascript.free_obj = php_phongo_javascript_free_object;
338345
php_phongo_handler_javascript.offset = XtOffsetOf(php_phongo_javascript_t, std);
339346
}

src/BSON/ObjectId.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,8 @@ static HashTable* php_phongo_objectid_get_properties(zend_object* object)
265265
return php_phongo_objectid_get_properties_hash(object, false);
266266
}
267267

268+
PHONGO_GET_PROPERTY_HANDLERS(objectid, Z_OBJ_OBJECTID);
269+
268270
void php_phongo_objectid_init_ce(INIT_FUNC_ARGS)
269271
{
270272
php_phongo_objectid_ce = register_class_MongoDB_BSON_ObjectId(php_phongo_objectid_interface_ce, php_phongo_json_serializable_ce, php_phongo_type_ce, zend_ce_stringable);
@@ -275,6 +277,11 @@ void php_phongo_objectid_init_ce(INIT_FUNC_ARGS)
275277
php_phongo_handler_objectid.clone_obj = php_phongo_objectid_clone_object;
276278
php_phongo_handler_objectid.get_debug_info = php_phongo_objectid_get_debug_info;
277279
php_phongo_handler_objectid.get_properties = php_phongo_objectid_get_properties;
280+
php_phongo_handler_objectid.read_property = php_phongo_objectid_read_property;
281+
php_phongo_handler_objectid.write_property = php_phongo_objectid_write_property;
282+
php_phongo_handler_objectid.has_property = php_phongo_objectid_has_property;
283+
php_phongo_handler_objectid.unset_property = php_phongo_objectid_unset_property;
284+
php_phongo_handler_objectid.get_property_ptr_ptr = php_phongo_objectid_get_property_ptr_ptr;
278285
php_phongo_handler_objectid.free_obj = php_phongo_objectid_free_object;
279286
php_phongo_handler_objectid.offset = XtOffsetOf(php_phongo_objectid_t, std);
280287
}

src/BSON/Regex.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ static HashTable* php_phongo_regex_get_properties(zend_object* object)
296296
return php_phongo_regex_get_properties_hash(object, false);
297297
}
298298

299+
PHONGO_GET_PROPERTY_HANDLERS(regex, Z_OBJ_REGEX);
300+
299301
void php_phongo_regex_init_ce(INIT_FUNC_ARGS)
300302
{
301303
php_phongo_regex_ce = register_class_MongoDB_BSON_Regex(php_phongo_regex_interface_ce, php_phongo_json_serializable_ce, php_phongo_type_ce, zend_ce_stringable);
@@ -306,6 +308,11 @@ void php_phongo_regex_init_ce(INIT_FUNC_ARGS)
306308
php_phongo_handler_regex.clone_obj = php_phongo_regex_clone_object;
307309
php_phongo_handler_regex.get_debug_info = php_phongo_regex_get_debug_info;
308310
php_phongo_handler_regex.get_properties = php_phongo_regex_get_properties;
311+
php_phongo_handler_regex.read_property = php_phongo_regex_read_property;
312+
php_phongo_handler_regex.write_property = php_phongo_regex_write_property;
313+
php_phongo_handler_regex.has_property = php_phongo_regex_has_property;
314+
php_phongo_handler_regex.unset_property = php_phongo_regex_unset_property;
315+
php_phongo_handler_regex.get_property_ptr_ptr = php_phongo_regex_get_property_ptr_ptr;
309316
php_phongo_handler_regex.free_obj = php_phongo_regex_free_object;
310317
php_phongo_handler_regex.offset = XtOffsetOf(php_phongo_regex_t, std);
311318
}

0 commit comments

Comments
 (0)