Annotation of embedaddon/php/Zend/zend_variables.c, revision 1.1.1.1
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | Zend Engine |
4: +----------------------------------------------------------------------+
5: | Copyright (c) 1998-2012 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 321634 2012-01-01 13:15:04Z 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:
30: ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC)
31: {
32: switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
33: case IS_STRING:
34: case IS_CONSTANT:
35: CHECK_ZVAL_STRING_REL(zvalue);
36: STR_FREE_REL(zvalue->value.str.val);
37: #if SUHOSIN_PATCH
38: zvalue->value.str.len = 0;
39: #endif
40: break;
41: case IS_ARRAY:
42: case IS_CONSTANT_ARRAY: {
43: TSRMLS_FETCH();
44:
45: if (zvalue->value.ht && (zvalue->value.ht != &EG(symbol_table))) {
46: zend_hash_destroy(zvalue->value.ht);
47: FREE_HASHTABLE(zvalue->value.ht);
48: }
49: }
50: break;
51: case IS_OBJECT:
52: {
53: TSRMLS_FETCH();
54:
55: Z_OBJ_HT_P(zvalue)->del_ref(zvalue TSRMLS_CC);
56: }
57: break;
58: case IS_RESOURCE:
59: {
60: TSRMLS_FETCH();
61:
62: /* destroy resource */
63: zend_list_delete(zvalue->value.lval);
64: }
65: break;
66: case IS_LONG:
67: case IS_DOUBLE:
68: case IS_BOOL:
69: case IS_NULL:
70: default:
71: return;
72: break;
73: }
74: }
75:
76:
77: ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC)
78: {
79: switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
80: case IS_STRING:
81: case IS_CONSTANT:
82: CHECK_ZVAL_STRING_REL(zvalue);
83: free(zvalue->value.str.val);
84: #if SUHOSIN_PATCH
85: zvalue->value.str.len = 0;
86: #endif
87: break;
88: case IS_ARRAY:
89: case IS_CONSTANT_ARRAY:
90: case IS_OBJECT:
91: case IS_RESOURCE:
92: zend_error(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources");
93: break;
94: case IS_LONG:
95: case IS_DOUBLE:
96: case IS_BOOL:
97: case IS_NULL:
98: default:
99: break;
100: }
101: }
102:
103:
104: ZEND_API void zval_add_ref(zval **p)
105: {
106: Z_ADDREF_PP(p);
107: }
108:
109:
110: ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC)
111: {
112: switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
113: case IS_RESOURCE: {
114: TSRMLS_FETCH();
115:
116: zend_list_addref(zvalue->value.lval);
117: }
118: break;
119: case IS_BOOL:
120: case IS_LONG:
121: case IS_NULL:
122: break;
123: case IS_CONSTANT:
124: case IS_STRING:
125: CHECK_ZVAL_STRING_REL(zvalue);
126: zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len);
127: break;
128: case IS_ARRAY:
129: case IS_CONSTANT_ARRAY: {
130: zval *tmp;
131: HashTable *original_ht = zvalue->value.ht;
132: HashTable *tmp_ht = NULL;
133: TSRMLS_FETCH();
134:
135: if (zvalue->value.ht == &EG(symbol_table)) {
136: return; /* do nothing */
137: }
138: ALLOC_HASHTABLE_REL(tmp_ht);
139: zend_hash_init(tmp_ht, zend_hash_num_elements(original_ht), NULL, ZVAL_PTR_DTOR, 0);
140: zend_hash_copy(tmp_ht, original_ht, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
141: zvalue->value.ht = tmp_ht;
142: }
143: break;
144: case IS_OBJECT:
145: {
146: TSRMLS_FETCH();
147: Z_OBJ_HT_P(zvalue)->add_ref(zvalue TSRMLS_CC);
148: }
149: break;
150: }
151: }
152:
153:
154: ZEND_API int zend_print_variable(zval *var)
155: {
156: return zend_print_zval(var, 0);
157: }
158:
159:
160: ZEND_API void _zval_dtor_wrapper(zval *zvalue)
161: {
162: TSRMLS_FETCH();
163:
164: GC_REMOVE_ZVAL_FROM_BUFFER(zvalue);
165: zval_dtor(zvalue);
166: }
167:
168: ZEND_API void zval_property_ctor(zval **p) /* {{{ */
169: {
170: zval *orig_ptr = *p;
171:
172: ALLOC_ZVAL(*p);
173: **p = *orig_ptr;
174: zval_copy_ctor(*p);
175: Z_SET_REFCOUNT_PP(p, 1);
176: Z_UNSET_ISREF_PP(p);
177: }
178: /* }}} */
179:
180: #if ZEND_DEBUG
181: ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue)
182: {
183: zval_copy_ctor(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: #endif
204:
205: /*
206: * Local variables:
207: * tab-width: 4
208: * c-basic-offset: 4
209: * indent-tabs-mode: t
210: * End:
211: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>