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: | Anatol Belski | 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);