From: Bob Weinand Date: Mon, 27 Jul 2015 22:10:08 +0000 (+0200) Subject: Fix phpdbg stepping on CATCH with exception X-Git-Tag: php-7.0.0beta3~5^2~88^2~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c0e0f1414e68fd83f3254e59687da7dccbc5bf52;p=php Fix phpdbg stepping on CATCH with exception --- diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c index 9253576f01..89e8d027f6 100644 --- a/sapi/phpdbg/phpdbg_prompt.c +++ b/sapi/phpdbg/phpdbg_prompt.c @@ -1384,7 +1384,11 @@ void phpdbg_clean(zend_bool full) /* {{{ */ /* code may behave weirdly if EG(exception) is set */ #define DO_INTERACTIVE(allow_async_unsafe) do { \ + const zend_op *backup_opline; \ if (exception) { \ + if (EG(current_execute_data) && EG(current_execute_data)->func && ZEND_USER_CODE(EG(current_execute_data)->func->common.type)) { \ + backup_opline = EG(current_execute_data)->opline; \ + } \ ++GC_REFCOUNT(exception); \ zend_clear_exception(); \ } \ @@ -1402,8 +1406,14 @@ void phpdbg_clean(zend_bool full) /* {{{ */ case PHPDBG_UNTIL: \ case PHPDBG_NEXT: \ if (exception) { \ - Z_OBJ(zv) = exception; \ - zend_throw_exception_internal(&zv); \ + if (EG(current_execute_data) && EG(current_execute_data)->func && ZEND_USER_CODE(EG(current_execute_data)->func->common.type) \ + && (backup_opline->opcode == ZEND_HANDLE_EXCEPTION || backup_opline->opcode == ZEND_CATCH)) { \ + EG(current_execute_data)->opline = backup_opline; \ + EG(exception) = exception; \ + } else { \ + Z_OBJ(zv) = exception; \ + zend_throw_exception_internal(&zv); \ + } \ } \ /* fallthrough */ \ default: \ diff --git a/sapi/phpdbg/tests/stepping_001.phpt b/sapi/phpdbg/tests/stepping_001.phpt new file mode 100644 index 0000000000..bc91a67a93 --- /dev/null +++ b/sapi/phpdbg/tests/stepping_001.phpt @@ -0,0 +1,65 @@ +--TEST-- +Stepping with exceptions must not be stuck at CATCH +--PHPDBG-- +b ZEND_THROW +r +s + + + + + + +q +--EXPECTF-- +[Successful compilation of %s] +prompt> [Breakpoint #0 added at ZEND_THROW] +prompt> [Breakpoint #0 in ZEND_THROW at %s:4, hits: 1] +>00004: throw new Exception; + 00005: } + 00006: +prompt> [L0 %s HANDLE_EXCEPTION %s] +>00004: throw new Exception; + 00005: } + 00006: +prompt> [L0 %s HANDLE_EXCEPTION %s] +[L9 %s CATCH "Exception" $e 1 %s] +>00008: foo(); + 00009: } catch (Exception $e) { + 00010: echo "ok"; +prompt> [L10 %s ECHO "ok" %s] +>00010: echo "ok"; + 00011: } finally { + 00012: echo " ... ok"; +prompt> ok +[L10 %s FAST_CALL J8 ~1 %s] +[L12 %s ECHO " ... ok" %s] +>00012: echo " ... ok"; + 00013: } + 00014: +prompt> ... ok +[L12 %s FAST_RET ~1 %s] +[L10 %s JMP J10 %s] +>00010: echo "ok"; + 00011: } finally { + 00012: echo " ... ok"; +prompt> [L12 %s RETURN 1 %s] +>00012: echo " ... ok"; + 00013: } + 00014: +prompt> [Script ended normally] +prompt> +--FILE-- +