]> granicus.if.org Git - php/commitdiff
Restore registers
authorDmitry Stogov <dmitry@zend.com>
Fri, 10 Jul 2020 09:51:19 +0000 (12:51 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 10 Jul 2020 09:51:19 +0000 (12:51 +0300)
ext/opcache/jit/zend_jit_vm_helpers.c

index 9e52c47be7dec1758ba79846b3b7f8d51bf1641c..be6ecce0b52fe646a9906fc6e1890dade5057b4f 100644 (file)
@@ -590,6 +590,10 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
 
        if (UNEXPECTED(opline->opcode == ZEND_HANDLE_EXCEPTION)) {
                /* Abort trace because of exception */
+#ifdef HAVE_GCC_GLOBAL_REGS
+               execute_data = save_execute_data;
+               opline = save_opline;
+#endif
                return ZEND_JIT_TRACE_STOP_EXCEPTION;
        }
 
@@ -609,6 +613,10 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
        if (prev_call) {
                int ret = zend_jit_trace_record_fake_init_call(prev_call, trace_buffer, idx, is_megamorphic, &megamorphic, ret_level + level);
                if (ret < 0) {
+#ifdef HAVE_GCC_GLOBAL_REGS
+                       execute_data = save_execute_data;
+                       opline = save_opline;
+#endif
                        return ZEND_JIT_TRACE_STOP_BAD_FUNC;
                }
                idx = ret;