]> granicus.if.org Git - php/commitdiff
Make assertions in DO_ICALL and CALL_TRAMPOLINE to be consistent with DO_FCALL.
authorDmitry Stogov <dmitry@zend.com>
Tue, 17 Oct 2017 10:35:59 +0000 (13:35 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 17 Oct 2017 10:35:59 +0000 (13:35 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b8f0aa1f343d25782d580aa29496aff758ec1659..bab3660a07285495ab3fdf833ddf74b7c69c1737 100644 (file)
@@ -3480,11 +3480,12 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
        fbc->internal_function.handler(call, ret);
 
 #if ZEND_DEBUG
-       ZEND_ASSERT(
-               EG(exception) || !call->func ||
-               !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-               zend_verify_internal_return_type(call->func, ret));
-       ZEND_ASSERT(!Z_ISREF_P(ret));
+       if (!EG(exception) && call->func) {
+               ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+                       zend_verify_internal_return_type(call->func, ret));
+               ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+                       ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+       }
 #endif
 
        EG(current_execute_data) = execute_data;
@@ -7837,10 +7838,12 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
                }
 
 #if ZEND_DEBUG
-               ZEND_ASSERT(
-                       EG(exception) || !call->func ||
-                       !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-                       zend_verify_internal_return_type(call->func, ret));
+               if (!EG(exception) && call->func) {
+                       ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+                               zend_verify_internal_return_type(call->func, ret));
+                       ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+                               ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+               }
 #endif
 
                EG(current_execute_data) = call->prev_execute_data;
index 9d99daf98684a731e82eb4df39d8b9b5bc33120a..180dc5279f29ee7f75448957f0f5cbba4f0e4f2e 100644 (file)
@@ -573,11 +573,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
        fbc->internal_function.handler(call, ret);
 
 #if ZEND_DEBUG
-       ZEND_ASSERT(
-               EG(exception) || !call->func ||
-               !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-               zend_verify_internal_return_type(call->func, ret));
-       ZEND_ASSERT(!Z_ISREF_P(ret));
+       if (!EG(exception) && call->func) {
+               ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+                       zend_verify_internal_return_type(call->func, ret));
+               ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+                       ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+       }
 #endif
 
        EG(current_execute_data) = execute_data;
@@ -617,11 +618,12 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_ICALL_SPEC_RETV
        fbc->internal_function.handler(call, ret);
 
 #if ZEND_DEBUG
-       ZEND_ASSERT(
-               EG(exception) || !call->func ||
-               !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-               zend_verify_internal_return_type(call->func, ret));
-       ZEND_ASSERT(!Z_ISREF_P(ret));
+       if (!EG(exception) && call->func) {
+               ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+                       zend_verify_internal_return_type(call->func, ret));
+               ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+                       ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+       }
 #endif
 
        EG(current_execute_data) = execute_data;
@@ -2032,10 +2034,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
                }
 
 #if ZEND_DEBUG
-               ZEND_ASSERT(
-                       EG(exception) || !call->func ||
-                       !(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
-                       zend_verify_internal_return_type(call->func, ret));
+               if (!EG(exception) && call->func) {
+                       ZEND_ASSERT(!(call->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) ||
+                               zend_verify_internal_return_type(call->func, ret));
+                       ZEND_ASSERT((call->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)
+                               ? Z_ISREF_P(ret) : !Z_ISREF_P(ret));
+               }
 #endif
 
                EG(current_execute_data) = call->prev_execute_data;