diff options
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r-- | Zend/zend_variables.c | 62 |
1 files changed, 49 insertions, 13 deletions
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index f69700baa..a4fda446c 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -77,7 +77,7 @@ ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC) case IS_STRING: case IS_CONSTANT: CHECK_ZVAL_STRING_REL(zvalue); - free(zvalue->value.str.val); + str_free(zvalue->value.str.val); break; case IS_ARRAY: case IS_CONSTANT_ARRAY: @@ -117,7 +117,9 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC) case IS_CONSTANT: case IS_STRING: CHECK_ZVAL_STRING_REL(zvalue); - zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len); + 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: { @@ -159,17 +161,6 @@ ZEND_API void _zval_dtor_wrapper(zval *zvalue) zval_dtor(zvalue); } -ZEND_API void zval_property_ctor(zval **p) /* {{{ */ -{ - zval *orig_ptr = *p; - - ALLOC_ZVAL(*p); - **p = *orig_ptr; - zval_copy_ctor(*p); - Z_SET_REFCOUNT_PP(p, 1); - Z_UNSET_ISREF_PP(p); -} -/* }}} */ #if ZEND_DEBUG ZEND_API void _zval_copy_ctor_wrapper(zval *zvalue) @@ -196,6 +187,51 @@ ZEND_API void _zval_internal_ptr_dtor_wrapper(zval **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 |