summaryrefslogtreecommitdiff
path: root/Zend/zend_variables.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_variables.c')
-rw-r--r--Zend/zend_variables.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c
index 3bedc0a4ad..7d5b208ca1 100644
--- a/Zend/zend_variables.c
+++ b/Zend/zend_variables.c
@@ -30,11 +30,21 @@
ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC)
{
switch (zvalue->type & ~IS_CONSTANT_INDEX) {
+ case IS_CONSTANT: {
+ TSRMLS_FETCH();
+
+ if (UG(unicode)) goto dtor_unicode;
+ }
case IS_STRING:
- case IS_CONSTANT:
+ case IS_BINARY:
CHECK_ZVAL_STRING_REL(zvalue);
STR_FREE_REL(zvalue->value.str.val);
break;
+ case IS_UNICODE:
+dtor_unicode:
+ CHECK_ZVAL_UNICODE_REL(zvalue);
+ STR_FREE_REL(zvalue->value.ustr.val);
+ break;
case IS_ARRAY:
case IS_CONSTANT_ARRAY: {
TSRMLS_FETCH();
@@ -74,11 +84,21 @@ ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC)
ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC)
{
switch (zvalue->type & ~IS_CONSTANT_INDEX) {
+ case IS_CONSTANT: {
+ TSRMLS_FETCH();
+
+ if (UG(unicode)) goto dtor_unicode;
+ }
case IS_STRING:
- case IS_CONSTANT:
+ case IS_BINARY:
CHECK_ZVAL_STRING_REL(zvalue);
free(zvalue->value.str.val);
break;
+ case IS_UNICODE:
+dtor_unicode:
+ CHECK_ZVAL_UNICODE_REL(zvalue);
+ free(zvalue->value.ustr.val);
+ break;
case IS_ARRAY:
case IS_CONSTANT_ARRAY:
case IS_OBJECT:
@@ -114,11 +134,21 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC)
case IS_LONG:
case IS_NULL:
break;
- case IS_CONSTANT:
+ case IS_CONSTANT: {
+ TSRMLS_FETCH();
+
+ if (UG(unicode)) goto copy_unicode;
+ }
case IS_STRING:
+ case IS_BINARY:
CHECK_ZVAL_STRING_REL(zvalue);
zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len);
break;
+ case IS_UNICODE:
+copy_unicode:
+ CHECK_ZVAL_UNICODE_REL(zvalue);
+ zvalue->value.ustr.val = eustrndup_rel(zvalue->value.ustr.val, zvalue->value.ustr.len);
+ break;
case IS_ARRAY:
case IS_CONSTANT_ARRAY: {
zval *tmp;
@@ -130,7 +160,7 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC)
return; /* do nothing */
}
ALLOC_HASHTABLE_REL(tmp_ht);
- zend_hash_init(tmp_ht, 0, NULL, ZVAL_PTR_DTOR, 0);
+ zend_u_hash_init(tmp_ht, 0, NULL, ZVAL_PTR_DTOR, 0, original_ht->unicode);
zend_hash_copy(tmp_ht, original_ht, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
zvalue->value.ht = tmp_ht;
}
@@ -144,7 +174,6 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC)
}
}
-
ZEND_API int zend_print_variable(zval *var)
{
return zend_print_zval(var, 0);