diff options
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r-- | Zend/zend_variables.c | 44 |
1 files changed, 16 insertions, 28 deletions
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 6e9834475f..de0fa1285b 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -40,15 +40,13 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC) case IS_ARRAY: { zend_array *arr = (zend_array*)p; - if (arr != &EG(symbol_table)) { - ZEND_ASSERT(GC_REFCOUNT(arr) <= 1); - - /* break possible cycles */ - GC_TYPE(arr) = IS_NULL; - GC_REMOVE_FROM_BUFFER(arr); - zend_array_destroy(&arr->ht); - efree_size(arr, sizeof(zend_array)); - } + ZEND_ASSERT(GC_REFCOUNT(arr) <= 1); + + /* break possible cycles */ + GC_TYPE(arr) = IS_NULL; + GC_REMOVE_FROM_BUFFER(arr); + zend_array_destroy(arr); + efree_size(arr, sizeof(zend_array)); break; } case IS_CONSTANT_AST: { @@ -100,13 +98,11 @@ ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC) case IS_ARRAY: { zend_array *arr = (zend_array*)p; - if (arr != &EG(symbol_table)) { - /* break possible cycles */ - GC_TYPE(arr) = IS_NULL; - GC_REMOVE_FROM_BUFFER(arr); - zend_array_destroy(&arr->ht); - efree_size(arr, sizeof(zend_array)); - } + /* break possible cycles */ + GC_TYPE(arr) = IS_NULL; + GC_REMOVE_FROM_BUFFER(arr); + zend_array_destroy(arr); + efree_size(arr, sizeof(zend_array)); break; } case IS_CONSTANT_AST: { @@ -237,16 +233,8 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) CHECK_ZVAL_STRING_REL(Z_STR_P(zvalue)); Z_STR_P(zvalue) = zend_string_dup(Z_STR_P(zvalue), 0); break; - case IS_ARRAY: { - HashTable *ht; - - if (Z_ARR_P(zvalue) == &EG(symbol_table)) { - return; /* do nothing */ - } - ht = Z_ARRVAL_P(zvalue); - ZVAL_NEW_ARR(zvalue); - zend_array_dup(Z_ARRVAL_P(zvalue), ht); - } + case IS_ARRAY: + ZVAL_ARR(zvalue, zend_array_dup(Z_ARRVAL_P(zvalue))); break; case IS_CONSTANT_AST: { zend_ast_ref *ast = emalloc(sizeof(zend_ast_ref)); @@ -315,13 +303,13 @@ ZEND_API int zval_copy_static_var(zval *p, int num_args, va_list args, zend_hash is_ref = Z_CONST_FLAGS_P(p) & IS_LEXICAL_REF; symbol_table = zend_rebuild_symbol_table(); - p = zend_hash_find(&symbol_table->ht, key->key); + p = zend_hash_find(symbol_table, key->key); if (!p) { p = &tmp; ZVAL_NULL(&tmp); if (is_ref) { ZVAL_NEW_REF(&tmp, &tmp); - zend_hash_add_new(&symbol_table->ht, key->key, &tmp); + zend_hash_add_new(symbol_table, key->key, &tmp); Z_ADDREF_P(p); } else { zend_error(E_NOTICE,"Undefined variable: %s", key->key->val); |