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