cvs: ZendEngine2 / zend_vm_def.h zend_vm_execute.h /tests bug37707.phpt

From: Date: Thu, 08 Jun 2006 08:56:47 +0000
Subject: cvs: ZendEngine2 / zend_vm_def.h zend_vm_execute.h /tests bug37707.phpt
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-5002@lists.php.net to get a copy of this message
dmitry Thu Jun 8 08:56:47 2006 UTC Modified files: /ZendEngine2 zend_vm_def.h zend_vm_execute.h /ZendEngine2/tests bug37707.phpt Log: Proper fix for bug #37707 ("clone $x" must call __clone() enven if result value is not used) http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_vm_def.h?r1=1.118&r2=1.119&diff_format=u Index: ZendEngine2/zend_vm_def.h diff -u ZendEngine2/zend_vm_def.h:1.118 ZendEngine2/zend_vm_def.h:1.119 --- ZendEngine2/zend_vm_def.h:1.118 Thu Jun 8 08:38:11 2006 +++ ZendEngine2/zend_vm_def.h Thu Jun 8 08:56:47 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_vm_def.h,v 1.118 2006/06/08 08:38:11 dmitry Exp $ */ +/* $Id: zend_vm_def.h,v 1.119 2006/06/08 08:56:47 dmitry Exp $ */ /* If you change this file, please regenerate the zend_vm_execute.h and * zend_vm_opcodes.h files by running: @@ -2536,12 +2536,15 @@ } EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; - if (!EG(exception) && RETURN_VALUE_USED(opline)) { + if (!EG(exception)) { ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC); Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT; EX_T(opline->result.u.var).var.ptr->refcount=1; EX_T(opline->result.u.var).var.ptr->is_ref=1; + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + } } FREE_OP1_IF_VAR(); ZEND_VM_NEXT_OPCODE(); http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_vm_execute.h?r1=1.122&r2=1.123&diff_format=u Index: ZendEngine2/zend_vm_execute.h diff -u ZendEngine2/zend_vm_execute.h:1.122 ZendEngine2/zend_vm_execute.h:1.123 --- ZendEngine2/zend_vm_execute.h:1.122 Thu Jun 8 08:38:11 2006 +++ ZendEngine2/zend_vm_execute.h Thu Jun 8 08:56:47 2006 @@ -1781,12 +1781,15 @@ } EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; - if (!EG(exception) && RETURN_VALUE_USED(opline)) { + if (!EG(exception)) { ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC); Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT; EX_T(opline->result.u.var).var.ptr->refcount=1; EX_T(opline->result.u.var).var.ptr->is_ref=1; + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + } } ZEND_VM_NEXT_OPCODE(); @@ -4334,12 +4337,15 @@ } EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; - if (!EG(exception) && RETURN_VALUE_USED(opline)) { + if (!EG(exception)) { ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC); Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT; EX_T(opline->result.u.var).var.ptr->refcount=1; EX_T(opline->result.u.var).var.ptr->is_ref=1; + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + } } ZEND_VM_NEXT_OPCODE(); @@ -7484,12 +7490,15 @@ } EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; - if (!EG(exception) && RETURN_VALUE_USED(opline)) { + if (!EG(exception)) { ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC); Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT; EX_T(opline->result.u.var).var.ptr->refcount=1; EX_T(opline->result.u.var).var.ptr->is_ref=1; + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + } } if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; ZEND_VM_NEXT_OPCODE(); @@ -14659,12 +14668,15 @@ } EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; - if (!EG(exception) && RETURN_VALUE_USED(opline)) { + if (!EG(exception)) { ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC); Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT; EX_T(opline->result.u.var).var.ptr->refcount=1; EX_T(opline->result.u.var).var.ptr->is_ref=1; + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + } } ZEND_VM_NEXT_OPCODE(); @@ -20211,12 +20223,15 @@ } EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; - if (!EG(exception) && RETURN_VALUE_USED(opline)) { + if (!EG(exception)) { ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC); Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT; EX_T(opline->result.u.var).var.ptr->refcount=1; EX_T(opline->result.u.var).var.ptr->is_ref=1; + if (!RETURN_VALUE_USED(opline)) { + zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); + } } ZEND_VM_NEXT_OPCODE(); http://cvs.php.net/viewcvs.cgi/ZendEngine2/tests/bug37707.phpt?r1=1.2&r2=1.3&diff_format=u Index: ZendEngine2/tests/bug37707.phpt diff -u ZendEngine2/tests/bug37707.phpt:1.2 ZendEngine2/tests/bug37707.phpt:1.3 --- ZendEngine2/tests/bug37707.phpt:1.2 Wed Jun 7 13:43:13 2006 +++ ZendEngine2/tests/bug37707.phpt Thu Jun 8 08:56:47 2006 @@ -2,10 +2,15 @@ Bug #37707 (clone without assigning leaks memory) --FILE-- <?php -class testme {} +class testme { + function __clone() { + echo "clonned\n"; + } +} clone new testme(); echo "NO LEAK\n"; ?> --EXPECT-- +clonned NO LEAK

« previous php.zend-engine.cvs (#5002) next »