summaryrefslogtreecommitdiff
path: root/Zend/zend_variables.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-02-17 17:59:18 +0400
committerDmitry Stogov <dmitry@zend.com>2014-02-17 17:59:18 +0400
commit2b9b9afa7a9a66f9c80013ce4121183bdff434e8 (patch)
tree6fa09b93653af14de10c02215632e5cc458cf60a /Zend/zend_variables.c
parent50661690709630bd5dcea599bb0f276083292921 (diff)
downloadphp-git-2b9b9afa7a9a66f9c80013ce4121183bdff434e8.tar.gz
Use better data structures (incomplete)
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r--Zend/zend_variables.c77
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: {