diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-02-17 17:59:18 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-02-17 17:59:18 +0400 |
commit | 2b9b9afa7a9a66f9c80013ce4121183bdff434e8 (patch) | |
tree | 6fa09b93653af14de10c02215632e5cc458cf60a /Zend/zend_variables.c | |
parent | 50661690709630bd5dcea599bb0f276083292921 (diff) | |
download | php-git-2b9b9afa7a9a66f9c80013ce4121183bdff434e8.tar.gz |
Use better data structures (incomplete)
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r-- | Zend/zend_variables.c | 77 |
1 files changed, 74 insertions, 3 deletions
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 6c4076a4e4..b9fc79ff35 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -33,7 +33,7 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC) case IS_STRING: case IS_CONSTANT: CHECK_ZVAL_STRING_REL(zvalue); - STR_FREE(Z_STR_P(zvalue)); + STR_RELEASE(Z_STR_P(zvalue)); break; case IS_ARRAY: case IS_CONSTANT_ARRAY: { @@ -78,6 +78,54 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC) } } +ZEND_API void _zval_dtor_func_for_ptr(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(Z_STR_P(zvalue)); + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: { + TSRMLS_FETCH(); + + if (Z_ARRVAL_P(zvalue) != &EG(symbol_table).ht) { + /* break possible cycles */ + Z_TYPE_P(zvalue) = IS_NULL; + zend_hash_destroy(Z_ARRVAL_P(zvalue)); + efree(Z_ARR_P(zvalue)); + } + } + break; + case IS_CONSTANT_AST: + zend_ast_destroy(Z_AST_P(zvalue)->ast); + efree(Z_AST_P(zvalue)); + break; + case IS_OBJECT: + { + TSRMLS_FETCH(); + + zend_objects_store_del(Z_OBJ_P(zvalue) TSRMLS_CC); + } + break; + case IS_RESOURCE: + { + TSRMLS_FETCH(); + + /* destroy resource */ + zend_list_delete(Z_RES_P(zvalue)); + } + 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) { @@ -85,7 +133,7 @@ ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) case IS_STRING: case IS_CONSTANT: CHECK_ZVAL_STRING_REL(zvalue); - STR_FREE(Z_STR_P(zvalue)); + STR_RELEASE(Z_STR_P(zvalue)); break; case IS_ARRAY: case IS_CONSTANT_ARRAY: @@ -103,6 +151,29 @@ ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) } } +ZEND_API void _zval_internal_dtor_for_ptr(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(Z_STR_P(zvalue)); + break; + case IS_ARRAY: + case IS_CONSTANT_ARRAY: + case IS_CONSTANT_AST: + 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) { @@ -130,7 +201,7 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) } ZVAL_NEW_ARR(zvalue); zend_hash_init(Z_ARRVAL_P(zvalue), zend_hash_num_elements(ht), NULL, ZVAL_PTR_DTOR, 0); - zend_hash_copy(Z_ARRVAL_P(zvalue), ht, (copy_ctor_func_t) zval_add_ref); + zend_hash_copy(Z_ARRVAL_P(zvalue), ht, zval_add_ref); } break; case IS_CONSTANT_AST: { |