]> granicus.if.org Git - php/commitdiff
Fixed bug #70689 (Exception handler does not work as expected)
authorXinchen Hui <laruence@gmail.com>
Tue, 13 Oct 2015 09:40:58 +0000 (17:40 +0800)
committerXinchen Hui <laruence@gmail.com>
Tue, 13 Oct 2015 09:40:58 +0000 (17:40 +0800)
NEWS
Zend/tests/bug70689.phpt [new file with mode: 0644]
Zend/zend_execute.c
Zend/zend_execute.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --git a/NEWS b/NEWS
index 480dcd28c75765848f327ded24794a5bcacec138..0615114ebfd45414cfe66b3dc894a3ab55d0a112 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,7 +2,8 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 29 Oct 2015, PHP 7.0.0 RC 6
 
-
+- Core:
+  . Fixed bug #70689 (Exception handler does not work as expected). (Laruence)
 
 15 Oct 2015, PHP 7.0.0 RC 5
 
diff --git a/Zend/tests/bug70689.phpt b/Zend/tests/bug70689.phpt
new file mode 100644 (file)
index 0000000..e3feeed
--- /dev/null
@@ -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
index 5b98fb47fb09e586748004a0dc47490609abae93..bbeab75175f61f79fc3955f1e1a1e07ecbf1c76f 100644 (file)
@@ -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);
 }
 
 /*
index 47b68b37d1e0af241f2c69fa7331ac0fccfaf2ed..50b2af173e447ac6a964249fab8e7068b6565718 100644 (file)
@@ -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)
 {
index 0c34f1717bc7bbe4ed1bcd64949110d96ac2df8e..f9739445f5aaa573457668ba4ba315e08a63272f 100644 (file)
@@ -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);
 
index 031e234281b46534a5f5da3ffc19cee1954db4d6..728fc49c8fbe6b27ca0ed366d278163da1afaa20 100644 (file)
@@ -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);