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>