Commit: 46f18ccf0d11b18c3eebdd19d4057966dfcca6fe Author: Xinchen Hui <larue...@php.net> Mon, 16 Sep 2013 14:43:01 +0800 Parents: 9eaffd34c123ae5782054cd32bf6caa50ff2b7d2 Branches: PHP-5.5 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=46f18ccf0d11b18c3eebdd19d4057966dfcca6fe Log: Fixed bug #65665 (Exception not properly caught when opcache enabled) Bugs: https://bugs.php.net/65665 Changed paths: M NEWS M ext/opcache/Optimizer/block_pass.c A ext/opcache/tests/bug65665.phpt Diff: diff --git a/NEWS b/NEWS index 5ec672e..37db7e6 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,8 @@ PHP NEWS scaling methods. (Pierre) - OPcache: + . Fixed bug #65665 (Exception not properly caught when opcache enabled). + (Laruence) . Fixed bug #65510 (5.5.2 crashes in _get_zval_ptr_ptr_var). (Dmitry) - SPL: diff --git a/ext/opcache/Optimizer/block_pass.c b/ext/opcache/Optimizer/block_pass.c index 43ae304..1c34cff 100644 --- a/ext/opcache/Optimizer/block_pass.c +++ b/ext/opcache/Optimizer/block_pass.c @@ -1283,11 +1283,15 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array) /* adjust exception jump targets */ if (op_array->last_try_catch) { - int i; - for (i = 0; i< op_array->last_try_catch; i++) { - op_array->try_catch_array[i].try_op = cfg->try[i]->start_opline - new_opcodes; - op_array->try_catch_array[i].catch_op = cfg->catch[i]->start_opline - new_opcodes; + int i, j; + for (i = 0, j = 0; i< op_array->last_try_catch; i++) { + if (cfg->try[i]->access) { + op_array->try_catch_array[j].try_op = cfg->try[i]->start_opline - new_opcodes; + op_array->try_catch_array[j].catch_op = cfg->catch[i]->start_opline - new_opcodes; + j++; + } } + op_array->last_try_catch = j; efree(cfg->try); efree(cfg->catch); } diff --git a/ext/opcache/tests/bug65665.phpt b/ext/opcache/tests/bug65665.phpt new file mode 100644 index 0000000..ac5c18d --- /dev/null +++ b/ext/opcache/tests/bug65665.phpt @@ -0,0 +1,118 @@ +--TEST-- +Bug #65665 (Exception not properly caught when opcache enabled) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +--SKIPIF-- +<?php require_once('skipif.inc'); ?> +--FILE-- +<?php +function foo() { + try + { + switch (1) + { + case 0: + try + { + + } + catch (Exception $e) + { + + } + + break; + + case 1: + try + { + throw new Exception('aaa'); + } + catch (Exception $e) + { + echo "correct\n"; + } + + break; + } + } + catch (Exception $e) + { + echo "wrong\n"; + } + return; +} + +function foo1() { + try + { + switch (1) + { + case 0: + try + { + + } + catch (Exception $e) + { +dummy: + echo "ect\n"; + } + + break; + + case 1: + try + { + throw new Exception('aaa'); + } + catch (Exception $e) + { + echo "corr"; + goto dummy; + } + break; + } + } + catch (Exception $e) + { + echo "wrong\n"; + } + return; +} + +function foo2() { + try + { + switch (1) + { + case 0: + try + { +dummy: + throw new Exception('aaa'); + } + catch (Exception $e) + { + echo "correct\n"; + } + + break; + + case 1: + goto dummy; + break; + } + } + catch (Exception $e) + { + echo "wrong\n"; + } + return; +} +foo();foo1();foo2(); +--EXPECT-- +correct +correct +correct -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php