1 : /*
2 : +----------------------------------------------------------------------+
3 : | Zend Engine |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 2.00 of the Zend license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.zend.com/license/2_00.txt. |
11 : | If you did not receive a copy of the Zend license and are unable to |
12 : | obtain it through the world-wide-web, please send a note to |
13 : | license@zend.com so we can mail you a copy immediately. |
14 : +----------------------------------------------------------------------+
15 : | Authors: Andi Gutmans <andi@zend.com> |
16 : | Zeev Suraski <zeev@zend.com> |
17 : +----------------------------------------------------------------------+
18 : */
19 :
20 : /* $Id: zend_variables.c 279676 2009-05-01 20:30:59Z jani $ */
21 :
22 : #include <stdio.h>
23 : #include "zend.h"
24 : #include "zend_API.h"
25 : #include "zend_globals.h"
26 : #include "zend_constants.h"
27 : #include "zend_list.h"
28 :
29 : ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC) /* {{{ */
30 23091365 : {
31 23091365 : switch (zvalue->type & ~IS_CONSTANT_INDEX) {
32 : case IS_STRING:
33 : case IS_CONSTANT:
34 : CHECK_ZVAL_STRING_REL(zvalue);
35 18945959 : STR_FREE_REL(zvalue->value.str.val);
36 18945959 : break;
37 : case IS_ARRAY:
38 : case IS_CONSTANT_ARRAY: {
39 : TSRMLS_FETCH();
40 :
41 2605402 : if (zvalue->value.ht && (zvalue->value.ht != &EG(symbol_table))) {
42 2589594 : zend_hash_destroy(zvalue->value.ht);
43 2589591 : FREE_HASHTABLE(zvalue->value.ht);
44 : }
45 : }
46 2605399 : break;
47 : case IS_OBJECT:
48 : {
49 : TSRMLS_FETCH();
50 :
51 1040303 : Z_OBJ_HT_P(zvalue)->del_ref(zvalue TSRMLS_CC);
52 : }
53 1040297 : break;
54 : case IS_RESOURCE:
55 : {
56 : TSRMLS_FETCH();
57 :
58 : /* destroy resource */
59 499700 : zend_list_delete(zvalue->value.lval);
60 : }
61 499700 : break;
62 : case IS_LONG:
63 : case IS_DOUBLE:
64 : case IS_BOOL:
65 : case IS_NULL:
66 : default:
67 1 : return;
68 : break;
69 : }
70 : }
71 : /* }}} */
72 :
73 : ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) /* {{{ */
74 3059325 : {
75 3059325 : switch (zvalue->type & ~IS_CONSTANT_INDEX) {
76 : case IS_STRING:
77 : case IS_CONSTANT:
78 : CHECK_ZVAL_STRING_REL(zvalue);
79 353522 : free(zvalue->value.str.val);
80 353522 : break;
81 : case IS_ARRAY:
82 : case IS_CONSTANT_ARRAY:
83 : case IS_OBJECT:
84 : case IS_RESOURCE:
85 0 : zend_error(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources");
86 : break;
87 : case IS_LONG:
88 : case IS_DOUBLE:
89 : case IS_BOOL:
90 : case IS_NULL:
91 : default:
92 : break;
93 : }
94 3059325 : }
95 : /* }}} */
96 :
97 : ZEND_API void zval_add_ref(zval **p) /* {{{ */
98 6196644 : {
99 6196644 : (*p)->refcount++;
100 6196644 : }
101 : /* }}} */
102 :
103 : ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) /* {{{ */
104 8759553 : {
105 8759553 : switch (zvalue->type) {
106 : case IS_RESOURCE: {
107 : TSRMLS_FETCH();
108 :
109 1695 : zend_list_addref(zvalue->value.lval);
110 : }
111 1695 : break;
112 : case IS_BOOL:
113 : case IS_LONG:
114 : case IS_NULL:
115 0 : break;
116 : case IS_CONSTANT:
117 : case IS_STRING:
118 : CHECK_ZVAL_STRING_REL(zvalue);
119 7903396 : zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len);
120 7903396 : break;
121 : case IS_ARRAY:
122 : case IS_CONSTANT_ARRAY: {
123 : zval *tmp;
124 673385 : HashTable *original_ht = zvalue->value.ht;
125 673385 : HashTable *tmp_ht = NULL;
126 : TSRMLS_FETCH();
127 :
128 673385 : if (zvalue->value.ht == &EG(symbol_table)) {
129 2225 : return; /* do nothing */
130 : }
131 671160 : ALLOC_HASHTABLE_REL(tmp_ht);
132 671160 : zend_hash_init(tmp_ht, zend_hash_num_elements(original_ht), NULL, ZVAL_PTR_DTOR, 0);
133 671160 : zend_hash_copy(tmp_ht, original_ht, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
134 671160 : zvalue->value.ht = tmp_ht;
135 : }
136 671160 : break;
137 : case IS_OBJECT:
138 : {
139 : TSRMLS_FETCH();
140 181077 : Z_OBJ_HT_P(zvalue)->add_ref(zvalue TSRMLS_CC);
141 : }
142 : break;
143 : }
144 : }
145 : /* }}} */
146 :
147 : ZEND_API int zend_print_variable(zval *var) /* {{{ */
148 187255 : {
149 187255 : return zend_print_zval(var, 0);
150 : }
151 : /* }}} */
152 :
153 : #if ZEND_DEBUG
154 : ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue) /* {{{ */
155 : {
156 : zval_copy_ctor(zvalue);
157 : }
158 : /* }}} */
159 :
160 : ZEND_API void _zval_dtor_wrapper(zval *zvalue) /* {{{ */
161 : {
162 : zval_dtor(zvalue);
163 : }
164 : /* }}} */
165 :
166 : ZEND_API void _zval_internal_dtor_wrapper(zval *zvalue) /* {{{ */
167 : {
168 : zval_internal_dtor(zvalue);
169 : }
170 : /* }}} */
171 :
172 : ZEND_API void _zval_ptr_dtor_wrapper(zval **zval_ptr) /* {{{ */
173 : {
174 : zval_ptr_dtor(zval_ptr);
175 : }
176 : /* }}} */
177 :
178 : ZEND_API void _zval_internal_ptr_dtor_wrapper(zval **zval_ptr) /* {{{ */
179 : {
180 : zval_internal_ptr_dtor(zval_ptr);
181 : }
182 : /* }}} */
183 : #endif
184 :
185 : /*
186 : * Local variables:
187 : * tab-width: 4
188 : * c-basic-offset: 4
189 : * indent-tabs-mode: t
190 : * End:
191 : */
|