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 277841 2009-03-26 20:02:53Z felipe $ */
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 44562905 : {
31 44562905 : switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
32 : case IS_CONSTANT: {
33 154 : goto dtor_unicode;
34 : }
35 : case IS_STRING:
36 : CHECK_ZVAL_STRING_REL(zvalue);
37 21511377 : STR_FREE_REL(Z_STRVAL_P(zvalue));
38 21511377 : break;
39 : case IS_UNICODE:
40 18171293 : dtor_unicode:
41 : CHECK_ZVAL_UNICODE_REL(zvalue);
42 18171293 : STR_FREE_REL(Z_USTRVAL_P(zvalue));
43 18171293 : break;
44 : case IS_ARRAY:
45 : case IS_CONSTANT_ARRAY: {
46 : TSRMLS_FETCH();
47 :
48 3254482 : if (Z_ARRVAL_P(zvalue) && (Z_ARRVAL_P(zvalue) != &EG(symbol_table))) {
49 3234932 : zend_hash_destroy(Z_ARRVAL_P(zvalue));
50 3234932 : FREE_HASHTABLE(Z_ARRVAL_P(zvalue));
51 : }
52 : }
53 3254482 : break;
54 : case IS_OBJECT:
55 : {
56 : TSRMLS_FETCH();
57 :
58 1099574 : Z_OBJ_HT_P(zvalue)->del_ref(zvalue TSRMLS_CC);
59 : }
60 1099569 : break;
61 : case IS_RESOURCE:
62 : {
63 : TSRMLS_FETCH();
64 :
65 : /* destroy resource */
66 526148 : zend_list_delete(Z_LVAL_P(zvalue));
67 : }
68 526148 : break;
69 : case IS_LONG:
70 : case IS_DOUBLE:
71 : case IS_BOOL:
72 : case IS_NULL:
73 : default:
74 31 : return;
75 : break;
76 : }
77 : }
78 : /* }}} */
79 :
80 : ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) /* {{{ */
81 47947746 : {
82 47947746 : switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
83 : case IS_CONSTANT: {
84 0 : goto dtor_unicode;
85 : }
86 : case IS_STRING:
87 : CHECK_ZVAL_STRING_REL(zvalue);
88 0 : free(Z_STRVAL_P(zvalue));
89 0 : break;
90 : case IS_UNICODE:
91 1806134 : dtor_unicode:
92 : CHECK_ZVAL_UNICODE_REL(zvalue);
93 1806134 : free(Z_USTRVAL_P(zvalue));
94 1806134 : break;
95 : case IS_ARRAY:
96 : case IS_CONSTANT_ARRAY:
97 : case IS_OBJECT:
98 : case IS_RESOURCE:
99 0 : zend_error(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources");
100 : break;
101 : case IS_LONG:
102 : case IS_DOUBLE:
103 : case IS_BOOL:
104 : case IS_NULL:
105 : default:
106 : break;
107 : }
108 47947746 : }
109 : /* }}} */
110 :
111 : ZEND_API void zval_add_ref(zval **p) /* {{{ */
112 10094820 : {
113 10094820 : Z_ADDREF_PP(p);
114 10094820 : }
115 : /* }}} */
116 :
117 : ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) /* {{{ */
118 23146743 : {
119 23146743 : switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
120 : case IS_RESOURCE: {
121 : TSRMLS_FETCH();
122 :
123 6564 : zend_list_addref(Z_LVAL_P(zvalue));
124 : }
125 6564 : break;
126 : case IS_BOOL:
127 : case IS_LONG:
128 : case IS_NULL:
129 0 : break;
130 : case IS_CONSTANT: {
131 34 : goto copy_unicode;
132 : }
133 : case IS_STRING:
134 : CHECK_ZVAL_STRING_REL(zvalue);
135 13894151 : Z_STRVAL_P(zvalue) = (char *) estrndup_rel(Z_STRVAL_P(zvalue), Z_STRLEN_P(zvalue));
136 13894151 : break;
137 : case IS_UNICODE:
138 8047439 : copy_unicode:
139 : CHECK_ZVAL_UNICODE_REL(zvalue);
140 8047439 : Z_USTRVAL_P(zvalue) = eustrndup_rel(Z_USTRVAL_P(zvalue), Z_USTRLEN_P(zvalue));
141 8047439 : break;
142 : case IS_ARRAY:
143 : case IS_CONSTANT_ARRAY: {
144 : zval *tmp;
145 981457 : HashTable *original_ht = Z_ARRVAL_P(zvalue);
146 981457 : HashTable *tmp_ht = NULL;
147 : TSRMLS_FETCH();
148 :
149 981457 : if (Z_ARRVAL_P(zvalue) == &EG(symbol_table)) {
150 2526 : return; /* do nothing */
151 : }
152 978931 : ALLOC_HASHTABLE_REL(tmp_ht);
153 978931 : zend_u_hash_init(tmp_ht, zend_hash_num_elements(original_ht), NULL, ZVAL_PTR_DTOR, 0, original_ht->unicode);
154 978931 : zend_hash_copy(tmp_ht, original_ht, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
155 978931 : Z_ARRVAL_P(zvalue) = tmp_ht;
156 : }
157 978931 : break;
158 : case IS_OBJECT:
159 : {
160 : TSRMLS_FETCH();
161 217132 : Z_OBJ_HT_P(zvalue)->add_ref(zvalue TSRMLS_CC);
162 : }
163 : break;
164 : }
165 : }
166 : /* }}} */
167 :
168 : ZEND_API int zend_print_variable(zval *var) /* {{{ */
169 197518 : {
170 197518 : return zend_print_zval(var, 0);
171 : }
172 : /* }}} */
173 :
174 : #if ZEND_DEBUG
175 : ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue) /* {{{ */
176 : {
177 : zval_copy_ctor(zvalue);
178 : }
179 : /* }}} */
180 :
181 : ZEND_API void _zval_dtor_wrapper(zval *zvalue) /* {{{ */
182 : {
183 : zval_dtor(zvalue);
184 : }
185 : /* }}} */
186 :
187 : ZEND_API void _zval_internal_dtor_wrapper(zval *zvalue) /* {{{ */
188 : {
189 : zval_internal_dtor(zvalue);
190 : }
191 : /* }}} */
192 :
193 : ZEND_API void _zval_ptr_dtor_wrapper(zval **zval_ptr) /* {{{ */
194 : {
195 : zval_ptr_dtor(zval_ptr);
196 : }
197 : /* }}} */
198 :
199 : ZEND_API void _zval_internal_ptr_dtor_wrapper(zval **zval_ptr) /* {{{ */
200 : {
201 : zval_internal_ptr_dtor(zval_ptr);
202 : }
203 : /* }}} */
204 : #endif
205 :
206 : /*
207 : * Local variables:
208 : * tab-width: 4
209 : * c-basic-offset: 4
210 : * indent-tabs-mode: t
211 : * End:
212 : */
|