1 #include "php_stack_handlers.h"
2 #include "php_common_handlers.h"
3 #include "../../ds/ds_stack.h"
4 #include "../objects/php_stack.h"
5
6 zend_object_handlers php_ds_stack_handlers;
7
php_ds_stack_write_dimension(zend_object * obj,zval * offset,zval * value)8 static void php_ds_stack_write_dimension
9 #if PHP_VERSION_ID >= 80000
10 (zend_object *obj, zval *offset, zval *value) {
11 ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack;
12 #else
13 (zval *obj, zval *offset, zval *value) {
14 ds_stack_t *stack = Z_DS_STACK_P(obj);
15 #endif
16 if (offset == NULL) {
17 ds_stack_push(stack, value);
18 return;
19 }
20 ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED();
21 }
22
23 static void php_ds_stack_free_object(zend_object *object)
24 {
25 php_ds_stack_t *obj = php_ds_stack_fetch_object(object);
26 if (obj->stack) {
27 ds_stack_free(obj->stack);
28 obj->stack = NULL;
29 }
30 zend_object_std_dtor(&obj->std);
31 }
32
33 static int php_ds_stack_count_elements
34 #if PHP_VERSION_ID >= 80000
35 (zend_object *obj, zend_long *count) {
36 ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack;
37 #else
38 (zval *obj, zend_long *count) {
39 ds_stack_t *stack = Z_DS_STACK_P(obj);
40 #endif
41 *count = DS_STACK_SIZE(stack);
42 return SUCCESS;
43 }
44
45 static zend_object *php_ds_stack_clone_obj
46 #if PHP_VERSION_ID >= 80000
47 (zend_object *obj) {
48 ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack;
49 #else
50 (zval *obj) {
51 ds_stack_t *stack = Z_DS_STACK_P(obj);
52 #endif
53 return php_ds_stack_create_clone(stack);
54 }
55
56 static HashTable *php_ds_stack_get_debug_info
57 #if PHP_VERSION_ID >= 80000
58 (zend_object *obj, int *is_temp) {
59 ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack;
60 #else
61 (zval *obj, int *is_temp) {
62 ds_stack_t *stack = Z_DS_STACK_P(obj);
63 #endif
64 zval arr;
65 *is_temp = 1;
66
67 ds_stack_to_array(stack, &arr);
68 return Z_ARRVAL(arr);
69 }
70
71 static HashTable *php_ds_stack_get_gc
72 #if PHP_VERSION_ID >= 80000
73 (zend_object *obj, zval **gc_data, int *gc_count) {
74 ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack;
75 #else
76 (zval *obj, zval **gc_data, int *gc_count) {
77 ds_stack_t *stack = Z_DS_STACK_P(obj);
78 #endif
79 *gc_data = (zval*) stack->vector->buffer;
80 *gc_count = (int) stack->vector->size;
81 return NULL;
82 }
83
84 void php_register_ds_stack_handlers()
85 {
86 memcpy(&php_ds_stack_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
87
88 php_ds_stack_handlers.offset = XtOffsetOf(php_ds_stack_t, std);
89
90 php_ds_stack_handlers.dtor_obj = zend_objects_destroy_object;
91 php_ds_stack_handlers.get_gc = php_ds_stack_get_gc;
92 php_ds_stack_handlers.free_obj = php_ds_stack_free_object;
93 php_ds_stack_handlers.clone_obj = php_ds_stack_clone_obj;
94 php_ds_stack_handlers.cast_object = php_ds_default_cast_object;
95 php_ds_stack_handlers.get_debug_info = php_ds_stack_get_debug_info;
96 php_ds_stack_handlers.count_elements = php_ds_stack_count_elements;
97 php_ds_stack_handlers.write_dimension = php_ds_stack_write_dimension;
98 php_ds_stack_handlers.read_dimension = php_ds_read_dimension_by_key_not_supported;
99 php_ds_stack_handlers.unset_dimension = php_ds_unset_dimension_by_key_not_supported;
100 php_ds_stack_handlers.has_dimension = php_ds_has_dimension_by_key_not_supported;
101 }
102