cvs: ZendEngine2(PHP_5_3) / zend.c zend_execute_API.c zend_vm_def.h zend_vm_execute.h php-src NEWS

[email protected] ("Dmitry Stogov")
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1207907011@cvsserver>
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.
dmitry-20080411094331.txt (text/plain, 14.6 KB)
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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.