]> granicus.if.org Git - php/commitdiff
Check EG(exception) only if it's really necessary
authorDmitry Stogov <dmitry@zend.com>
Tue, 8 Sep 2015 14:20:52 +0000 (17:20 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 8 Sep 2015 14:20:52 +0000 (17:20 +0300)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 67eabde9cb219e0a1560faac29b1a11ab217c1be..8e20a12e091a76e6390614dd71b7392c12220fc1 100644 (file)
@@ -692,7 +692,7 @@ static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, z
        return zend_verify_weak_scalar_type_hint(type_hint, arg);
 }
 
-static void zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg)
+static int zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, zval *arg)
 {
        zend_internal_arg_info *cur_arg_info;
        char *need_msg, *class_name;
@@ -703,7 +703,7 @@ static void zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, z
        } else if (zf->internal_function.fn_flags & ZEND_ACC_VARIADIC) {
                cur_arg_info = &zf->internal_function.arg_info[zf->internal_function.num_args];
        } else {
-               return;
+               return 1;
        }
 
        if (cur_arg_info->type_hint) {
@@ -713,24 +713,29 @@ static void zend_verify_internal_arg_type(zend_function *zf, uint32_t arg_num, z
                                need_msg = zend_verify_internal_arg_class_kind((zend_internal_arg_info*)cur_arg_info, &class_name, &ce);
                                if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce)) {
                                        zend_verify_arg_error(zf, arg_num, need_msg, class_name, "instance of ", ZSTR_VAL(Z_OBJCE_P(arg)->name), arg);
+                                       return 0;
                                }
                        }
                } else if (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null) {
                        if (cur_arg_info->class_name) {
                                need_msg = zend_verify_internal_arg_class_kind((zend_internal_arg_info*)cur_arg_info, &class_name, &ce);
                                zend_verify_arg_error(zf, arg_num, need_msg, class_name, zend_zval_type_name(arg), "", arg);
+                               return 0;
                        } else if (cur_arg_info->type_hint == IS_CALLABLE) {
                                if (!zend_is_callable(arg, IS_CALLABLE_CHECK_SILENT, NULL)) {
                                        zend_verify_arg_error(zf, arg_num, "be callable", "", zend_zval_type_name(arg), "", arg);
+                                       return 0;
                                }
                        } else if (cur_arg_info->type_hint == _IS_BOOL &&
                                   EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) {
                                /* pass */
                        } else if (UNEXPECTED(!zend_verify_scalar_type_hint(cur_arg_info->type_hint, arg, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) {
                                zend_verify_arg_error(zf, arg_num, "be of the type ", zend_get_type_by_const(cur_arg_info->type_hint), zend_zval_type_name(arg), "", arg);
+                               return 0;
                        }
                }
        }
+       return 1;
 }
 
 static zend_always_inline int zend_verify_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot)
index 3f693b61c99208ef5681ccf609b8ebf4b2499c8e..581f9c74cfb87d15f853cd8b295a7235ec610387 100644 (file)
@@ -2843,9 +2843,9 @@ ZEND_VM_C_LABEL(try_class_name):
                } else {
                        if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Class name must be a valid object or a string");
                }
@@ -2879,12 +2879,11 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
                        FREE_OP2();
@@ -2912,9 +2911,10 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR
                                }
                                if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               FREE_OP2();
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
                                FREE_OP2();
@@ -2992,10 +2992,10 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -3021,9 +3021,9 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMPVAR|UNUSE
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
                                FREE_OP2();
@@ -3334,9 +3334,9 @@ ZEND_VM_C_LABEL(try_function_name):
        } else {
                if (OP2_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-               }
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       HANDLE_EXCEPTION();
+                       if (UNEXPECTED(EG(exception) != NULL)) {
+                               HANDLE_EXCEPTION();
+                       }
                }
                zend_throw_error(NULL, "Function name must be a string");
                FREE_OP2();
@@ -3602,16 +3602,15 @@ ZEND_VM_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY)
                        zval *p = ZEND_CALL_ARG(call, 1);
 
                        for (i = 0; i < num_args; ++i) {
-                               zend_verify_internal_arg_type(fbc, i + 1, p);
+                               if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
+                                       EG(current_execute_data) = call->prev_execute_data;
+                                       zend_vm_stack_free_args(call);
+                                       zend_vm_stack_free_call_frame(call);
+                                       zend_throw_exception_internal(NULL);
+                                       HANDLE_EXCEPTION();
+                               }
                                p++;
                        }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               EG(current_execute_data) = call->prev_execute_data;
-                               zend_vm_stack_free_args(call);
-                               zend_vm_stack_free_call_frame(call);
-                               zend_throw_exception_internal(NULL);
-                               HANDLE_EXCEPTION();
-                       }
                }
 
                ret = EX_VAR(opline->result.var);
@@ -3724,8 +3723,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY)
                        zval *p = ZEND_CALL_ARG(call, 1);
 
                        for (i = 0; i < num_args; ++i) {
-                               zend_verify_internal_arg_type(fbc, i + 1, p);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
                                        EG(current_execute_data) = call->prev_execute_data;
                                        zend_vm_stack_free_args(call);
                                        if (RETURN_VALUE_USED(opline)) {
@@ -4076,9 +4074,9 @@ ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
                        }
                        if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(value, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Can only throw objects");
                        FREE_OP1();
@@ -4942,9 +4940,9 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|CV, ANY)
                        }
                        if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "__clone method called on non-object");
                        FREE_OP1();
@@ -5053,11 +5051,10 @@ ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
                                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                                } else {
                                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                                       if (UNEXPECTED(EG(exception) != NULL)) {
-                                               HANDLE_EXCEPTION();
-                                       }
                                        if (UNEXPECTED(ce == NULL)) {
-                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+                                               if (EXPECTED(!EG(exception))) {
+                                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+                                               }
                                                HANDLE_EXCEPTION();
                                        }
                                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -5511,20 +5508,16 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR)
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
                                        FREE_OP1();
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if (OP1_TYPE != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -7873,8 +7866,7 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
                        EG(current_execute_data) = call;
 
                        for (i = 0; i < num_args; ++i) {
-                               zend_verify_internal_arg_type(fbc, i + 1, p);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
                                        EG(current_execute_data) = call->prev_execute_data;
                                        zend_vm_stack_free_args(call);
                                        zend_vm_stack_free_call_frame(call);
index 94cc16fee825a5f06a0514a8caf57a412f61aa9d..21e726ae5df881bad09baca3d9f2cd58b76458d2 100644 (file)
@@ -687,16 +687,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER(
                        zval *p = ZEND_CALL_ARG(call, 1);
 
                        for (i = 0; i < num_args; ++i) {
-                               zend_verify_internal_arg_type(fbc, i + 1, p);
+                               if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
+                                       EG(current_execute_data) = call->prev_execute_data;
+                                       zend_vm_stack_free_args(call);
+                                       zend_vm_stack_free_call_frame(call);
+                                       zend_throw_exception_internal(NULL);
+                                       HANDLE_EXCEPTION();
+                               }
                                p++;
                        }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               EG(current_execute_data) = call->prev_execute_data;
-                               zend_vm_stack_free_args(call);
-                               zend_vm_stack_free_call_frame(call);
-                               zend_throw_exception_internal(NULL);
-                               HANDLE_EXCEPTION();
-                       }
                }
 
                ret = EX_VAR(opline->result.var);
@@ -809,8 +808,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_HANDLER(ZEND_OPC
                        zval *p = ZEND_CALL_ARG(call, 1);
 
                        for (i = 0; i < num_args; ++i) {
-                               zend_verify_internal_arg_type(fbc, i + 1, p);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
                                        EG(current_execute_data) = call->prev_execute_data;
                                        zend_vm_stack_free_args(call);
                                        if (RETURN_VALUE_USED(opline)) {
@@ -1776,8 +1774,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
                        EG(current_execute_data) = call;
 
                        for (i = 0; i < num_args; ++i) {
-                               zend_verify_internal_arg_type(fbc, i + 1, p);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(!zend_verify_internal_arg_type(fbc, i + 1, p))) {
                                        EG(current_execute_data) = call->prev_execute_data;
                                        zend_vm_stack_free_args(call);
                                        zend_vm_stack_free_call_frame(call);
@@ -1878,9 +1875,9 @@ try_class_name:
                } else {
                        if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Class name must be a valid object or a string");
                }
@@ -2113,9 +2110,9 @@ try_function_name:
        } else {
                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-               }
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       HANDLE_EXCEPTION();
+                       if (UNEXPECTED(EG(exception) != NULL)) {
+                               HANDLE_EXCEPTION();
+                       }
                }
                zend_throw_error(NULL, "Function name must be a string");
 
@@ -2286,9 +2283,9 @@ try_class_name:
                } else {
                        if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Class name must be a valid object or a string");
                }
@@ -2328,9 +2325,9 @@ try_class_name:
                } else {
                        if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Class name must be a valid object or a string");
                }
@@ -2536,9 +2533,9 @@ try_function_name:
        } else {
                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-               }
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       HANDLE_EXCEPTION();
+                       if (UNEXPECTED(EG(exception) != NULL)) {
+                               HANDLE_EXCEPTION();
+                       }
                }
                zend_throw_error(NULL, "Function name must be a string");
 
@@ -2583,9 +2580,9 @@ try_class_name:
                } else {
                        if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Class name must be a valid object or a string");
                }
@@ -2792,9 +2789,9 @@ try_function_name:
        } else {
                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-               }
-               if (UNEXPECTED(EG(exception) != NULL)) {
-                       HANDLE_EXCEPTION();
+                       if (UNEXPECTED(EG(exception) != NULL)) {
+                               HANDLE_EXCEPTION();
+                       }
                }
                zend_throw_error(NULL, "Function name must be a string");
                zval_ptr_dtor_nogc(free_op2);
@@ -3238,9 +3235,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_
                        }
                        if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(value, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Can only throw objects");
 
@@ -3411,9 +3408,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
                        }
                        if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "__clone method called on non-object");
 
@@ -5483,12 +5480,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
 
@@ -5516,9 +5512,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
                                }
                                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
 
@@ -5594,10 +5591,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -5623,9 +5620,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
 
@@ -5894,11 +5891,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONS
                                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                                } else {
                                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                                       if (UNEXPECTED(EG(exception) != NULL)) {
-                                               HANDLE_EXCEPTION();
-                                       }
                                        if (UNEXPECTED(ce == NULL)) {
-                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+                                               if (EXPECTED(!EG(exception))) {
+                                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+                                               }
                                                HANDLE_EXCEPTION();
                                        }
                                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -6121,20 +6117,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_CONST_HAN
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if (IS_CONST != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -7080,20 +7072,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDL
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if (IS_CONST != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -7591,10 +7579,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -7620,9 +7608,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
 
@@ -7939,20 +7927,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HA
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if (IS_CONST != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -9208,12 +9192,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
 
@@ -9241,9 +9224,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
                                }
                                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
 
@@ -9319,10 +9303,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -9348,9 +9332,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
 
@@ -11015,12 +10999,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TM
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
                        zval_ptr_dtor_nogc(free_op2);
@@ -11048,9 +11031,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TM
                                }
                                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               zval_ptr_dtor_nogc(free_op2);
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
                                zval_ptr_dtor_nogc(free_op2);
@@ -11127,10 +11111,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -11156,9 +11140,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
                                zval_ptr_dtor_nogc(free_op2);
@@ -11874,9 +11858,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OP
                        }
                        if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(value, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Can only throw objects");
                        zval_ptr_dtor_nogc(free_op1);
@@ -15116,9 +15100,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OP
                        }
                        if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(value, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Can only throw objects");
                        zval_ptr_dtor_nogc(free_op1);
@@ -17473,10 +17457,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -17502,9 +17486,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
 
@@ -17649,11 +17633,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_
                                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                                } else {
                                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                                       if (UNEXPECTED(EG(exception) != NULL)) {
-                                               HANDLE_EXCEPTION();
-                                       }
                                        if (UNEXPECTED(ce == NULL)) {
-                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+                                               if (EXPECTED(!EG(exception))) {
+                                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+                                               }
                                                HANDLE_EXCEPTION();
                                        }
                                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -19099,10 +19082,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -19128,9 +19111,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
 
@@ -20702,10 +20685,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -20731,9 +20714,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
 
@@ -22257,10 +22240,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                if (UNEXPECTED(ce == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT |  ZEND_FETCH_CLASS_EXCEPTION);
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
-                       }
                        if (UNEXPECTED(ce == NULL)) {
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                                zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
                                HANDLE_EXCEPTION();
                        }
@@ -22286,9 +22269,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
                                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                        GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Function name must be a string");
                                zval_ptr_dtor_nogc(free_op2);
@@ -22681,9 +22664,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
                        }
                        if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "__clone method called on non-object");
 
@@ -23639,12 +23622,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
 
@@ -23672,9 +23654,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
                                }
                                if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
 
@@ -23792,11 +23775,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CON
                                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)));
                                } else {
                                        ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), EX_CONSTANT(opline->op1) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                                       if (UNEXPECTED(EG(exception) != NULL)) {
-                                               HANDLE_EXCEPTION();
-                                       }
                                        if (UNEXPECTED(ce == NULL)) {
-                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+                                               if (EXPECTED(!EG(exception))) {
+                                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op1)));
+                                               }
                                                HANDLE_EXCEPTION();
                                        }
                                        CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce);
@@ -26011,12 +25993,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
 
@@ -26044,9 +26025,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
                                }
                                if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
 
@@ -27483,12 +27465,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
                        zval_ptr_dtor_nogc(free_op2);
@@ -27516,9 +27497,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
                                }
                                if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               zval_ptr_dtor_nogc(free_op2);
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
                                zval_ptr_dtor_nogc(free_op2);
@@ -28533,9 +28515,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPC
                        }
                        if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(value) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(value, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Can only throw objects");
 
@@ -28781,9 +28763,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
                        }
                        if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "__clone method called on non-object");
 
@@ -31703,12 +31685,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
 
@@ -31736,9 +31717,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
                                }
                                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
 
@@ -32041,20 +32023,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLE
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if (IS_CV != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -33360,20 +33338,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if (IS_CV != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -34569,20 +34543,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDL
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
 
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if (IS_CV != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -36744,12 +36714,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
 
@@ -36777,9 +36746,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
                                }
                                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
 
@@ -39301,12 +39271,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
                        zval_ptr_dtor_nogc(free_op2);
@@ -39334,9 +39303,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
                                }
                                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               zval_ptr_dtor_nogc(free_op2);
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
                                zval_ptr_dtor_nogc(free_op2);
@@ -40272,9 +40242,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
                        }
                        if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                                GET_OP1_UNDEF_CV(obj, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "__clone method called on non-object");
                        zval_ptr_dtor_nogc(free_op1);
@@ -41529,12 +41499,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
 
@@ -41562,9 +41531,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
                                }
                                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
 
@@ -41738,20 +41708,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_CONST_HA
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -42341,20 +42307,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_VAR_HAND
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -42746,20 +42708,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_H
                        ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)));
                        if (UNEXPECTED(ce == NULL)) {
                                ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
-                               if (UNEXPECTED(EG(exception) != NULL)) {
+                               if (UNEXPECTED(ce == NULL)) {
+                                       if (EXPECTED(!EG(exception))) {
+                                               zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
+                                       }
                                        if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
                                                zend_string_release(Z_STR(tmp));
                                        }
                                        zval_ptr_dtor_nogc(free_op1);
                                        HANDLE_EXCEPTION();
                                }
-                               if (UNEXPECTED(ce == NULL)) {
-                                       zend_throw_error(NULL, "Class '%s' not found", Z_STRVAL_P(EX_CONSTANT(opline->op2)));
-                                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                                               zend_string_release(Z_STR(tmp));
-                                       }
-                                       HANDLE_EXCEPTION();
-                               }
                                CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce);
                        }
                } else {
@@ -43655,12 +43613,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
 
@@ -43688,9 +43645,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
                                }
                                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
 
@@ -44793,12 +44751,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
                                if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
                                        break;
                                }
-                       }
-                       if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
+                       } else if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(function_name) == IS_UNDEF)) {
                                GET_OP2_UNDEF_CV(function_name, BP_VAR_R);
-                       }
-                       if (UNEXPECTED(EG(exception) != NULL)) {
-                               HANDLE_EXCEPTION();
+                               if (UNEXPECTED(EG(exception) != NULL)) {
+                                       HANDLE_EXCEPTION();
+                               }
                        }
                        zend_throw_error(NULL, "Method name must be a string");
                        zval_ptr_dtor_nogc(free_op2);
@@ -44826,9 +44783,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
                                }
                                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                                        GET_OP1_UNDEF_CV(object, BP_VAR_R);
-                               }
-                               if (UNEXPECTED(EG(exception) != NULL)) {
-                                       HANDLE_EXCEPTION();
+                                       if (UNEXPECTED(EG(exception) != NULL)) {
+                                               zval_ptr_dtor_nogc(free_op2);
+                                               HANDLE_EXCEPTION();
+                                       }
                                }
                                zend_throw_error(NULL, "Call to a member function %s() on %s", Z_STRVAL_P(function_name), zend_get_type_by_const(Z_TYPE_P(object)));
                                zval_ptr_dtor_nogc(free_op2);