dmitry Thu May 5 13:36:54 2005 EDT Added files: (Branch: PHP_5_0) /ZendEngine2/tests bug31525.phpt
Modified files: /php-src NEWS /ZendEngine2 zend_compile.c zend_execute.c /php-src/tests/lang bug20175.phpt bug21600.phpt Log: Fixed bug #31525 (object reference being dropped. $this getting lost) http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1760.2.370&r2=1.1760.2.371&ty=u Index: php-src/NEWS diff -u php-src/NEWS:1.1760.2.370 php-src/NEWS:1.1760.2.371 --- php-src/NEWS:1.1760.2.370 Thu May 5 09:30:30 2005 +++ php-src/NEWS Thu May 5 13:36:51 2005 @@ -68,6 +68,8 @@ - Fixed bug #31636 (another crash when echoing a COM object). (Wez) - Fixed bug #31583 (php_std_date() uses short day names in non-y2k_compliance mode). (mike at php dot net) +- Fixed bug #31525 (object reference being dropped. $this getting lost). + (Stas, Dmitry) - Fixed bug #31502 (Wrong deserialization from session when using WDDX serializer). (Dmitry) - Fixed bug #31363 (broken non-blocking flock()). ian at snork dot net http://cvs.php.net/diff.php/ZendEngine2/zend_compile.c?r1=1.567.2.17&r2=1.567.2.18&ty=u Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.567.2.17 ZendEngine2/zend_compile.c:1.567.2.18 --- ZendEngine2/zend_compile.c:1.567.2.17 Wed Apr 27 10:30:32 2005 +++ ZendEngine2/zend_compile.c Thu May 5 13:36:52 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c,v 1.567.2.17 2005/04/27 14:30:32 dmitry Exp $ */ +/* $Id: zend_compile.c,v 1.567.2.18 2005/05/05 17:36:52 dmitry Exp $ */ #include <zend_language_parser.h> #include "zend.h" @@ -483,6 +483,12 @@ } } +static inline zend_bool zend_is_function_or_method_call(znode *variable) +{ + zend_uint type = variable->u.EA.type; + + return ((type & ZEND_PARSED_METHOD_CALL) || (type == ZEND_PARSED_FUNCTION_CALL)); +} void zend_do_assign_ref(znode *result, znode *lvar, znode *rvar TSRMLS_DC) { @@ -494,6 +500,11 @@ if (opline_is_fetch_this(last_op TSRMLS_CC)) { zend_error(E_COMPILE_ERROR, "Cannot re-assign $this"); } + if (zend_is_function_or_method_call(rvar)) { + opline->extended_value = ZEND_RETURNS_FUNCTION; + } else { + opline->extended_value = 0; + } if (result) { opline->result.op_type = IS_VAR; opline->result.u.EA.type = 0; @@ -717,13 +728,6 @@ } } -static inline zend_bool zend_is_function_or_method_call(znode *variable) -{ - zend_uint type = variable->u.EA.type; - - return ((type & ZEND_PARSED_METHOD_CALL) || (type == ZEND_PARSED_FUNCTION_CALL)); -} - void zend_do_begin_variable_parse(TSRMLS_D) { zend_llist fetch_list; http://cvs.php.net/diff.php/ZendEngine2/zend_execute.c?r1=1.652.2.30&r2=1.652.2.31&ty=u Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.652.2.30 ZendEngine2/zend_execute.c:1.652.2.31 --- ZendEngine2/zend_execute.c:1.652.2.30 Wed May 4 11:25:42 2005 +++ ZendEngine2/zend_execute.c Thu May 5 13:36:52 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute.c,v 1.652.2.30 2005/05/04 15:25:42 stas Exp $ */ +/* $Id: zend_execute.c,v 1.652.2.31 2005/05/05 17:36:52 dmitry Exp $ */ #define ZEND_INTENSIVE_DEBUGGING 0 @@ -2281,6 +2281,15 @@ { zval **value_ptr_ptr = get_zval_ptr_ptr(&opline->op2, EX(Ts), BP_VAR_W); + if (opline->op2.op_type == IS_VAR && + !(*value_ptr_ptr)->is_ref && + opline->extended_value == ZEND_RETURNS_FUNCTION && + !EX_T(opline->op2.u.var).var.fcall_returned_reference) { + zend_error(E_STRICT, "Only variables should be assigned by reference"); + PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */ + return zend_assign_handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + } + zend_assign_to_variable_reference(&opline->result, get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W), value_ptr_ptr, EX(Ts) TSRMLS_CC); NEXT_OPCODE(); http://cvs.php.net/diff.php/php-src/tests/lang/bug20175.phpt?r1=1.7&r2=1.7.2.1&ty=u Index: php-src/tests/lang/bug20175.phpt diff -u php-src/tests/lang/bug20175.phpt:1.7 php-src/tests/lang/bug20175.phpt:1.7.2.1 --- php-src/tests/lang/bug20175.phpt:1.7 Mon Feb 3 11:33:13 2003 +++ php-src/tests/lang/bug20175.phpt Thu May 5 13:36:53 2005 @@ -2,6 +2,8 @@ Bug #20175 (Static vars can't store ref to new instance) --SKIPIF-- <?php if (version_compare(zend_version(),'2.0.0-dev','<')) die('skip ZE1 does not have static class members'); ?> +--INI-- +error_reporting=4095 --FILE-- <?php print zend_version()."\n"; @@ -145,10 +147,11 @@ foo:1 bar_static() bar_global() + +Strict Standards: Only variables should be assigned by reference in %sbug20175.php on line 47 bar:1 bar_static() -bar_global() -bar:2 +bar:1 wow_static() wow_global() wow:1 http://cvs.php.net/diff.php/php-src/tests/lang/bug21600.phpt?r1=1.3&r2=1.3.2.1&ty=u Index: php-src/tests/lang/bug21600.phpt diff -u php-src/tests/lang/bug21600.phpt:1.3 php-src/tests/lang/bug21600.phpt:1.3.2.1 --- php-src/tests/lang/bug21600.phpt:1.3 Mon Feb 24 11:50:35 2003 +++ php-src/tests/lang/bug21600.phpt Thu May 5 13:36:53 2005 @@ -1,5 +1,7 @@ --TEST-- Bug #21600 (assign by reference function call changes variable contents) +--INI-- +error_reporting=4095 --FILE-- <?php $tmp = array(); @@ -23,11 +25,14 @@ return $text; } ?> ---EXPECT-- +--EXPECTF-- +Strict Standards: Only variables should be assigned by reference in %sbug21600.php on line 4 array(1) { ["foo"]=> - &string(4) "test" + string(4) "test" } + +Strict Standards: Only variables should be assigned by reference in %sbug21600.php on line 11 array(1) { ["foo"]=> string(4) "test" http://cvs.php.net/co.php/ZendEngine2/tests/bug31525.phpt?r=1.1&p=1 Index: ZendEngine2/tests/bug31525.phpt +++ ZendEngine2/tests/bug31525.phpt -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php