Commit: 2b28f29e53f3f4844c19f0113d19f092416396b1 Author: Dmitry Stogov <dmi...@zend.com> Tue, 9 Apr 2013 17:48:45 +0400 Parents: e13d2c7c7f7decdd55726dff9994dc62494e6150 Branches: PHP-5.5 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=2b28f29e53f3f4844c19f0113d19f092416396b1 Log: Fixed CFG construction bugs Changed paths: M ext/opcache/Optimizer/block_pass.c Diff: diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index b55f4ad..05cb15a 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -107,6 +107,16 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg) #if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO case ZEND_FAST_CALL: START_BLOCK_OP(ZEND_OP1(opline).opline_num); + if (opline->extended_value) { + START_BLOCK_OP(ZEND_OP2(opline).opline_num); + } + START_BLOCK_OP(opno + 1); + break; + case ZEND_FAST_RET: + if (opline->extended_value) { + START_BLOCK_OP(ZEND_OP2(opline).opline_num); + } + START_BLOCK_OP(opno + 1); break; #endif case ZEND_JMP: @@ -117,7 +127,7 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg) case ZEND_RETURN_BY_REF: #endif #if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO - case ZEND_FAST_RET: + case ZEND_GENERATOR_RETURN: #endif case ZEND_EXIT: case ZEND_THROW: @@ -136,7 +146,6 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg) case ZEND_JMPNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: - case ZEND_FE_FETCH: case ZEND_FE_RESET: case ZEND_NEW: #if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO @@ -148,7 +157,10 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg) START_BLOCK_OP(ZEND_OP2(opline).opline_num); START_BLOCK_OP(opno + 1); break; - + case ZEND_FE_FETCH: + START_BLOCK_OP(ZEND_OP2(opline).opline_num); + START_BLOCK_OP(opno + 2); + break; } opno++; opline++; @@ -230,19 +242,32 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg) cur_block->next = &blocks[opno]; /* what is the last OP of previous block? */ opline = blocks[opno].start_opline - 1; + if (opline->opcode == ZEND_OP_DATA) { + opline--; + } switch((unsigned)opline->opcode) { case ZEND_RETURN: #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO case ZEND_RETURN_BY_REF: #endif #if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO - case ZEND_FAST_RET: + case ZEND_GENERATOR_RETURN: #endif case ZEND_EXIT: case ZEND_THROW: break; #if ZEND_EXTENSION_API_NO > PHP_5_4_X_API_NO case ZEND_FAST_CALL: + if (opline->extended_value) { + cur_block->op2_to = &blocks[ZEND_OP2(opline).opline_num]; + } + cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num]; + break; + case ZEND_FAST_RET: + if (opline->extended_value) { + cur_block->op2_to = &blocks[ZEND_OP2(opline).opline_num]; + } + break; #endif case ZEND_JMP: cur_block->op1_to = &blocks[ZEND_OP1(opline).opline_num]; @@ -270,8 +295,8 @@ static int find_code_blocks(zend_op_array *op_array, zend_cfg *cfg) case ZEND_FE_FETCH: cur_block->op2_to = &blocks[ZEND_OP2(opline).opline_num]; /* break missing intentionally */ - default: - /* next block follows this */ + default: + /* next block follows this */ cur_block->follow_to = &blocks[opno]; break; } @@ -1235,14 +1260,18 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array) if (!cur_block->access) { continue; } + opline = cur_block->start_opline + cur_block->len - 1; + if (opline->opcode == ZEND_OP_DATA) { + opline--; + } if (cur_block->op1_to) { - ZEND_OP1(&cur_block->start_opline[cur_block->len - 1]).opline_num = cur_block->op1_to->start_opline - new_opcodes; + ZEND_OP1(opline).opline_num = cur_block->op1_to->start_opline - new_opcodes; } if (cur_block->op2_to) { - ZEND_OP2(&cur_block->start_opline[cur_block->len - 1]).opline_num = cur_block->op2_to->start_opline - new_opcodes; + ZEND_OP2(opline).opline_num = cur_block->op2_to->start_opline - new_opcodes; } if (cur_block->ext_to) { - cur_block->start_opline[cur_block->len - 1].extended_value = cur_block->ext_to->start_opline - new_opcodes; + opline->extended_value = cur_block->ext_to->start_opline - new_opcodes; } print_block(cur_block, new_opcodes, "Out "); } -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php