dmitry                                   Fri, 22 Oct 2010 13:59:23 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=304620

Log:
Simplified foreach() handling, we don't have to inctrement/decrement refcount 
twice

Changed paths:
    U   php/php-src/trunk/Zend/zend_execute.c
    U   php/php-src/trunk/Zend/zend_vm_def.h
    U   php/php-src/trunk/Zend/zend_vm_execute.h

Modified: php/php-src/trunk/Zend/zend_execute.c
===================================================================
--- php/php-src/trunk/Zend/zend_execute.c	2010-10-22 13:51:42 UTC (rev 304619)
+++ php/php-src/trunk/Zend/zend_execute.c	2010-10-22 13:59:23 UTC (rev 304620)
@@ -505,21 +505,6 @@
 	return get_zval_ptr(op_type, op, Ts, should_free, type);
 }

-static inline void zend_switch_free(temp_variable *T, int extended_value TSRMLS_DC)
-{
-	if (T->var.ptr) {
-		if (extended_value & ZEND_FE_RESET_VARIABLE) { /* foreach() free */
-			Z_DELREF_P(T->var.ptr);
-		}
-		zval_ptr_dtor(&T->var.ptr);
-	} else if (!T->var.ptr_ptr) {
-		/* perform the equivalent of equivalent of a
-		 * quick & silent get_zval_ptr, and FREE_OP
-		 */
-		PZVAL_UNLOCK_FREE(T->str_offset.str);
-	}
-}
-
 static void zend_assign_to_variable_reference(zval **variable_ptr_ptr, zval **value_ptr_ptr TSRMLS_DC)
 {
 	zval *variable_ptr = *variable_ptr_ptr;
@@ -1404,7 +1389,7 @@
 			switch (brk_opline->opcode) {
 				case ZEND_SWITCH_FREE:
 					if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
-						zend_switch_free(&T(brk_opline->op1.var), brk_opline->extended_value TSRMLS_CC);
+						zval_ptr_dtor(&T(brk_opline->op1.var).var.ptr);
 					}
 					break;
 				case ZEND_FREE:

Modified: php/php-src/trunk/Zend/zend_vm_def.h
===================================================================
--- php/php-src/trunk/Zend/zend_vm_def.h	2010-10-22 13:51:42 UTC (rev 304619)
+++ php/php-src/trunk/Zend/zend_vm_def.h	2010-10-22 13:59:23 UTC (rev 304620)
@@ -3212,7 +3212,7 @@
 	switch (brk_opline->opcode) {
 		case ZEND_SWITCH_FREE:
 			if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
-				zend_switch_free(&EX_T(brk_opline->op1.var), brk_opline->extended_value TSRMLS_CC);
+				zval_ptr_dtor(&EX_T(brk_opline->op1.var).var.ptr);
 			}
 			break;
 		case ZEND_FREE:
@@ -3247,7 +3247,7 @@
 	USE_OPLINE

 	SAVE_OPLINE();
-	zend_switch_free(&EX_T(opline->op1.var), opline->extended_value TSRMLS_CC);
+	zval_ptr_dtor(&EX_T(opline->op1.var).var.ptr);
 	CHECK_EXCEPTION();
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -4030,11 +4030,7 @@
 		if (iter && EXPECTED(EG(exception) == NULL)) {
 			array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
 		} else {
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-				FREE_OP1_VAR_PTR();
-			} else {
-				FREE_OP1_IF_VAR();
-			}
+			FREE_OP1_IF_VAR();
 			if (!EG(exception)) {
 				zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
 			}
@@ -4043,7 +4039,6 @@
 		}
 	}

-	PZVAL_LOCK(array_ptr);
 	AI_SET_PTR(&EX_T(opline->result.var), array_ptr);

 	if (iter) {
@@ -4051,25 +4046,15 @@
 		if (iter->funcs->rewind) {
 			iter->funcs->rewind(iter TSRMLS_CC);
 			if (UNEXPECTED(EG(exception) != NULL)) {
-				Z_DELREF_P(array_ptr);
 				zval_ptr_dtor(&array_ptr);
-				if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-					FREE_OP1_VAR_PTR();
-				} else {
-					FREE_OP1_IF_VAR();
-				}
+				FREE_OP1_IF_VAR();
 				HANDLE_EXCEPTION();
 			}
 		}
 		is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
 		if (UNEXPECTED(EG(exception) != NULL)) {
-			Z_DELREF_P(array_ptr);
 			zval_ptr_dtor(&array_ptr);
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-				FREE_OP1_VAR_PTR();
-			} else {
-				FREE_OP1_IF_VAR();
-			}
+			FREE_OP1_IF_VAR();
 			HANDLE_EXCEPTION();
 		}
 		iter->index = -1; /* will be set to 0 before using next handler */
@@ -4099,11 +4084,7 @@
 		is_empty = 1;
 	}

-	if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-		FREE_OP1_VAR_PTR();
-	} else {
-		FREE_OP1_IF_VAR();
-	}
+	FREE_OP1_IF_VAR();
 	if (is_empty) {
 		ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
 	} else {
@@ -4182,7 +4163,6 @@
 				 * In case that ever happens we need an additional flag. */
 				iter->funcs->move_forward(iter TSRMLS_CC);
 				if (UNEXPECTED(EG(exception) != NULL)) {
-					Z_DELREF_P(array);
 					zval_ptr_dtor(&array);
 					HANDLE_EXCEPTION();
 				}
@@ -4191,7 +4171,6 @@
 			if (!iter || (iter->index > 0 && iter->funcs->valid(iter TSRMLS_CC) == FAILURE)) {
 				/* reached end of iteration */
 				if (UNEXPECTED(EG(exception) != NULL)) {
-					Z_DELREF_P(array);
 					zval_ptr_dtor(&array);
 					HANDLE_EXCEPTION();
 				}
@@ -4199,7 +4178,6 @@
 			}
 			iter->funcs->get_current_data(iter, &value TSRMLS_CC);
 			if (UNEXPECTED(EG(exception) != NULL)) {
-				Z_DELREF_P(array);
 				zval_ptr_dtor(&array);
 				HANDLE_EXCEPTION();
 			}
@@ -4211,7 +4189,6 @@
 				if (iter->funcs->get_current_key) {
 					key_type = iter->funcs->get_current_key(iter, &str_key, &str_key_len, &int_key TSRMLS_CC);
 					if (UNEXPECTED(EG(exception) != NULL)) {
-						Z_DELREF_P(array);
 						zval_ptr_dtor(&array);
 						HANDLE_EXCEPTION();
 					}
@@ -4871,7 +4848,7 @@
 				switch (brk_opline->opcode) {
 					case ZEND_SWITCH_FREE:
 						if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
-							zend_switch_free(&EX_T(brk_opline->op1.var), brk_opline->extended_value TSRMLS_CC);
+							zval_ptr_dtor(&EX_T(brk_opline->op1.var).var.ptr);
 						}
 						break;
 					case ZEND_FREE:

Modified: php/php-src/trunk/Zend/zend_vm_execute.h
===================================================================
--- php/php-src/trunk/Zend/zend_vm_execute.h	2010-10-22 13:51:42 UTC (rev 304619)
+++ php/php-src/trunk/Zend/zend_vm_execute.h	2010-10-22 13:59:23 UTC (rev 304620)
@@ -1080,7 +1080,7 @@
 				switch (brk_opline->opcode) {
 					case ZEND_SWITCH_FREE:
 						if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
-							zend_switch_free(&EX_T(brk_opline->op1.var), brk_opline->extended_value TSRMLS_CC);
+							zval_ptr_dtor(&EX_T(brk_opline->op1.var).var.ptr);
 						}
 						break;
 					case ZEND_FREE:
@@ -1342,7 +1342,7 @@
 	switch (brk_opline->opcode) {
 		case ZEND_SWITCH_FREE:
 			if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
-				zend_switch_free(&EX_T(brk_opline->op1.var), brk_opline->extended_value TSRMLS_CC);
+				zval_ptr_dtor(&EX_T(brk_opline->op1.var).var.ptr);
 			}
 			break;
 		case ZEND_FREE:
@@ -2533,11 +2533,7 @@
 		if (iter && EXPECTED(EG(exception) == NULL)) {
 			array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
 		} else {
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-			} else {
-
-			}
 			if (!EG(exception)) {
 				zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
 			}
@@ -2546,7 +2542,6 @@
 		}
 	}

-	PZVAL_LOCK(array_ptr);
 	AI_SET_PTR(&EX_T(opline->result.var), array_ptr);

 	if (iter) {
@@ -2554,25 +2549,15 @@
 		if (iter->funcs->rewind) {
 			iter->funcs->rewind(iter TSRMLS_CC);
 			if (UNEXPECTED(EG(exception) != NULL)) {
-				Z_DELREF_P(array_ptr);
 				zval_ptr_dtor(&array_ptr);
-				if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-				} else {
-
-				}
 				HANDLE_EXCEPTION();
 			}
 		}
 		is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
 		if (UNEXPECTED(EG(exception) != NULL)) {
-			Z_DELREF_P(array_ptr);
 			zval_ptr_dtor(&array_ptr);
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-			} else {
-
-			}
 			HANDLE_EXCEPTION();
 		}
 		iter->index = -1; /* will be set to 0 before using next handler */
@@ -2602,11 +2587,6 @@
 		is_empty = 1;
 	}

-	if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-
-	} else {
-
-	}
 	if (is_empty) {
 		ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
 	} else {
@@ -6816,11 +6796,7 @@
 		if (iter && EXPECTED(EG(exception) == NULL)) {
 			array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
 		} else {
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-			} else {
-
-			}
 			if (!EG(exception)) {
 				zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
 			}
@@ -6829,7 +6805,6 @@
 		}
 	}

-	PZVAL_LOCK(array_ptr);
 	AI_SET_PTR(&EX_T(opline->result.var), array_ptr);

 	if (iter) {
@@ -6837,25 +6812,15 @@
 		if (iter->funcs->rewind) {
 			iter->funcs->rewind(iter TSRMLS_CC);
 			if (UNEXPECTED(EG(exception) != NULL)) {
-				Z_DELREF_P(array_ptr);
 				zval_ptr_dtor(&array_ptr);
-				if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-				} else {
-
-				}
 				HANDLE_EXCEPTION();
 			}
 		}
 		is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
 		if (UNEXPECTED(EG(exception) != NULL)) {
-			Z_DELREF_P(array_ptr);
 			zval_ptr_dtor(&array_ptr);
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-			} else {
-
-			}
 			HANDLE_EXCEPTION();
 		}
 		iter->index = -1; /* will be set to 0 before using next handler */
@@ -6885,11 +6850,6 @@
 		is_empty = 1;
 	}

-	if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-
-	} else {
-
-	}
 	if (is_empty) {
 		ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
 	} else {
@@ -10781,7 +10741,7 @@
 	USE_OPLINE

 	SAVE_OPLINE();
-	zend_switch_free(&EX_T(opline->op1.var), opline->extended_value TSRMLS_CC);
+	zval_ptr_dtor(&EX_T(opline->op1.var).var.ptr);
 	CHECK_EXCEPTION();
 	ZEND_VM_NEXT_OPCODE();
 }
@@ -11125,11 +11085,7 @@
 		if (iter && EXPECTED(EG(exception) == NULL)) {
 			array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
 		} else {
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-				if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-			} else {
-				if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-			}
+			if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 			if (!EG(exception)) {
 				zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
 			}
@@ -11138,7 +11094,6 @@
 		}
 	}

-	PZVAL_LOCK(array_ptr);
 	AI_SET_PTR(&EX_T(opline->result.var), array_ptr);

 	if (iter) {
@@ -11146,25 +11101,15 @@
 		if (iter->funcs->rewind) {
 			iter->funcs->rewind(iter TSRMLS_CC);
 			if (UNEXPECTED(EG(exception) != NULL)) {
-				Z_DELREF_P(array_ptr);
 				zval_ptr_dtor(&array_ptr);
-				if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-					if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-				} else {
-					if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-				}
+				if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 				HANDLE_EXCEPTION();
 			}
 		}
 		is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
 		if (UNEXPECTED(EG(exception) != NULL)) {
-			Z_DELREF_P(array_ptr);
 			zval_ptr_dtor(&array_ptr);
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-				if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-			} else {
-				if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-			}
+			if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 			HANDLE_EXCEPTION();
 		}
 		iter->index = -1; /* will be set to 0 before using next handler */
@@ -11194,11 +11139,7 @@
 		is_empty = 1;
 	}

-	if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-	} else {
-		if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-	}
+	if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
 	if (is_empty) {
 		ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
 	} else {
@@ -11277,7 +11218,6 @@
 				 * In case that ever happens we need an additional flag. */
 				iter->funcs->move_forward(iter TSRMLS_CC);
 				if (UNEXPECTED(EG(exception) != NULL)) {
-					Z_DELREF_P(array);
 					zval_ptr_dtor(&array);
 					HANDLE_EXCEPTION();
 				}
@@ -11286,7 +11226,6 @@
 			if (!iter || (iter->index > 0 && iter->funcs->valid(iter TSRMLS_CC) == FAILURE)) {
 				/* reached end of iteration */
 				if (UNEXPECTED(EG(exception) != NULL)) {
-					Z_DELREF_P(array);
 					zval_ptr_dtor(&array);
 					HANDLE_EXCEPTION();
 				}
@@ -11294,7 +11233,6 @@
 			}
 			iter->funcs->get_current_data(iter, &value TSRMLS_CC);
 			if (UNEXPECTED(EG(exception) != NULL)) {
-				Z_DELREF_P(array);
 				zval_ptr_dtor(&array);
 				HANDLE_EXCEPTION();
 			}
@@ -11306,7 +11244,6 @@
 				if (iter->funcs->get_current_key) {
 					key_type = iter->funcs->get_current_key(iter, &str_key, &str_key_len, &int_key TSRMLS_CC);
 					if (UNEXPECTED(EG(exception) != NULL)) {
-						Z_DELREF_P(array);
 						zval_ptr_dtor(&array);
 						HANDLE_EXCEPTION();
 					}
@@ -26819,11 +26756,7 @@
 		if (iter && EXPECTED(EG(exception) == NULL)) {
 			array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
 		} else {
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-			} else {
-
-			}
 			if (!EG(exception)) {
 				zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
 			}
@@ -26832,7 +26765,6 @@
 		}
 	}

-	PZVAL_LOCK(array_ptr);
 	AI_SET_PTR(&EX_T(opline->result.var), array_ptr);

 	if (iter) {
@@ -26840,25 +26772,15 @@
 		if (iter->funcs->rewind) {
 			iter->funcs->rewind(iter TSRMLS_CC);
 			if (UNEXPECTED(EG(exception) != NULL)) {
-				Z_DELREF_P(array_ptr);
 				zval_ptr_dtor(&array_ptr);
-				if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-				} else {
-
-				}
 				HANDLE_EXCEPTION();
 			}
 		}
 		is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
 		if (UNEXPECTED(EG(exception) != NULL)) {
-			Z_DELREF_P(array_ptr);
 			zval_ptr_dtor(&array_ptr);
-			if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {

-			} else {
-
-			}
 			HANDLE_EXCEPTION();
 		}
 		iter->index = -1; /* will be set to 0 before using next handler */
@@ -26888,11 +26810,6 @@
 		is_empty = 1;
 	}

-	if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
-
-	} else {
-
-	}
 	if (is_empty) {
 		ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
 	} else {
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to