Edit report at https://bugs.php.net/bug.php?id=65665&edit=1
ID: 65665 Updated by: larue...@php.net Reported by: ryan dot brothers at gmail dot com Summary: Exception not properly caught when opcache enabled -Status: Assigned +Status: Closed Type: Bug Package: opcache Operating System: Linux PHP Version: 5.5.3 Assigned To: dmitry Block user comment: N Private report: N New Comment: Automatic comment on behalf of laruence Revision: http://git.php.net/?p=php-src.git;a=commit;h=46f18ccf0d11b18c3eebdd19d4057966dfcca6fe Log: Fixed bug #65665 (Exception not properly caught when opcache enabled) Previous Comments: ------------------------------------------------------------------------ [2013-09-15 06:06:10] larue...@php.net Hey: I got a different fix: $ git diff diff --git a/Optimizer/block_pass.c b/Optimizer/block_pass.c index b8c3814..fd76322 100644 --- a/Optimizer/block_pass.c +++ b/Optimizer/block_pass.c @@ -1278,8 +1278,17 @@ static void assemble_code_blocks(zend_cfg *cfg, zend_op_array *op_array) 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; + if (cfg->try[i]->access) { + op_array->try_catch_array[i].try_op = cfg->try[i]- >start_opline - new_opcodes; + } else { + op_array->try_catch_array[i].try_op = 0; + } + + if (cfg->catch[i]->access) { + op_array->try_catch_array[i].catch_op = cfg- >catch[i]->start_opline - new_opcodes; + } else { + op_array->try_catch_array[i].catch_op = 0; + } } efree(cfg->try); efree(cfg->catch); dmitry, could you please verify this? thanks ------------------------------------------------------------------------ [2013-09-14 06:58:51] krak...@php.net Assuming we are just going to disable unsafe optimizations, PR #450 should do it ??? ------------------------------------------------------------------------ [2013-09-14 06:50:50] krak...@php.net Assuming ------------------------------------------------------------------------ [2013-09-13 17:16:34] Danack at basereality dot com Running with -d opcache.optimization_level=0xfffffffd shows the correct behaviour. That flag is the equivalent to turning on all optimizations except: 'ZEND_OPTIMIZER_PASS_2' /* Constant conversion and jumps */ ------------------------------------------------------------------------ [2013-09-13 15:31:05] jpa...@php.net This is an optimizer bug. If you run with opcache.optimization_level=0 , the bug disappears. I guess the bug is in the optimizer pass that handles ZEND_CATCH. PS : I reproduced with a 5.4 base. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=65665 -- Edit this bug report at https://bugs.php.net/bug.php?id=65665&edit=1