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>