Annotation of embedaddon/php/Zend/zend_variables.c, revision 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>