--- embedaddon/php/Zend/zend_variables.c 2012/02/21 23:47:52 1.1 +++ embedaddon/php/Zend/zend_variables.c 2012/05/29 12:34:36 1.1.1.2 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_variables.c,v 1.1 2012/02/21 23:47:52 misho Exp $ */ +/* $Id: zend_variables.c,v 1.1.1.2 2012/05/29 12:34:36 misho Exp $ */ #include #include "zend.h" @@ -34,9 +34,6 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_L case IS_CONSTANT: CHECK_ZVAL_STRING_REL(zvalue); STR_FREE_REL(zvalue->value.str.val); -#if SUHOSIN_PATCH - zvalue->value.str.len = 0; -#endif break; case IS_ARRAY: case IS_CONSTANT_ARRAY: { @@ -80,10 +77,7 @@ ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FI case IS_STRING: case IS_CONSTANT: CHECK_ZVAL_STRING_REL(zvalue); - free(zvalue->value.str.val); -#if SUHOSIN_PATCH - zvalue->value.str.len = 0; -#endif + str_free(zvalue->value.str.val); break; case IS_ARRAY: case IS_CONSTANT_ARRAY: @@ -123,7 +117,9 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_F 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: { @@ -165,18 +161,7 @@ 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) { @@ -201,6 +186,51 @@ ZEND_API void _zval_internal_ptr_dtor_wrapper(zval **z 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: