diff --git a/Zend/tests/array_unpack/string_keys.phpt b/Zend/tests/array_unpack/string_keys.phpt index d446e69cabc..e714673a992 100644 --- a/Zend/tests/array_unpack/string_keys.phpt +++ b/Zend/tests/array_unpack/string_keys.phpt @@ -22,6 +22,13 @@ function gen() { } var_dump([...gen()]); +// Same as previous, but with refcounted string. +function gen2() { + $foo = "2"; + yield "4" . $foo => 42; +} +var_dump([...gen2()]); + ?> --EXPECT-- array(4) { @@ -56,3 +63,7 @@ array(1) { [0]=> int(42) } +array(1) { + [0]=> + int(42) +} diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 38619d94d80..f5ac8f30249 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6060,6 +6060,7 @@ ZEND_VM_C_LABEL(add_unpack_again): zend_hash_update(result_ht, Z_STR(key), val); zval_ptr_dtor_str(&key); } else { + zval_ptr_dtor(&key); if (!zend_hash_next_index_insert(result_ht, val)) { zend_cannot_add_element(); zval_ptr_dtor_nogc(val); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 55e86737d5a..22be7ea1f83 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2609,6 +2609,7 @@ add_unpack_again: zend_hash_update(result_ht, Z_STR(key), val); zval_ptr_dtor_str(&key); } else { + zval_ptr_dtor(&key); if (!zend_hash_next_index_insert(result_ht, val)) { zend_cannot_add_element(); zval_ptr_dtor_nogc(val);