cvs: ZendEngine2(PHP_5_3) / zend.c zend_execute_API.c zend_vm_def.h zend_vm_execute.h php-src NEWS
| From: | Dmitry Stogov | Date: | Fri, 11 Apr 2008 09:43:31 +0000 |
| Subject: | cvs: ZendEngine2(PHP_5_3) / zend.c zend_execute_API.c zend_vm_def.h zend_vm_execute.h php-src NEWS | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-6613@lists.php.net to get a copy of this message | ||
dmitry Fri Apr 11 09:43:31 2008 UTC
Modified files: (Branch: PHP_5_3)
/php-src NEWS
/ZendEngine2 zend.c zend_execute_API.c zend_vm_def.h
zend_vm_execute.h
Log:
Optimized ZEND_RETURN opcode to not allocate and copy return value if it is not
used.
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.156&r2=1.2027.2.547.2.965.2.157&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.965.2.156 php-src/NEWS:1.2027.2.547.2.965.2.157 --- php-src/NEWS:1.2027.2.547.2.965.2.156 Fri Apr 11 08:35:54 2008 +++ php-src/NEWS Fri Apr 11 09:43:27 2008 @@ -91,6 +91,8 @@ - Added forward_static_call(_array) to complete LSB. (Mike Lively) - Improved PHP runtime speed and memory usage: + . Optimized ZEND_RETURN opcode to not allocate and copy return value if it is + not used. (Dmitry) . Replaced flex based scanner with re2c based scanner. (Marcus, Nuno, Scott) . Added garbage collector. (David Wang, Dmitry). . Improved PHP binary size and startup speed with GCC4 visibility control. http://cvs.php.net/viewvc.cgi/ZendEngine2/zend.c?r1=1.308.2.12.2.35.2.15&r2=1.308.2.12.2.35.2.16&diff_format=u Index: ZendEngine2/zend.c diff -u ZendEngine2/zend.c:1.308.2.12.2.35.2.15 ZendEngine2/zend.c:1.308.2.12.2.35.2.16 --- ZendEngine2/zend.c:1.308.2.12.2.35.2.15 Tue Mar 18 21:14:27 2008 +++ ZendEngine2/zend.c Fri Apr 11 09:43:27 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend.c,v 1.308.2.12.2.35.2.15 2008/03/18 21:14:27 rasmus Exp $ */ +/* $Id: zend.c,v 1.308.2.12.2.35.2.16 2008/04/11 09:43:27 dmitry Exp $ */ #include "zend.h" #include "zend_extensions.h" @@ -1150,7 +1150,6 @@ zend_file_handle *file_handle; zend_op_array *orig_op_array = EG(active_op_array); zval **orig_retval_ptr_ptr = EG(return_value_ptr_ptr); - zval *local_retval = NULL; va_start(files, file_count); for (i = 0; i < file_count; i++) { @@ -1165,7 +1164,7 @@ } zend_destroy_file_handle(file_handle TSRMLS_CC); if (EG(active_op_array)) { - EG(return_value_ptr_ptr) = retval ? retval : &local_retval; + EG(return_value_ptr_ptr) = retval ? retval : NULL; zend_execute(EG(active_op_array) TSRMLS_CC); if (EG(exception)) { if (EG(user_exception_handler)) { @@ -1195,13 +1194,6 @@ } else { zend_exception_error(EG(exception) TSRMLS_CC); } - if (retval == NULL && *EG(return_value_ptr_ptr) != NULL) { - zval_ptr_dtor(EG(return_value_ptr_ptr)); - local_retval = NULL; - } - } else if (!retval && *EG(return_value_ptr_ptr)) { - zval_ptr_dtor(EG(return_value_ptr_ptr)); - local_retval = NULL; } destroy_op_array(EG(active_op_array) TSRMLS_CC); efree(EG(active_op_array)); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute_API.c?r1=1.331.2.20.2.24.2.34&r2=1.331.2.20.2.24.2.35&diff_format=u Index: ZendEngine2/zend_execute_API.c diff -u ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.34 ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.35 --- ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.34 Fri Mar 28 14:34:59 2008 +++ ZendEngine2/zend_execute_API.c Fri Apr 11 09:43:27 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.34 2008/03/28 14:34:59 felipe Exp $ */ +/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.35 2008/04/11 09:43:27 dmitry Exp $ */ #include <stdio.h> #include <signal.h> @@ -1273,7 +1273,7 @@ Z_STRVAL(pv)[Z_STRLEN(pv)] = '\0'; } else { Z_STRLEN(pv) = strlen(str); - Z_STRVAL(pv) = estrndup(str, Z_STRLEN(pv)); + Z_STRVAL(pv) = str; } Z_TYPE(pv) = IS_STRING; @@ -1317,7 +1317,9 @@ } else { retval = FAILURE; } - zval_dtor(&pv); + if (retval_ptr) { + zval_dtor(&pv); + } return retval; } /* }}} */ @@ -1339,7 +1341,6 @@ { zend_op *opline, *end; zend_op *ret_opline; - zval *local_retval=NULL; if (!(CG(active_op_array)->fn_flags & ZEND_ACC_INTERACTIVE) || CG(active_op_array)->backpatch_count>0 @@ -1393,12 +1394,9 @@ zend_release_labels(TSRMLS_C); - EG(return_value_ptr_ptr) = &local_retval; + EG(return_value_ptr_ptr) = NULL; EG(active_op_array) = CG(active_op_array); zend_execute(CG(active_op_array) TSRMLS_CC); - if (local_retval) { - zval_ptr_dtor(&local_retval); - } if (EG(exception)) { zend_exception_error(EG(exception) TSRMLS_CC); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.48.2.46&r2=1.59.2.29.2.48.2.47&diff_format=u Index: ZendEngine2/zend_vm_def.h diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.46 ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.47 --- ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.46 Fri Mar 28 14:34:59 2008 +++ ZendEngine2/zend_vm_def.h Fri Apr 11 09:43:27 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.46 2008/03/28 14:34:59 felipe Exp $ */ +/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.47 2008/04/11 09:43:27 dmitry Exp $ */ /* If you change this file, please regenerate the zend_vm_execute.h and * zend_vm_opcodes.h files by running: @@ -2167,7 +2167,7 @@ zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0); /*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/ } - EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr; + EG(return_value_ptr_ptr) = RETURN_VALUE_USED(opline) ? &EX_T(opline->result.u.var).var.ptr : NULL; EG(active_op_array) = (zend_op_array *) EX(function_state).function; zend_execute(EG(active_op_array) TSRMLS_CC); @@ -2177,8 +2177,6 @@ if (!EX_T(opline->result.u.var).var.ptr && !EG(exception)) { ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr); } - } else if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); } EG(opline_ptr) = &EX(opline); @@ -2313,16 +2311,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { ZEND_VM_C_LABEL(return_by_value): retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R); - if (!IS_OP1_TMP_FREE()) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (OP1_TYPE == IS_TMP_VAR) { + FREE_OP1(); + } + } else if (!IS_OP1_TMP_FREE()) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -3115,7 +3119,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -3130,11 +3134,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.49.2.45&r2=1.62.2.30.2.49.2.46&diff_format=u Index: ZendEngine2/zend_vm_execute.h diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.45 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.46 --- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.45 Fri Mar 28 14:34:59 2008 +++ ZendEngine2/zend_vm_execute.h Fri Apr 11 09:43:28 2008 @@ -214,7 +214,7 @@ zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0); /*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/ } - EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr; + EG(return_value_ptr_ptr) = RETURN_VALUE_USED(opline) ? &EX_T(opline->result.u.var).var.ptr : NULL; EG(active_op_array) = (zend_op_array *) EX(function_state).function; zend_execute(EG(active_op_array) TSRMLS_CC); @@ -224,8 +224,6 @@ if (!EX_T(opline->result.u.var).var.ptr && !EG(exception)) { ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr); } - } else if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); } EG(opline_ptr) = &EX(opline); @@ -1445,16 +1443,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { return_by_value: retval_ptr = &opline->op1.u.constant; - if (!0) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (IS_CONST == IS_TMP_VAR) { + + } + } else if (!0) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -1737,7 +1741,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -1752,11 +1756,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); @@ -4603,16 +4603,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { return_by_value: retval_ptr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC); - if (!1) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (IS_TMP_VAR == IS_TMP_VAR) { + zval_dtor(free_op1.var); + } + } else if (!1) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -4904,7 +4910,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -4919,11 +4925,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); @@ -7696,16 +7698,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { return_by_value: retval_ptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC); - if (!0) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (IS_VAR == IS_TMP_VAR) { + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + } + } else if (!0) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -8102,7 +8110,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -8117,11 +8125,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); @@ -21368,16 +21372,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { return_by_value: retval_ptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC); - if (!0) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (IS_CV == IS_TMP_VAR) { + + } + } else if (!0) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -21764,7 +21774,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -21779,11 +21789,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.156&r2=1.2027.2.547.2.965.2.157&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.965.2.156 php-src/NEWS:1.2027.2.547.2.965.2.157 --- php-src/NEWS:1.2027.2.547.2.965.2.156 Fri Apr 11 08:35:54 2008 +++ php-src/NEWS Fri Apr 11 09:43:27 2008 @@ -91,6 +91,8 @@ - Added forward_static_call(_array) to complete LSB. (Mike Lively) - Improved PHP runtime speed and memory usage: + . Optimized ZEND_RETURN opcode to not allocate and copy return value if it is + not used. (Dmitry) . Replaced flex based scanner with re2c based scanner. (Marcus, Nuno, Scott) . Added garbage collector. (David Wang, Dmitry). . Improved PHP binary size and startup speed with GCC4 visibility control. http://cvs.php.net/viewvc.cgi/ZendEngine2/zend.c?r1=1.308.2.12.2.35.2.15&r2=1.308.2.12.2.35.2.16&diff_format=u Index: ZendEngine2/zend.c diff -u ZendEngine2/zend.c:1.308.2.12.2.35.2.15 ZendEngine2/zend.c:1.308.2.12.2.35.2.16 --- ZendEngine2/zend.c:1.308.2.12.2.35.2.15 Tue Mar 18 21:14:27 2008 +++ ZendEngine2/zend.c Fri Apr 11 09:43:27 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend.c,v 1.308.2.12.2.35.2.15 2008/03/18 21:14:27 rasmus Exp $ */ +/* $Id: zend.c,v 1.308.2.12.2.35.2.16 2008/04/11 09:43:27 dmitry Exp $ */ #include "zend.h" #include "zend_extensions.h" @@ -1150,7 +1150,6 @@ zend_file_handle *file_handle; zend_op_array *orig_op_array = EG(active_op_array); zval **orig_retval_ptr_ptr = EG(return_value_ptr_ptr); - zval *local_retval = NULL; va_start(files, file_count); for (i = 0; i < file_count; i++) { @@ -1165,7 +1164,7 @@ } zend_destroy_file_handle(file_handle TSRMLS_CC); if (EG(active_op_array)) { - EG(return_value_ptr_ptr) = retval ? retval : &local_retval; + EG(return_value_ptr_ptr) = retval ? retval : NULL; zend_execute(EG(active_op_array) TSRMLS_CC); if (EG(exception)) { if (EG(user_exception_handler)) { @@ -1195,13 +1194,6 @@ } else { zend_exception_error(EG(exception) TSRMLS_CC); } - if (retval == NULL && *EG(return_value_ptr_ptr) != NULL) { - zval_ptr_dtor(EG(return_value_ptr_ptr)); - local_retval = NULL; - } - } else if (!retval && *EG(return_value_ptr_ptr)) { - zval_ptr_dtor(EG(return_value_ptr_ptr)); - local_retval = NULL; } destroy_op_array(EG(active_op_array) TSRMLS_CC); efree(EG(active_op_array)); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute_API.c?r1=1.331.2.20.2.24.2.34&r2=1.331.2.20.2.24.2.35&diff_format=u Index: ZendEngine2/zend_execute_API.c diff -u ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.34 ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.35 --- ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.34 Fri Mar 28 14:34:59 2008 +++ ZendEngine2/zend_execute_API.c Fri Apr 11 09:43:27 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.34 2008/03/28 14:34:59 felipe Exp $ */ +/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.35 2008/04/11 09:43:27 dmitry Exp $ */ #include <stdio.h> #include <signal.h> @@ -1273,7 +1273,7 @@ Z_STRVAL(pv)[Z_STRLEN(pv)] = '\0'; } else { Z_STRLEN(pv) = strlen(str); - Z_STRVAL(pv) = estrndup(str, Z_STRLEN(pv)); + Z_STRVAL(pv) = str; } Z_TYPE(pv) = IS_STRING; @@ -1317,7 +1317,9 @@ } else { retval = FAILURE; } - zval_dtor(&pv); + if (retval_ptr) { + zval_dtor(&pv); + } return retval; } /* }}} */ @@ -1339,7 +1341,6 @@ { zend_op *opline, *end; zend_op *ret_opline; - zval *local_retval=NULL; if (!(CG(active_op_array)->fn_flags & ZEND_ACC_INTERACTIVE) || CG(active_op_array)->backpatch_count>0 @@ -1393,12 +1394,9 @@ zend_release_labels(TSRMLS_C); - EG(return_value_ptr_ptr) = &local_retval; + EG(return_value_ptr_ptr) = NULL; EG(active_op_array) = CG(active_op_array); zend_execute(CG(active_op_array) TSRMLS_CC); - if (local_retval) { - zval_ptr_dtor(&local_retval); - } if (EG(exception)) { zend_exception_error(EG(exception) TSRMLS_CC); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.48.2.46&r2=1.59.2.29.2.48.2.47&diff_format=u Index: ZendEngine2/zend_vm_def.h diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.46 ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.47 --- ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.46 Fri Mar 28 14:34:59 2008 +++ ZendEngine2/zend_vm_def.h Fri Apr 11 09:43:27 2008 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.46 2008/03/28 14:34:59 felipe Exp $ */ +/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.47 2008/04/11 09:43:27 dmitry Exp $ */ /* If you change this file, please regenerate the zend_vm_execute.h and * zend_vm_opcodes.h files by running: @@ -2167,7 +2167,7 @@ zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0); /*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/ } - EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr; + EG(return_value_ptr_ptr) = RETURN_VALUE_USED(opline) ? &EX_T(opline->result.u.var).var.ptr : NULL; EG(active_op_array) = (zend_op_array *) EX(function_state).function; zend_execute(EG(active_op_array) TSRMLS_CC); @@ -2177,8 +2177,6 @@ if (!EX_T(opline->result.u.var).var.ptr && !EG(exception)) { ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr); } - } else if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); } EG(opline_ptr) = &EX(opline); @@ -2313,16 +2311,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { ZEND_VM_C_LABEL(return_by_value): retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R); - if (!IS_OP1_TMP_FREE()) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (OP1_TYPE == IS_TMP_VAR) { + FREE_OP1(); + } + } else if (!IS_OP1_TMP_FREE()) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -3115,7 +3119,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -3130,11 +3134,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.49.2.45&r2=1.62.2.30.2.49.2.46&diff_format=u Index: ZendEngine2/zend_vm_execute.h diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.45 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.46 --- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.45 Fri Mar 28 14:34:59 2008 +++ ZendEngine2/zend_vm_execute.h Fri Apr 11 09:43:28 2008 @@ -214,7 +214,7 @@ zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0); /*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/ } - EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr; + EG(return_value_ptr_ptr) = RETURN_VALUE_USED(opline) ? &EX_T(opline->result.u.var).var.ptr : NULL; EG(active_op_array) = (zend_op_array *) EX(function_state).function; zend_execute(EG(active_op_array) TSRMLS_CC); @@ -224,8 +224,6 @@ if (!EX_T(opline->result.u.var).var.ptr && !EG(exception)) { ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr); } - } else if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); } EG(opline_ptr) = &EX(opline); @@ -1445,16 +1443,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { return_by_value: retval_ptr = &opline->op1.u.constant; - if (!0) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (IS_CONST == IS_TMP_VAR) { + + } + } else if (!0) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -1737,7 +1741,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -1752,11 +1756,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); @@ -4603,16 +4603,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { return_by_value: retval_ptr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC); - if (!1) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (IS_TMP_VAR == IS_TMP_VAR) { + zval_dtor(free_op1.var); + } + } else if (!1) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -4904,7 +4910,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -4919,11 +4925,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); @@ -7696,16 +7698,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { return_by_value: retval_ptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC); - if (!0) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (IS_VAR == IS_TMP_VAR) { + if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; + } + } else if (!0) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -8102,7 +8110,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -8117,11 +8125,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); @@ -21368,16 +21372,22 @@ } } - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); - Z_ADDREF_PP(retval_ptr_ptr); + if (EG(return_value_ptr_ptr)) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr); + Z_ADDREF_PP(retval_ptr_ptr); - (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr); + } } else { return_by_value: retval_ptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC); - if (!0) { /* Not a temp var */ + if (!EG(return_value_ptr_ptr)) { + if (IS_CV == IS_TMP_VAR) { + + } + } else if (!0) { /* Not a temp var */ if (EG(active_op_array)->return_reference == ZEND_RETURN_REF || (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) { zval *ret; @@ -21764,7 +21774,7 @@ zval *saved_object; zend_function *saved_function; - EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr; + EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL; EG(active_op_array) = new_op_array; EX_T(opline->result.u.var).var.ptr = NULL; @@ -21779,11 +21789,7 @@ EX(function_state).function = saved_function; EX(object) = saved_object; - if (!return_value_used) { - if (EX_T(opline->result.u.var).var.ptr) { - zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr); - } - } else { /* return value is used */ + if (return_value_used) { if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);