--- /dev/null
+--TEST--
+Bug #40509 key() function changed behaviour if global array is used within function
+--FILE--
+<?php
+function foo()
+{
+ global $arr;
+
+ $c = $arr["v"];
+ foreach ($c as $v) {}
+}
+
+$arr["v"] = array("a");
+
+var_dump(key($arr["v"]));
+foo();
+var_dump(key($arr["v"]));
+foreach ($arr["v"] as $k => $v) {
+ var_dump($k);
+}
+var_dump(key($arr["v"]));
+--EXPECT--
+int(0)
+int(0)
+int(0)
+NULL
--- /dev/null
+--TEST--
+Bug #40705 Iterating within function moves original array pointer
+--FILE--
+<?php
+function doForeach($array)
+{
+ foreach ($array as $k => $v) {
+ // do stuff
+ }
+}
+
+$foo = array('foo', 'bar', 'baz');
+var_dump(key($foo));
+doForeach($foo);
+var_dump(key($foo));
+foreach ($foo as $k => $v) {
+ var_dump($k);
+}
+var_dump(key($foo));
+--EXPECT--
+int(0)
+int(0)
+int(0)
+int(1)
+int(2)
+NULL
array_ptr->refcount++;
}
} else {
- if (OP1_TYPE == IS_VAR &&
- free_op1.var == NULL &&
+ if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) &&
!array_ptr->is_ref &&
array_ptr->refcount > 1) {
- /* non-separated return value from function */
zval *tmp;
ALLOC_ZVAL(tmp);
static int ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zend_free_op free_op1;
+
zval *array_ptr, **array_ptr_ptr;
HashTable *fe_ht;
zend_object_iterator *iter = NULL;
array_ptr->refcount++;
}
} else {
- if (IS_CONST == IS_VAR &&
- free_op1.var == NULL &&
+ if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
!array_ptr->is_ref &&
array_ptr->refcount > 1) {
- /* non-separated return value from function */
zval *tmp;
ALLOC_ZVAL(tmp);
array_ptr->refcount++;
}
} else {
- if (IS_TMP_VAR == IS_VAR &&
- free_op1.var == NULL &&
+ if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
!array_ptr->is_ref &&
array_ptr->refcount > 1) {
- /* non-separated return value from function */
zval *tmp;
ALLOC_ZVAL(tmp);
array_ptr->refcount++;
}
} else {
- if (IS_VAR == IS_VAR &&
- free_op1.var == NULL &&
+ if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
!array_ptr->is_ref &&
array_ptr->refcount > 1) {
- /* non-separated return value from function */
zval *tmp;
ALLOC_ZVAL(tmp);
static int ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zend_free_op free_op1;
+
zval *array_ptr, **array_ptr_ptr;
HashTable *fe_ht;
zend_object_iterator *iter = NULL;
array_ptr->refcount++;
}
} else {
- if (IS_CV == IS_VAR &&
- free_op1.var == NULL &&
+ if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
!array_ptr->is_ref &&
array_ptr->refcount > 1) {
- /* non-separated return value from function */
zval *tmp;
ALLOC_ZVAL(tmp);