diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /Zend/zend_variables.c | |
download | php2-master.tar.gz |
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r-- | Zend/zend_variables.c | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c new file mode 100644 index 0000000..c0e1849 --- /dev/null +++ b/Zend/zend_variables.c @@ -0,0 +1,243 @@ +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.00 of the Zend license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.zend.com/license/2_00.txt. | + | If you did not receive a copy of the Zend license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@zend.com so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Andi Gutmans <andi@zend.com> | + | Zeev Suraski <zeev@zend.com> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#include <stdio.h> +#include "zend.h" +#include "zend_API.h" +#include "zend_globals.h" +#include "zend_constants.h" +#include "zend_list.h" + + +ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC) +{ + switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) { + case IS_STRING: + case IS_CONSTANT: + CHECK_ZVAL_STRING_REL(zvalue); + STR_FREE_REL(zvalue->value.str.val); + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: { + TSRMLS_FETCH(); + + if (zvalue->value.ht && (zvalue->value.ht != &EG(symbol_table))) { + /* break possible cycles */ + Z_TYPE_P(zvalue) = IS_NULL; + zend_hash_destroy(zvalue->value.ht); + FREE_HASHTABLE(zvalue->value.ht); + } + } + break; + case IS_OBJECT: + { + TSRMLS_FETCH(); + + Z_OBJ_HT_P(zvalue)->del_ref(zvalue TSRMLS_CC); + } + break; + case IS_RESOURCE: + { + TSRMLS_FETCH(); + + /* destroy resource */ + zend_list_delete(zvalue->value.lval); + } + break; + case IS_LONG: + case IS_DOUBLE: + case IS_BOOL: + case IS_NULL: + default: + return; + break; + } +} + + +ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) +{ + switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) { + case IS_STRING: + case IS_CONSTANT: + CHECK_ZVAL_STRING_REL(zvalue); + str_free(zvalue->value.str.val); + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: + case IS_OBJECT: + case IS_RESOURCE: + zend_error(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources"); + break; + case IS_LONG: + case IS_DOUBLE: + case IS_BOOL: + case IS_NULL: + default: + break; + } +} + + +ZEND_API void zval_add_ref(zval **p) +{ + Z_ADDREF_PP(p); +} + + +ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) +{ + switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) { + case IS_RESOURCE: { + TSRMLS_FETCH(); + + zend_list_addref(zvalue->value.lval); + } + break; + case IS_BOOL: + case IS_LONG: + case IS_NULL: + break; + case IS_CONSTANT: + case IS_STRING: + CHECK_ZVAL_STRING_REL(zvalue); + if (!IS_INTERNED(zvalue->value.str.val)) { + zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len); + } + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: { + zval *tmp; + HashTable *original_ht = zvalue->value.ht; + HashTable *tmp_ht = NULL; + TSRMLS_FETCH(); + + if (zvalue->value.ht == &EG(symbol_table)) { + return; /* do nothing */ + } + ALLOC_HASHTABLE_REL(tmp_ht); + zend_hash_init(tmp_ht, zend_hash_num_elements(original_ht), NULL, ZVAL_PTR_DTOR, 0); + zend_hash_copy(tmp_ht, original_ht, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); + zvalue->value.ht = tmp_ht; + } + break; + case IS_OBJECT: + { + TSRMLS_FETCH(); + Z_OBJ_HT_P(zvalue)->add_ref(zvalue TSRMLS_CC); + } + break; + } +} + + +ZEND_API int zend_print_variable(zval *var) +{ + return zend_print_zval(var, 0); +} + + +ZEND_API void _zval_dtor_wrapper(zval *zvalue) +{ + TSRMLS_FETCH(); + + GC_REMOVE_ZVAL_FROM_BUFFER(zvalue); + zval_dtor(zvalue); +} + + +#if ZEND_DEBUG +ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue) +{ + zval_copy_ctor(zvalue); +} + + +ZEND_API void _zval_internal_dtor_wrapper(zval *zvalue) +{ + zval_internal_dtor(zvalue); +} + + +ZEND_API void _zval_ptr_dtor_wrapper(zval **zval_ptr) +{ + zval_ptr_dtor(zval_ptr); +} + + +ZEND_API void _zval_internal_ptr_dtor_wrapper(zval **zval_ptr) +{ + zval_internal_ptr_dtor(zval_ptr); +} +#endif + +ZEND_API int zval_copy_static_var(zval **p TSRMLS_DC, int num_args, va_list args, zend_hash_key *key) /* {{{ */ +{ + HashTable *target = va_arg(args, HashTable*); + zend_bool is_ref; + zval *tmp; + + if (Z_TYPE_PP(p) & (IS_LEXICAL_VAR|IS_LEXICAL_REF)) { + is_ref = Z_TYPE_PP(p) & IS_LEXICAL_REF; + + if (!EG(active_symbol_table)) { + zend_rebuild_symbol_table(TSRMLS_C); + } + if (zend_hash_quick_find(EG(active_symbol_table), key->arKey, key->nKeyLength, key->h, (void **) &p) == FAILURE) { + if (is_ref) { + ALLOC_INIT_ZVAL(tmp); + Z_SET_ISREF_P(tmp); + zend_hash_quick_add(EG(active_symbol_table), key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), (void**)&p); + } else { + tmp = EG(uninitialized_zval_ptr); + zend_error(E_NOTICE,"Undefined variable: %s", key->arKey); + } + } else { + if (is_ref) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(p); + tmp = *p; + } else if (Z_ISREF_PP(p)) { + ALLOC_INIT_ZVAL(tmp); + ZVAL_COPY_VALUE(tmp, *p); + zval_copy_ctor(tmp); + Z_SET_REFCOUNT_P(tmp, 0); + Z_UNSET_ISREF_P(tmp); + } else { + tmp = *p; + } + } + } else { + tmp = *p; + } + if (zend_hash_quick_add(target, key->arKey, key->nKeyLength, key->h, &tmp, sizeof(zval*), NULL) == SUCCESS) { + Z_ADDREF_P(tmp); + } + return ZEND_HASH_APPLY_KEEP; +} +/* }}} */ + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode: t + * End: + */ |