summaryrefslogtreecommitdiff
path: root/ext/spl/spl_array.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-07-16 10:41:43 +0000
committerMarcus Boerger <helly@php.net>2003-07-16 10:41:43 +0000
commitaa9bde9a34fd62a2a5a7d042979666149794f9f2 (patch)
treee2ff316d6457476044ba8faaa4e4bb0ec7a5e943 /ext/spl/spl_array.c
parent15097151f4a7545c1d359bf86f495eb18b9842db (diff)
downloadphp-git-aa9bde9a34fd62a2a5a7d042979666149794f9f2.tar.gz
Make array write stuff work again correct and fix tests
Diffstat (limited to 'ext/spl/spl_array.c')
-rwxr-xr-xext/spl/spl_array.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 87a081a9e6..c21ed61461 100755
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -218,9 +218,18 @@ ZEND_EXECUTE_HOOK_FUNCTION(ZEND_ASSIGN_DIM)
FREE_OP(Ts, op2, EG(free_op2));
if (&EX(opline)->result) {
- EX_T(EX(opline)->result.u.var).var.ptr = retval;
- EX_T(EX(opline)->result.u.var).var.ptr_ptr = NULL;/*&EX_T(EX(opline)->result.u.var).var.ptr;*/
- SELECTIVE_PZVAL_LOCK(retval, &EX(opline)->result);
+ if (retval->refcount < 2) {
+ zend_error(E_WARNING, "Method %s::set() did not return a value, using input value", obj_ce->name);
+ EX_T(EX(opline)->result.u.var).var.ptr = value;
+ SELECTIVE_PZVAL_LOCK(value, &EX(opline)->result);
+ DELETE_RET_ZVAL(retval);
+ } else {
+ EX_T(EX(opline)->result.u.var).var.ptr = retval;
+ retval->refcount--;
+ }
+ EX_T(EX(opline)->result.u.var).var.ptr_ptr = NULL;
+ } else {
+ DELETE_RET_ZVAL(retval);
}
EX(opline)++;