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