cvs: ZendEngine2 / zend.c zend_execute_API.c zend_vm_def.h zend_vm_execute.h

[email protected] ("Dmitry Stogov")
Newsgroups php.zend-engine.cvs
Message-ID <cvsdmitry1207907030@cvsserver>
dmitry		Fri Apr 11 09:43:50 2008 UTC

  Modified files:              
    /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-20080411094350.txt (text/plain, 13.7 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend.c?r1=1.412&r2=1.413&diff_format=u
Index: ZendEngine2/zend.c
diff -u ZendEngine2/zend.c:1.412 ZendEngine2/zend.c:1.413
--- ZendEngine2/zend.c:1.412	Wed Mar 26 14:23:01 2008
+++ ZendEngine2/zend.c	Fri Apr 11 09:43:49 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend.c,v 1.412 2008/03/26 14:23:01 scottmac Exp $ */
+/* $Id: zend.c,v 1.413 2008/04/11 09:43:49 dmitry Exp $ */
 
 #include "zend.h"
 #include "zend_extensions.h"
@@ -1668,7 +1668,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++) {
@@ -1683,7 +1682,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)) {
 				EG(opline_ptr) = NULL;
@@ -1714,13 +1713,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.442&r2=1.443&diff_format=u
Index: ZendEngine2/zend_execute_API.c
diff -u ZendEngine2/zend_execute_API.c:1.442 ZendEngine2/zend_execute_API.c:1.443
--- ZendEngine2/zend_execute_API.c:1.442	Wed Mar 19 16:37:48 2008
+++ ZendEngine2/zend_execute_API.c	Fri Apr 11 09:43:49 2008
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute_API.c,v 1.442 2008/03/19 16:37:48 rasmus Exp $ */
+/* $Id: zend_execute_API.c,v 1.443 2008/04/11 09:43:49 dmitry Exp $ */
 
 #include <stdio.h>
 #include <signal.h>
@@ -1423,7 +1423,7 @@
 			u_strcat(Z_USTRVAL(pv), u_semicolon);
 		} else {
 			Z_USTRLEN(pv) = u_strlen(str);
-			Z_USTRVAL(pv) = eustrndup(str, Z_USTRLEN(pv));
+			Z_USTRVAL(pv) = str;
 		}
 	} else {
 		char *str = string.s;
@@ -1436,7 +1436,7 @@
 			strcat(Z_STRVAL(pv), " ;");
 		} else {
 			Z_STRLEN(pv) = strlen(str);
-			Z_STRVAL(pv) = estrndup(str, Z_STRLEN(pv));
+			Z_STRVAL(pv) = str;
 		}
 	}
 	Z_TYPE(pv) = type;
@@ -1481,7 +1481,9 @@
 	} else {
 		retval = FAILURE;
 	}
-	zval_dtor(&pv);
+	if (retval_ptr) {
+		zval_dtor(&pv);
+	}
 	return retval;
 }
 /* }}} */
@@ -1515,7 +1517,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
@@ -1569,12 +1570,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.222&r2=1.223&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.222 ZendEngine2/zend_vm_def.h:1.223
--- ZendEngine2/zend_vm_def.h:1.222	Wed Mar 26 14:23:02 2008
+++ ZendEngine2/zend_vm_def.h	Fri Apr 11 09:43:49 2008
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.222 2008/03/26 14:23:02 scottmac Exp $ */
+/* $Id: zend_vm_def.h,v 1.223 2008/04/11 09:43:49 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -2229,7 +2229,7 @@
 			zend_u_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0, UG(unicode));
 			/*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);
@@ -2239,8 +2239,6 @@
 			if (!EG(exception) && !EX_T(opline->result.u.var).var.ptr) {
 				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);
@@ -2377,16 +2375,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;
@@ -3214,7 +3218,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;
 
@@ -3229,11 +3233,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.226&r2=1.227&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.226 ZendEngine2/zend_vm_execute.h:1.227
--- ZendEngine2/zend_vm_execute.h:1.226	Wed Mar 26 14:23:02 2008
+++ ZendEngine2/zend_vm_execute.h	Fri Apr 11 09:43:49 2008
@@ -222,7 +222,7 @@
 			zend_u_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0, UG(unicode));
 			/*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);
@@ -232,8 +232,6 @@
 			if (!EG(exception) && !EX_T(opline->result.u.var).var.ptr) {
 				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);
@@ -1438,16 +1436,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;
@@ -1768,7 +1772,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;
 
@@ -1783,11 +1787,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);
@@ -4736,16 +4736,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;
@@ -5075,7 +5081,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;
 
@@ -5090,11 +5096,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);
@@ -7972,16 +7974,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;
@@ -8416,7 +8424,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;
 
@@ -8431,11 +8439,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);
@@ -22238,16 +22242,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;
@@ -22672,7 +22682,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;
 
@@ -22687,11 +22697,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.