com php-src: Fixed bug #70689 (Exception handler does not work as expected): Zend/tests/bug70689.phpt Zend/zend_execute.c Z end/zend_execute.h
Zend/zend_vm_def.h Zend/zend _vm_execute.h

From: Date: Sun, 18 Oct 2015 10:38:22 +0000
Subject: com php-src: Fixed bug #70689 (Exception handler does not work as expected): Zend/tests/bug70689.phpt Zend/zend_execute.c Z end/zend_execute.h
Zend/zend_vm_def.h Zend/zend _vm_execute.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-89524@lists.php.net to get a copy of this message
Commit: c5d5aacc79cef552d80b637c266d66692b8ac46d Author: Xinchen Hui <laruence@gmail.com> Tue, 13 Oct 2015 17:40:58 +0800 Committer: Anatol Belski <ab@php.net> Sun, 18 Oct 2015 12:38:22 +0200 Parents: f6e2a1f9b9caacbc58bdcc2c6f7ea93b3eeffd1c Branches: PHP-7.0.0 Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=c5d5aacc79cef552d80b637c266d66692b8ac46d Log: Fixed bug #70689 (Exception handler does not work as expected) Bugs: https://bugs.php.net/70689 Changed paths: A Zend/tests/bug70689.phpt M Zend/zend_execute.c M Zend/zend_execute.h M Zend/zend_vm_def.h M Zend/zend_vm_execute.h Diff: diff --git a/Zend/tests/bug70689.phpt b/Zend/tests/bug70689.phpt new file mode 100644 index 0000000..e3feeed --- /dev/null +++ b/Zend/tests/bug70689.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #70689 (Exception handler does not work as expected) +--FILE-- +<?php + +function foo($foo) { + echo "Executing foo\n"; +} + +set_error_handler(function($errno, $errstr) { + throw new Exception($errstr); +}); + +try { + foo(); +} catch (Exception $e) { + echo $e->getMessage(), "\n"; +} + +?> +--EXPECTF-- +Missing argument 1 for foo(), called in %sbug70689.php on line %d and defined diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 5b98fb4..bbeab75 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -893,7 +893,7 @@ static zend_always_inline int zend_verify_missing_arg_type(zend_function *zf, ui return 1; } -static ZEND_COLD int zend_verify_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot) +static ZEND_COLD void zend_verify_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot) { if (EXPECTED(!(EX(func)->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) || UNEXPECTED(zend_verify_missing_arg_type(EX(func), arg_num, cache_slot))) { @@ -907,9 +907,7 @@ static ZEND_COLD int zend_verify_missing_arg(zend_execute_data *execute_data, ui } else { zend_error(E_WARNING, "Missing argument %u for %s%s%s()", arg_num, class_name, space, func_name); } - return 1; } - return 0; } static ZEND_COLD void zend_verify_return_error(const zend_function *zf, const char *need_msg, const char *need_kind, const char *returned_msg, const char *returned_kind) @@ -2736,9 +2734,9 @@ ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_n return zend_verify_arg_type(zf, arg_num, arg, default_value, cache_slot); } -ZEND_API int ZEND_FASTCALL zend_check_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot) +ZEND_API void ZEND_FASTCALL zend_check_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot) { - return zend_verify_missing_arg(execute_data, arg_num, cache_slot); + zend_verify_missing_arg(execute_data, arg_num, cache_slot); } /* diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 47b68b3..50b2af1 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -52,7 +52,7 @@ ZEND_API int zend_eval_stringl_ex(char *str, size_t str_len, zval *retval_ptr, c ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg); ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); -ZEND_API int ZEND_FASTCALL zend_check_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot); +ZEND_API void ZEND_FASTCALL zend_check_missing_arg(zend_execute_data *execute_data, uint32_t arg_num, void **cache_slot); static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0c34f17..f973944 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -4714,9 +4714,8 @@ ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY) if (UNEXPECTED(arg_num > EX_NUM_ARGS())) { SAVE_OPLINE(); - if (UNEXPECTED(!zend_verify_missing_arg(execute_data, arg_num, CACHE_ADDR(opline->op2.num)))) { - HANDLE_EXCEPTION(); - } + zend_verify_missing_arg(execute_data, arg_num, CACHE_ADDR(opline->op2.num)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) { zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 031e234..728fc49 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1204,9 +1204,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_ if (UNEXPECTED(arg_num > EX_NUM_ARGS())) { SAVE_OPLINE(); - if (UNEXPECTED(!zend_verify_missing_arg(execute_data, arg_num, CACHE_ADDR(opline->op2.num)))) { - HANDLE_EXCEPTION(); - } + zend_verify_missing_arg(execute_data, arg_num, CACHE_ADDR(opline->op2.num)); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) { zval *param = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->result.var);

« previous php.cvs (#89524) next »