03 Sep 2015, PHP 7.0.0 RC 2
- Core:
+ . Fixed bug #70332 (Wrong behavior while returning reference on object).
+ (Laruence, Dmitry)
. Fixed bug #70300 (Syntactical inconsistency with new group use syntax).
(marcio dot web2 at gmail dot com)
. Fixed bug #70321 (Magic getter breaks reference to array property).
--- /dev/null
+--TEST--
+Bug #70332 (Wrong behavior while returning reference on object)
+--FILE--
+<?php
+function & test($arg) {
+ return $arg;
+}
+
+$arg = new Stdclass();
+$arg->name = array();
+
+test($arg)->name[1] = "xxxx";
+
+print_r($arg);
+?>
+--EXPECT--
+stdClass Object
+(
+ [name] => Array
+ (
+ [1] => xxxx
+ )
+
+)
zval *var_ptr;
var_ptr = EX_VAR(opline->op1.var);
- if (Z_TYPE_P(var_ptr) != IS_OBJECT &&
- !Z_ISREF_P(var_ptr) &&
- Z_REFCOUNTED_P(var_ptr) &&
- Z_REFCOUNT_P(var_ptr) > 1) {
-
+ if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ if (UNEXPECTED(Z_REFCOUNT_P(var_ptr) == 1)) {
+ ZVAL_UNREF(var_ptr);
+ }
+ } else if (Z_COPYABLE_P(var_ptr) && Z_REFCOUNT_P(var_ptr) > 1) {
Z_DELREF_P(var_ptr);
ZVAL_DUP(EX_VAR(opline->op1.var), var_ptr);
}
zval *var_ptr;
var_ptr = EX_VAR(opline->op1.var);
- if (Z_TYPE_P(var_ptr) != IS_OBJECT &&
- !Z_ISREF_P(var_ptr) &&
- Z_REFCOUNTED_P(var_ptr) &&
- Z_REFCOUNT_P(var_ptr) > 1) {
-
+ if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ if (UNEXPECTED(Z_REFCOUNT_P(var_ptr) == 1)) {
+ ZVAL_UNREF(var_ptr);
+ }
+ } else if (Z_COPYABLE_P(var_ptr) && Z_REFCOUNT_P(var_ptr) > 1) {
Z_DELREF_P(var_ptr);
ZVAL_DUP(EX_VAR(opline->op1.var), var_ptr);
}