1 #include "../handlers/php_map_handlers.h"
2 #include "../classes/php_map_ce.h"
3
4 #include "php_map.h"
5 #include "php_pair.h"
6
php_ds_map_create_object_ex(ds_map_t * map)7 zend_object *php_ds_map_create_object_ex(ds_map_t *map)
8 {
9 #if PHP_VERSION_ID < 70300
10 php_ds_map_t *obj = ecalloc(1, sizeof(php_ds_map_t) + zend_object_properties_size(php_ds_map_ce));
11 #else
12 php_ds_map_t *obj = zend_object_alloc(sizeof(php_ds_map_t), php_ds_map_ce);
13 #endif
14 zend_object_std_init(&obj->std, php_ds_map_ce);
15 obj->std.handlers = &php_map_handlers;
16 obj->map = map;
17 return &obj->std;
18 }
19
php_ds_map_create_object(zend_class_entry * ce)20 zend_object *php_ds_map_create_object(zend_class_entry *ce)
21 {
22 return php_ds_map_create_object_ex(ds_map());
23 }
24
php_ds_map_create_clone(ds_map_t * map)25 zend_object *php_ds_map_create_clone(ds_map_t *map)
26 {
27 return php_ds_map_create_object_ex(ds_map_clone(map));
28 }
29
ds_map_pairs_to_php_hashtable(ds_map_t * map)30 HashTable *ds_map_pairs_to_php_hashtable(ds_map_t *map)
31 {
32 HashTable *array;
33
34 zval *key;
35 zval *value;
36
37 zval pair;
38
39 ALLOC_HASHTABLE(array);
40 zend_hash_init(array, DS_MAP_SIZE(map), NULL, ZVAL_PTR_DTOR, 0);
41
42 DS_HTABLE_FOREACH_KEY_VALUE(map->table, key, value) {
43 ZVAL_DS_PAIR(&pair, php_ds_pair_ex(key, value));
44 zend_hash_next_index_insert(array, &pair);
45 }
46 DS_HTABLE_FOREACH_END();
47
48 return array;
49 }
50
ds_map_pairs(ds_map_t * map)51 zval *ds_map_pairs(ds_map_t *map)
52 {
53 zval *buffer = ds_allocate_zval_buffer(DS_MAP_SIZE(map));
54 zval *target = buffer;
55
56 zval *key;
57 zval *value;
58
59 DS_HTABLE_FOREACH_KEY_VALUE(map->table, key, value) {
60 ZVAL_DS_PAIR(target++, php_ds_pair_ex(key, value));
61 }
62 DS_HTABLE_FOREACH_END();
63
64 return buffer;
65 }
66
php_ds_map_serialize(zval * object,unsigned char ** buffer,size_t * length,zend_serialize_data * data)67 int php_ds_map_serialize(zval *object, unsigned char **buffer, size_t *length, zend_serialize_data *data)
68 {
69 return ds_htable_serialize(Z_DS_MAP_P(object)->table, buffer, length, data);
70 }
71
php_ds_map_unserialize(zval * object,zend_class_entry * ce,const unsigned char * buffer,size_t length,zend_unserialize_data * data)72 int php_ds_map_unserialize(zval *object, zend_class_entry *ce, const unsigned char *buffer, size_t length, zend_unserialize_data *data)
73 {
74 ds_map_t *map = ds_map();
75
76 if (ds_htable_unserialize(map->table, buffer, length, data) == FAILURE) {
77 ds_map_free(map);
78 return FAILURE;
79 }
80
81 ZVAL_DS_MAP(object, map);
82 return SUCCESS;
83 }
84