]> granicus.if.org Git - php/commitdiff
Add zend_observer API
authorLevi Morrison <levim@php.net>
Tue, 1 Sep 2020 15:57:49 +0000 (09:57 -0600)
committerLevi Morrison <levim@php.net>
Tue, 1 Sep 2020 15:59:59 +0000 (09:59 -0600)
Closes GH-5857.

Co-authored-by: Nikita Popov <nikita.ppv@gmail.com>
Co-authored-by: Sammy Powers <sammyk@datadoghq.com>
32 files changed:
Zend/zend.c
Zend/zend_execute.c
Zend/zend_execute_API.c
Zend/zend_generators.c
Zend/zend_observer.c [new file with mode: 0644]
Zend/zend_observer.h [new file with mode: 0644]
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Zend/zend_vm_execute.skl
Zend/zend_vm_gen.php
Zend/zend_vm_handlers.h
configure.ac
ext/opcache/ZendAccelerator.c
ext/zend_test/test.c
ext/zend_test/tests/observer.inc [new file with mode: 0644]
ext/zend_test/tests/observer_basic_01.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_basic_02.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_basic_03.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_basic_04.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_basic_05.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_closure_01.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_eval_01.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_exception_01.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_generator_01.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_generator_02.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_generator_03.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_generator_04.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_jit_01.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_magic_01.phpt [new file with mode: 0644]
ext/zend_test/tests/observer_zend_call_function_01.phpt [new file with mode: 0644]
main/main.c
win32/build/config.w32

index 2e2ff032136bc4e39635fa0397b4f219d62e4078..88530faa06455efa207b52ef931def885ac34aff 100644 (file)
@@ -33,6 +33,7 @@
 #include "zend_smart_string.h"
 #include "zend_cpuinfo.h"
 #include "zend_attributes.h"
+#include "zend_observer.h"
 
 static size_t global_map_ptr_last = 0;
 
@@ -1205,6 +1206,7 @@ ZEND_API void zend_activate(void) /* {{{ */
        if (CG(map_ptr_last)) {
                memset(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)), 0, CG(map_ptr_last) * sizeof(void*));
        }
+       zend_observer_activate();
 }
 /* }}} */
 
@@ -1221,6 +1223,8 @@ ZEND_API void zend_deactivate(void) /* {{{ */
        /* we're no longer executing anything */
        EG(current_execute_data) = NULL;
 
+       zend_observer_deactivate();
+
        zend_try {
                shutdown_scanner();
        } zend_end_try();
index bf93e89d6065ce32f1ac5d07bb149eb295bcf715..4f2fbb7425abeccd86cda27b5dc9b4412d54bb08 100644 (file)
@@ -40,6 +40,7 @@
 #include "zend_inheritance.h"
 #include "zend_type_info.h"
 #include "zend_smart_str.h"
+#include "zend_observer.h"
 
 /* Virtual current working directory support */
 #include "zend_virtual_cwd.h"
index 6286b77f18272757e2f2a7408122c422aab8230c..b8c3f1197406bd09b9a56f0984f9c45439164ef6 100644 (file)
@@ -35,6 +35,7 @@
 #include "zend_float.h"
 #include "zend_weakrefs.h"
 #include "zend_inheritance.h"
+#include "zend_observer.h"
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
@@ -869,6 +870,9 @@ cleanup_args:
                uint32_t orig_jit_trace_num = EG(jit_trace_num);
 
                zend_init_func_execute_data(call, &func->op_array, fci->retval);
+               if (ZEND_OBSERVER_ENABLED) {
+                       zend_observer_maybe_fcall_call_begin(call);
+               }
                zend_execute_ex(call);
                EG(jit_trace_num) = orig_jit_trace_num;
                EG(opline_before_exception) = current_opline_before_exception;
index 3fbac811ac4283ad089ca1e6b0c845bfae7cf17d..c890669a7055747b79fa054935bb4180e99b2d97 100644 (file)
@@ -24,6 +24,7 @@
 #include "zend_generators.h"
 #include "zend_closures.h"
 #include "zend_generators_arginfo.h"
+#include "zend_observer.h"
 
 ZEND_API zend_class_entry *zend_ce_generator;
 ZEND_API zend_class_entry *zend_ce_ClosedGeneratorException;
@@ -774,7 +775,25 @@ try_again:
 
                /* Resume execution */
                generator->flags |= ZEND_GENERATOR_CURRENTLY_RUNNING;
-               zend_execute_ex(generator->execute_data);
+               if (!ZEND_OBSERVER_ENABLED) {
+                       zend_execute_ex(generator->execute_data);
+               } else {
+                       zend_op_array *op_array = &generator->execute_data->func->op_array;
+                       void *observer_handlers = ZEND_OBSERVER_HANDLERS(op_array);
+                       if (!observer_handlers) {
+                               zend_observer_fcall_install((zend_function *)op_array);
+                               observer_handlers = ZEND_OBSERVER_HANDLERS(op_array);
+                       }
+                       ZEND_ASSERT(observer_handlers);
+                       if (observer_handlers != ZEND_OBSERVER_NOT_OBSERVED) {
+                               zend_observe_fcall_begin(observer_handlers, generator->execute_data);
+                       }
+                       zend_execute_ex(generator->execute_data);
+                       if (generator->execute_data) {
+                               /* On the final return, this will be called from ZEND_GENERATOR_RETURN */
+                               zend_observer_maybe_fcall_call_end(generator->execute_data, &generator->value);
+                       }
+               }
                generator->flags &= ~ZEND_GENERATOR_CURRENTLY_RUNNING;
 
                generator->frozen_call_stack = NULL;
diff --git a/Zend/zend_observer.c b/Zend/zend_observer.c
new file mode 100644 (file)
index 0000000..033551c
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+   +----------------------------------------------------------------------+
+   | Zend Engine                                                          |
+   +----------------------------------------------------------------------+
+   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.00 of the Zend license,     |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.zend.com/license/2_00.txt.                                |
+   | If you did not receive a copy of the Zend license and are unable to  |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@zend.com so we can mail you a copy immediately.              |
+   +----------------------------------------------------------------------+
+   | Authors: Levi Morrison <levim@php.net>                               |
+   |          Sammy Kaye Powers <sammyk@php.net>                          |
+   +----------------------------------------------------------------------+
+*/
+
+#include "zend_observer.h"
+
+#include "zend_extensions.h"
+#include "zend_llist.h"
+#include "zend_vm.h"
+
+zend_llist zend_observers_fcall_list;
+int zend_observer_fcall_op_array_extension = -1;
+
+ZEND_TLS zend_arena *fcall_handlers_arena = NULL;
+
+ZEND_API extern inline void zend_observer_maybe_fcall_call_begin(
+       zend_execute_data *execute_data);
+ZEND_API extern inline void zend_observer_maybe_fcall_call_end(
+       zend_execute_data *execute_data,
+       zval *return_value);
+
+// Call during minit/startup ONLY
+ZEND_API void zend_observer_fcall_register(zend_observer_fcall_init init) {
+       /* We don't want to get an extension handle unless an ext installs an observer */
+       if (!ZEND_OBSERVER_ENABLED) {
+               zend_observer_fcall_op_array_extension =
+                       zend_get_op_array_extension_handle();
+
+               /* ZEND_CALL_TRAMPOLINE has SPEC(OBSERVER) but zend_init_call_trampoline_op()
+                * is called before any extensions have registered as an observer. So we
+                * adjust the offset to the observed handler when we know we need to observe. */
+               ZEND_VM_SET_OPCODE_HANDLER(&EG(call_trampoline_op));
+
+               /* ZEND_HANDLE_EXCEPTION also has SPEC(OBSERVER) and no observer extensions
+                * exist when zend_init_exception_op() is called. */
+               ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op));
+               ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)+1);
+               ZEND_VM_SET_OPCODE_HANDLER(EG(exception_op)+2);
+       }
+       zend_llist_add_element(&zend_observers_fcall_list, &init);
+}
+
+// Called by engine before MINITs
+ZEND_API void zend_observer_startup(void) {
+       zend_llist_init(&zend_observers_fcall_list, sizeof(zend_observer_fcall_init), NULL, 1);
+}
+
+ZEND_API void zend_observer_activate(void) {
+       if (ZEND_OBSERVER_ENABLED) {
+               fcall_handlers_arena = zend_arena_create(4096);
+       }
+}
+
+ZEND_API void zend_observer_deactivate(void) {
+       if (fcall_handlers_arena) {
+               zend_arena_destroy(fcall_handlers_arena);
+       }
+}
+
+ZEND_API void zend_observer_shutdown(void) {
+       zend_llist_destroy(&zend_observers_fcall_list);
+}
+
+ZEND_API void zend_observer_fcall_install(zend_function *function) {
+       zend_llist_element *element;
+       zend_llist *list = &zend_observers_fcall_list;
+       zend_op_array *op_array = &function->op_array;
+
+       if (fcall_handlers_arena == NULL) {
+               return;
+       }
+
+       ZEND_ASSERT(function->type != ZEND_INTERNAL_FUNCTION);
+
+       zend_llist handlers_list;
+       zend_llist_init(&handlers_list, sizeof(zend_observer_fcall), NULL, 0);
+       for (element = list->head; element; element = element->next) {
+               zend_observer_fcall_init init;
+               memcpy(&init, element->data, sizeof init);
+               zend_observer_fcall handlers = init(function);
+               if (handlers.begin || handlers.end) {
+                       zend_llist_add_element(&handlers_list, &handlers);
+               }
+       }
+
+       ZEND_ASSERT(RUN_TIME_CACHE(op_array));
+       void *ext;
+       if (handlers_list.count) {
+               size_t size = sizeof(zend_observer_fcall_cache) + (handlers_list.count - 1) * sizeof(zend_observer_fcall);
+               zend_observer_fcall_cache *cache = zend_arena_alloc(&fcall_handlers_arena, size);
+               zend_observer_fcall *handler = cache->handlers;
+               for (element = handlers_list.head; element; element = element->next) {
+                       memcpy(handler++, element->data, sizeof *handler);
+               }
+               cache->end = handler;
+               ext = cache;
+       } else {
+               ext = ZEND_OBSERVER_NOT_OBSERVED;
+       }
+
+       ZEND_OBSERVER_HANDLERS(op_array) = ext;
+       zend_llist_destroy(&handlers_list);
+}
+
+ZEND_API void zend_observe_fcall_begin(
+       zend_observer_fcall_cache *cache,
+       zend_execute_data *execute_data)
+{
+       zend_observer_fcall *handler, *end = cache->end;
+       for (handler = cache->handlers; handler != end; ++handler) {
+               if (handler->begin) {
+                       handler->begin(execute_data);
+               }
+       }
+}
+
+ZEND_API void zend_observer_fcall_call_end_helper(
+       zend_execute_data *execute_data,
+       zval *return_value)
+{
+       zend_function *func = execute_data->func;
+       ZEND_ASSUME(ZEND_OBSERVABLE_FN(func->common.fn_flags));
+       void *observer_handlers = ZEND_OBSERVER_HANDLERS(&func->op_array);
+       // TODO: Fix exceptions from generators
+       // ZEND_ASSERT(observer_handlers);
+       if (observer_handlers && observer_handlers != ZEND_OBSERVER_NOT_OBSERVED) {
+               zend_observer_fcall_cache *cache = observer_handlers;
+               zend_observe_fcall_end(cache, execute_data, return_value);
+       }
+}
+
+ZEND_API void zend_observe_fcall_end(
+       zend_observer_fcall_cache *cache,
+       zend_execute_data *execute_data,
+       zval *return_value)
+{
+       zend_observer_fcall *handler = cache->end, *end = cache->handlers;
+       while (handler-- != end) {
+               if (handler->end) {
+                       handler->end(execute_data, return_value);
+               }
+       }
+}
+
+
diff --git a/Zend/zend_observer.h b/Zend/zend_observer.h
new file mode 100644 (file)
index 0000000..9fb538c
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+   +----------------------------------------------------------------------+
+   | Zend Engine                                                          |
+   +----------------------------------------------------------------------+
+   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.00 of the Zend license,     |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.zend.com/license/2_00.txt.                                |
+   | If you did not receive a copy of the Zend license and are unable to  |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@zend.com so we can mail you a copy immediately.              |
+   +----------------------------------------------------------------------+
+   | Authors: Levi Morrison <levim@php.net>                               |
+   |          Sammy Kaye Powers <sammyk@php.net>                          |
+   +----------------------------------------------------------------------+
+*/
+
+#ifndef ZEND_OBSERVER_H
+#define ZEND_OBSERVER_H
+
+#include "zend.h"
+#include "zend_compile.h"
+
+BEGIN_EXTERN_C()
+
+extern ZEND_API int zend_observer_fcall_op_array_extension;
+
+#define ZEND_OBSERVER_ENABLED (zend_observer_fcall_op_array_extension != -1)
+
+#define ZEND_OBSERVER_HANDLERS(op_array) \
+       ZEND_OP_ARRAY_EXTENSION(op_array, zend_observer_fcall_op_array_extension)
+
+#define ZEND_OBSERVER_NOT_OBSERVED ((void *) 2)
+
+#define ZEND_OBSERVABLE_FN(fn_flags) \
+       (ZEND_OBSERVER_ENABLED && \
+               !(fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE | ZEND_ACC_FAKE_CLOSURE)))
+
+struct zend_observer_fcall {
+       void (*begin)(zend_execute_data *execute_data);
+       void (*end)(zend_execute_data *execute_data, zval *retval);
+};
+typedef struct zend_observer_fcall zend_observer_fcall;
+
+struct zend_observer_fcall_cache {
+       // points after the last handler
+       zend_observer_fcall *end;
+       // a variadic array using "struct hack"
+       zend_observer_fcall handlers[1];
+};
+typedef struct zend_observer_fcall_cache zend_observer_fcall_cache;
+
+/* If the fn should not be observed then return {NULL, NULL} */
+typedef zend_observer_fcall(*zend_observer_fcall_init)(zend_function *func);
+
+// Call during minit/startup ONLY
+ZEND_API void zend_observer_fcall_register(zend_observer_fcall_init init);
+
+ZEND_API void zend_observer_startup(void); // Called by engine before MINITs
+ZEND_API void zend_observer_activate(void);
+ZEND_API void zend_observer_deactivate(void);
+ZEND_API void zend_observer_shutdown(void);
+
+ZEND_API void zend_observer_fcall_install(zend_function *function);
+
+ZEND_API void zend_observe_fcall_begin(
+       zend_observer_fcall_cache *cache,
+       zend_execute_data *execute_data);
+
+ZEND_API void zend_observe_fcall_end(
+       zend_observer_fcall_cache *cache,
+       zend_execute_data *execute_data,
+       zval *return_value);
+
+ZEND_API void zend_observer_fcall_call_end_helper(
+       zend_execute_data *execute_data,
+       zval *return_value);
+
+ZEND_API zend_always_inline void zend_observer_maybe_fcall_call_begin(
+       zend_execute_data *execute_data)
+{
+       ZEND_ASSUME(execute_data->func);
+       zend_op_array *op_array = &execute_data->func->op_array;
+       uint32_t fn_flags = op_array->fn_flags;
+       if (ZEND_OBSERVABLE_FN(fn_flags) && !(fn_flags & ZEND_ACC_GENERATOR)) {
+               void *observer_handlers = ZEND_OBSERVER_HANDLERS(op_array);
+               if (!observer_handlers) {
+                       zend_observer_fcall_install((zend_function *)op_array);
+                       observer_handlers = ZEND_OBSERVER_HANDLERS(op_array);
+               }
+
+               ZEND_ASSERT(observer_handlers);
+               if (observer_handlers != ZEND_OBSERVER_NOT_OBSERVED) {
+                       zend_observe_fcall_begin(
+                               (zend_observer_fcall_cache *)observer_handlers,
+                               execute_data);
+               }
+       }
+}
+
+ZEND_API zend_always_inline void zend_observer_maybe_fcall_call_end(
+       zend_execute_data *execute_data,
+       zval *return_value)
+{
+       zend_function *func = execute_data->func;
+       if (ZEND_OBSERVABLE_FN(func->common.fn_flags)) {
+               zend_observer_fcall_call_end_helper(execute_data, return_value);
+       }
+}
+
+END_EXTERN_C()
+
+#endif /* ZEND_OBSERVER_H */
index 246c5a990d647c719308a92bfda31129420b1764..af6d41db8640f839d9bd66b0bf37892ada0082c5 100644 (file)
@@ -3940,7 +3940,7 @@ ZEND_VM_HOT_HANDLER(129, ZEND_DO_ICALL, ANY, ANY, SPEC(RETVAL))
        ZEND_VM_CONTINUE();
 }
 
-ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL))
+ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
 {
        USE_OPLINE
        zend_execute_data *call = EX(call);
@@ -3958,12 +3958,13 @@ ZEND_VM_HOT_HANDLER(130, ZEND_DO_UCALL, ANY, ANY, SPEC(RETVAL))
        call->prev_execute_data = execute_data;
        execute_data = call;
        i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+       OBSERVER_FCALL_BEGIN_HANDLERS(execute_data);
        LOAD_OPLINE_EX();
 
        ZEND_VM_ENTER_EX();
 }
 
-ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
+ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL,OBSERVER))
 {
        USE_OPLINE
        zend_execute_data *call = EX(call);
@@ -3982,6 +3983,7 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
                call->prev_execute_data = execute_data;
                execute_data = call;
                i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+               OBSERVER_FCALL_BEGIN_HANDLERS(execute_data);
                LOAD_OPLINE_EX();
 
                ZEND_VM_ENTER_EX();
@@ -4053,7 +4055,7 @@ ZEND_VM_C_LABEL(fcall_by_name_end):
        ZEND_VM_CONTINUE();
 }
 
-ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
+ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL,OBSERVER))
 {
        USE_OPLINE
        zend_execute_data *call = EX(call);
@@ -4072,6 +4074,7 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
                call->prev_execute_data = execute_data;
                execute_data = call;
                i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
+               OBSERVER_FCALL_BEGIN_HANDLERS(execute_data);
 
                if (EXPECTED(zend_execute_ex == execute_ex)) {
                        LOAD_OPLINE_EX();
@@ -4220,7 +4223,7 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
        }
 }
 
-ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
+ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
 {
        USE_OPLINE
        zval *retval_ptr;
@@ -4289,10 +4292,11 @@ ZEND_VM_INLINE_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
                        }
                }
        }
+       OBSERVER_FCALL_END_HANDLERS(execute_data, return_value);
        ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
 }
 
-ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
+ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC, SPEC(OBSERVER))
 {
        USE_OPLINE
        zval *retval_ptr;
@@ -4349,6 +4353,7 @@ ZEND_VM_COLD_CONST_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC)
                FREE_OP1_VAR_PTR();
        } while (0);
 
+       OBSERVER_FCALL_END_HANDLERS(execute_data, EX(return_value));
        ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
 }
 
@@ -4428,7 +4433,7 @@ ZEND_VM_HANDLER(139, ZEND_GENERATOR_CREATE, ANY, ANY)
        }
 }
 
-ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, CONST|TMP|VAR|CV, ANY)
+ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, CONST|TMP|VAR|CV, ANY, SPEC(OBSERVER))
 {
        USE_OPLINE
        zval *retval;
@@ -4464,6 +4469,8 @@ ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, CONST|TMP|VAR|CV, ANY)
                }
        }
 
+       OBSERVER_FCALL_END_HANDLERS(generator->execute_data, &generator->retval);
+
        /* Close the generator to free up resources */
        zend_generator_close(generator, 1);
 
@@ -6134,7 +6141,7 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
+ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL, SPEC(OBSERVER))
 {
        USE_OPLINE
        zend_op_array *new_op_array;
@@ -6143,8 +6150,8 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
        SAVE_OPLINE();
        inc_filename = GET_OP1_ZVAL_PTR(BP_VAR_R);
        new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
-       FREE_OP1();
        if (UNEXPECTED(EG(exception) != NULL)) {
+               FREE_OP1();
                if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
                        destroy_op_array(new_op_array);
                        efree_size(new_op_array, sizeof(zend_op_array));
@@ -6178,7 +6185,9 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
 
                call->prev_execute_data = execute_data;
                i_init_code_execute_data(call, new_op_array, return_value);
+               OBSERVER_FCALL_BEGIN_HANDLERS(call);
                if (EXPECTED(zend_execute_ex == execute_ex)) {
+                       FREE_OP1();
                        ZEND_VM_ENTER();
                } else {
                        ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -6190,12 +6199,14 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
                efree_size(new_op_array, sizeof(zend_op_array));
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_rethrow_exception(execute_data);
+                       FREE_OP1();
                        UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
        } else if (RETURN_VALUE_USED(opline)) {
                ZVAL_FALSE(EX_VAR(opline->result.var));
        }
+       FREE_OP1();
        ZEND_VM_NEXT_OPCODE();
 }
 
@@ -7688,7 +7699,7 @@ ZEND_VM_HELPER(zend_dispatch_try_catch_finally_helper, ANY, ANY, uint32_t try_ca
        }
 }
 
-ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
+ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY, SPEC(OBSERVER))
 {
        const zend_op *throw_op = EG(opline_before_exception);
        uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
@@ -7717,6 +7728,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
                }
        }
 
+       OBSERVER_FCALL_END_HANDLERS(execute_data, EX(return_value));
        cleanup_unfinished_calls(execute_data, throw_op_num);
 
        if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
@@ -8420,7 +8432,7 @@ ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, CV|TMPVAR|UNUSED|CLASS_FETCH, ANY)
        ZEND_VM_NEXT_OPCODE();
 }
 
-ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
+ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY, SPEC(OBSERVER))
 {
        zend_array *args = NULL;
        zend_function *fbc = EX(func);
@@ -8478,6 +8490,7 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
                }
                execute_data = call;
                i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+               OBSERVER_FCALL_BEGIN_HANDLERS(execute_data);
                if (EXPECTED(zend_execute_ex == execute_ex)) {
                        LOAD_OPLINE_EX();
                        ZEND_VM_ENTER_EX();
index 4b3958a4e40343dcd4dc27f6daf3d99cf0d43440..14d9670ee4649e59d03573493f54ab06b58b025b 100644 (file)
@@ -316,6 +316,7 @@ static zend_uchar zend_user_opcodes[256] = {0,
 #define SPEC_RULE_SMART_BRANCH 0x00200000
 #define SPEC_RULE_COMMUTATIVE  0x00800000
 #define SPEC_RULE_ISSET        0x01000000
+#define SPEC_RULE_OBSERVER     0x02000000
 
 static const uint32_t *zend_spec_handlers;
 static const void * const *zend_opcode_handlers;
@@ -1349,6 +1350,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV
        call->prev_execute_data = execute_data;
        execute_data = call;
        i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+
        LOAD_OPLINE_EX();
 
        ZEND_VM_ENTER_EX();
@@ -1372,6 +1374,55 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETV
        call->prev_execute_data = execute_data;
        execute_data = call;
        i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+
+       LOAD_OPLINE_EX();
+
+       ZEND_VM_ENTER_EX();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_execute_data *call = EX(call);
+       zend_function *fbc = call->func;
+       zval *ret;
+
+       SAVE_OPLINE();
+       EX(call) = call->prev_execute_data;
+
+       ret = NULL;
+       if (0) {
+               ret = EX_VAR(opline->result.var);
+       }
+
+       call->prev_execute_data = execute_data;
+       execute_data = call;
+       i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+       zend_observer_maybe_fcall_call_begin(execute_data);
+       LOAD_OPLINE_EX();
+
+       ZEND_VM_ENTER_EX();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_RETVAL_USED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_execute_data *call = EX(call);
+       zend_function *fbc = call->func;
+       zval *ret;
+
+       SAVE_OPLINE();
+       EX(call) = call->prev_execute_data;
+
+       ret = NULL;
+       if (1) {
+               ret = EX_VAR(opline->result.var);
+       }
+
+       call->prev_execute_data = execute_data;
+       execute_data = call;
+       i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+       zend_observer_maybe_fcall_call_begin(execute_data);
        LOAD_OPLINE_EX();
 
        ZEND_VM_ENTER_EX();
@@ -1396,6 +1447,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
                call->prev_execute_data = execute_data;
                execute_data = call;
                i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+
                LOAD_OPLINE_EX();
 
                ZEND_VM_ENTER_EX();
@@ -1486,6 +1538,189 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_S
                call->prev_execute_data = execute_data;
                execute_data = call;
                i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+
+               LOAD_OPLINE_EX();
+
+               ZEND_VM_ENTER_EX();
+       } else {
+               zval retval;
+               ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
+
+               if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
+                       zend_deprecated_function(fbc);
+                       if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
+                               if (!1) {
+                                       ret = &retval;
+                                       ZVAL_UNDEF(ret);
+                               }
+                               goto fcall_by_name_end;
+                       }
+               }
+
+               call->prev_execute_data = execute_data;
+               EG(current_execute_data) = call;
+
+#if ZEND_DEBUG
+               zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+#endif
+
+               ret = 1 ? EX_VAR(opline->result.var) : &retval;
+               ZVAL_NULL(ret);
+
+               fbc->internal_function.handler(call, ret);
+
+#if ZEND_DEBUG
+               if (!EG(exception) && call->func) {
+                       if (should_throw) {
+                               zend_internal_call_arginfo_violation(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;
+
+fcall_by_name_end:
+               zend_vm_stack_free_args(call);
+
+               uint32_t call_info = ZEND_CALL_INFO(call);
+               if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
+                       if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
+                               zend_free_extra_named_params(call->extra_named_params);
+                       }
+                       zend_vm_stack_free_call_frame_ex(call_info, call);
+               } else {
+                       EG(vm_stack_top) = (zval*)call;
+               }
+
+               if (!1) {
+                       i_zval_ptr_dtor(ret);
+               }
+       }
+
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               zend_rethrow_exception(execute_data);
+               HANDLE_EXCEPTION();
+       }
+       ZEND_VM_SET_OPCODE(opline + 1);
+       ZEND_VM_CONTINUE();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_execute_data *call = EX(call);
+       zend_function *fbc = call->func;
+       zval *ret;
+
+       SAVE_OPLINE();
+       EX(call) = call->prev_execute_data;
+
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
+               ret = NULL;
+               if (0) {
+                       ret = EX_VAR(opline->result.var);
+               }
+
+               call->prev_execute_data = execute_data;
+               execute_data = call;
+               i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+               zend_observer_maybe_fcall_call_begin(execute_data);
+               LOAD_OPLINE_EX();
+
+               ZEND_VM_ENTER_EX();
+       } else {
+               zval retval;
+               ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
+
+               if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
+                       zend_deprecated_function(fbc);
+                       if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
+                               if (!0) {
+                                       ret = &retval;
+                                       ZVAL_UNDEF(ret);
+                               }
+                               goto fcall_by_name_end;
+                       }
+               }
+
+               call->prev_execute_data = execute_data;
+               EG(current_execute_data) = call;
+
+#if ZEND_DEBUG
+               zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+#endif
+
+               ret = 0 ? EX_VAR(opline->result.var) : &retval;
+               ZVAL_NULL(ret);
+
+               fbc->internal_function.handler(call, ret);
+
+#if ZEND_DEBUG
+               if (!EG(exception) && call->func) {
+                       if (should_throw) {
+                               zend_internal_call_arginfo_violation(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;
+
+fcall_by_name_end:
+               zend_vm_stack_free_args(call);
+
+               uint32_t call_info = ZEND_CALL_INFO(call);
+               if (UNEXPECTED(call_info & (ZEND_CALL_HAS_EXTRA_NAMED_PARAMS|ZEND_CALL_ALLOCATED))) {
+                       if (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS) {
+                               zend_free_extra_named_params(call->extra_named_params);
+                       }
+                       zend_vm_stack_free_call_frame_ex(call_info, call);
+               } else {
+                       EG(vm_stack_top) = (zval*)call;
+               }
+
+               if (!0) {
+                       i_zval_ptr_dtor(ret);
+               }
+       }
+
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               zend_rethrow_exception(execute_data);
+               HANDLE_EXCEPTION();
+       }
+       ZEND_VM_SET_OPCODE(opline + 1);
+       ZEND_VM_CONTINUE();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_execute_data *call = EX(call);
+       zend_function *fbc = call->func;
+       zval *ret;
+
+       SAVE_OPLINE();
+       EX(call) = call->prev_execute_data;
+
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
+               ret = NULL;
+               if (1) {
+                       ret = EX_VAR(opline->result.var);
+               }
+
+               call->prev_execute_data = execute_data;
+               execute_data = call;
+               i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+               zend_observer_maybe_fcall_call_begin(execute_data);
                LOAD_OPLINE_EX();
 
                ZEND_VM_ENTER_EX();
@@ -1761,6 +1996,212 @@ fcall_end:
        ZEND_VM_CONTINUE();
 }
 
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_execute_data *call = EX(call);
+       zend_function *fbc = call->func;
+       zval *ret;
+
+       SAVE_OPLINE();
+       EX(call) = call->prev_execute_data;
+
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
+               ret = NULL;
+               if (0) {
+                       ret = EX_VAR(opline->result.var);
+               }
+
+               call->prev_execute_data = execute_data;
+               execute_data = call;
+               i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
+               zend_observer_maybe_fcall_call_begin(execute_data);
+
+               if (EXPECTED(zend_execute_ex == execute_ex)) {
+                       LOAD_OPLINE_EX();
+                       ZEND_VM_ENTER_EX();
+               } else {
+                       SAVE_OPLINE_EX();
+                       execute_data = EX(prev_execute_data);
+                       LOAD_OPLINE();
+                       ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
+                       zend_execute_ex(call);
+               }
+       } else {
+               zval retval;
+               ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
+
+               if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
+                       zend_deprecated_function(fbc);
+                       if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
+                               if (!0) {
+                                       ret = &retval;
+                                       ZVAL_UNDEF(ret);
+                               }
+                               goto fcall_end;
+                       }
+               }
+
+               call->prev_execute_data = execute_data;
+               EG(current_execute_data) = call;
+
+#if ZEND_DEBUG
+               zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+#endif
+
+               ret = 0 ? EX_VAR(opline->result.var) : &retval;
+               ZVAL_NULL(ret);
+
+               if (!zend_execute_internal) {
+                       /* saves one function call if zend_execute_internal is not used */
+                       fbc->internal_function.handler(call, ret);
+               } else {
+                       zend_execute_internal(call, ret);
+               }
+
+#if ZEND_DEBUG
+               if (!EG(exception) && call->func) {
+                       if (should_throw) {
+                               zend_internal_call_arginfo_violation(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;
+
+fcall_end:
+               zend_vm_stack_free_args(call);
+               if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
+                       zend_free_extra_named_params(call->extra_named_params);
+               }
+
+               if (!0) {
+                       i_zval_ptr_dtor(ret);
+               }
+       }
+
+       if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
+               OBJ_RELEASE(Z_OBJ(call->This));
+       }
+
+       zend_vm_stack_free_call_frame(call);
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               zend_rethrow_exception(execute_data);
+               HANDLE_EXCEPTION();
+       }
+
+       ZEND_VM_SET_OPCODE(opline + 1);
+       ZEND_VM_CONTINUE();
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_USED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_execute_data *call = EX(call);
+       zend_function *fbc = call->func;
+       zval *ret;
+
+       SAVE_OPLINE();
+       EX(call) = call->prev_execute_data;
+
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
+               ret = NULL;
+               if (1) {
+                       ret = EX_VAR(opline->result.var);
+               }
+
+               call->prev_execute_data = execute_data;
+               execute_data = call;
+               i_init_func_execute_data(&fbc->op_array, ret, 1 EXECUTE_DATA_CC);
+               zend_observer_maybe_fcall_call_begin(execute_data);
+
+               if (EXPECTED(zend_execute_ex == execute_ex)) {
+                       LOAD_OPLINE_EX();
+                       ZEND_VM_ENTER_EX();
+               } else {
+                       SAVE_OPLINE_EX();
+                       execute_data = EX(prev_execute_data);
+                       LOAD_OPLINE();
+                       ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
+                       zend_execute_ex(call);
+               }
+       } else {
+               zval retval;
+               ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
+
+               if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
+                       zend_deprecated_function(fbc);
+                       if (UNEXPECTED(EG(exception) != NULL)) {
+                               UNDEF_RESULT();
+                               if (!1) {
+                                       ret = &retval;
+                                       ZVAL_UNDEF(ret);
+                               }
+                               goto fcall_end;
+                       }
+               }
+
+               call->prev_execute_data = execute_data;
+               EG(current_execute_data) = call;
+
+#if ZEND_DEBUG
+               zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+#endif
+
+               ret = 1 ? EX_VAR(opline->result.var) : &retval;
+               ZVAL_NULL(ret);
+
+               if (!zend_execute_internal) {
+                       /* saves one function call if zend_execute_internal is not used */
+                       fbc->internal_function.handler(call, ret);
+               } else {
+                       zend_execute_internal(call, ret);
+               }
+
+#if ZEND_DEBUG
+               if (!EG(exception) && call->func) {
+                       if (should_throw) {
+                               zend_internal_call_arginfo_violation(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;
+
+fcall_end:
+               zend_vm_stack_free_args(call);
+               if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
+                       zend_free_extra_named_params(call->extra_named_params);
+               }
+
+               if (!1) {
+                       i_zval_ptr_dtor(ret);
+               }
+       }
+
+       if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) {
+               OBJ_RELEASE(Z_OBJ(call->This));
+       }
+
+       zend_vm_stack_free_call_frame(call);
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               zend_rethrow_exception(execute_data);
+               HANDLE_EXCEPTION();
+       }
+
+       ZEND_VM_SET_OPCODE(opline + 1);
+       ZEND_VM_CONTINUE();
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_CREATE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        zval *return_value = EX(return_value);
@@ -2720,6 +3161,61 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(
        ZEND_VM_TAIL_CALL(zend_dispatch_try_catch_finally_helper_SPEC(current_try_catch_offset, throw_op_num ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       const zend_op *throw_op = EG(opline_before_exception);
+       uint32_t throw_op_num = throw_op - EX(func)->op_array.opcodes;
+       int i, current_try_catch_offset = -1;
+
+       if ((throw_op->opcode == ZEND_FREE || throw_op->opcode == ZEND_FE_FREE)
+               && throw_op->extended_value & ZEND_FREE_ON_RETURN) {
+               /* exceptions thrown because of loop var destruction on return/break/...
+                * are logically thrown at the end of the foreach loop, so adjust the
+                * throw_op_num.
+                */
+               const zend_live_range *range = find_live_range(
+                       &EX(func)->op_array, throw_op_num, throw_op->op1.var);
+               throw_op_num = range->end;
+       }
+
+       /* Find the innermost try/catch/finally the exception was thrown in */
+       for (i = 0; i < EX(func)->op_array.last_try_catch; i++) {
+               zend_try_catch_element *try_catch = &EX(func)->op_array.try_catch_array[i];
+               if (try_catch->try_op > throw_op_num) {
+                       /* further blocks will not be relevant... */
+                       break;
+               }
+               if (throw_op_num < try_catch->catch_op || throw_op_num < try_catch->finally_end) {
+                       current_try_catch_offset = i;
+               }
+       }
+
+       zend_observer_maybe_fcall_call_end(execute_data, EX(return_value));
+       cleanup_unfinished_calls(execute_data, throw_op_num);
+
+       if (throw_op->result_type & (IS_VAR | IS_TMP_VAR)) {
+               switch (throw_op->opcode) {
+                       case ZEND_ADD_ARRAY_ELEMENT:
+                       case ZEND_ADD_ARRAY_UNPACK:
+                       case ZEND_ROPE_INIT:
+                       case ZEND_ROPE_ADD:
+                               break; /* exception while building structures, live range handling will free those */
+
+                       case ZEND_FETCH_CLASS:
+                       case ZEND_DECLARE_ANON_CLASS:
+                               break; /* return value is zend_class_entry pointer */
+
+                       default:
+                               /* smart branch opcodes may not initialize result */
+                               if (!zend_is_smart_branch(throw_op)) {
+                                       zval_ptr_dtor_nogc(EX_VAR(throw_op->result.var));
+                               }
+               }
+       }
+
+       ZEND_VM_TAIL_CALL(zend_dispatch_try_catch_finally_helper_SPEC(current_try_catch_offset, throw_op_num ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -2891,6 +3387,141 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(Z
                }
                execute_data = call;
                i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+
+               if (EXPECTED(zend_execute_ex == execute_ex)) {
+                       LOAD_OPLINE_EX();
+                       ZEND_VM_ENTER_EX();
+               } else {
+                       SAVE_OPLINE_EX();
+                       execute_data = EX(prev_execute_data);
+                       LOAD_OPLINE();
+                       ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
+                       zend_execute_ex(call);
+               }
+       } else {
+               zval retval;
+
+               ZEND_ASSERT(fbc->type == ZEND_INTERNAL_FUNCTION);
+
+               EG(current_execute_data) = call;
+
+#if ZEND_DEBUG
+               zend_bool should_throw = zend_internal_call_should_throw(fbc, call);
+#endif
+
+               if (ret == NULL) {
+                       ret = &retval;
+               }
+
+               ZVAL_NULL(ret);
+               if (!zend_execute_internal) {
+                       /* saves one function call if zend_execute_internal is not used */
+                       fbc->internal_function.handler(call, ret);
+               } else {
+                       zend_execute_internal(call, ret);
+               }
+
+#if ZEND_DEBUG
+               if (!EG(exception) && call->func) {
+                       if (should_throw) {
+                               zend_internal_call_arginfo_violation(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;
+
+               zend_vm_stack_free_args(call);
+               if (ret == &retval) {
+                       zval_ptr_dtor(ret);
+               }
+       }
+
+       execute_data = EG(current_execute_data);
+
+       if (!EX(func) || !ZEND_USER_CODE(EX(func)->type) || (call_info & ZEND_CALL_TOP)) {
+               ZEND_VM_RETURN();
+       }
+
+       if (UNEXPECTED(call_info & ZEND_CALL_RELEASE_THIS)) {
+               zend_object *object = Z_OBJ(call->This);
+               OBJ_RELEASE(object);
+       }
+       zend_vm_stack_free_call_frame(call);
+
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               zend_rethrow_exception(execute_data);
+               HANDLE_EXCEPTION_LEAVE();
+       }
+
+       LOAD_OPLINE();
+       ZEND_VM_INC_OPCODE();
+       ZEND_VM_LEAVE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       zend_array *args = NULL;
+       zend_function *fbc = EX(func);
+       zval *ret = EX(return_value);
+       uint32_t call_info = EX_CALL_INFO() & (ZEND_CALL_NESTED | ZEND_CALL_TOP | ZEND_CALL_RELEASE_THIS | ZEND_CALL_HAS_EXTRA_NAMED_PARAMS);
+       uint32_t num_args = EX_NUM_ARGS();
+       zend_execute_data *call;
+
+       SAVE_OPLINE();
+
+       if (num_args) {
+               zval *p = ZEND_CALL_ARG(execute_data, 1);
+               zval *end = p + num_args;
+
+               args = zend_new_array(num_args);
+               zend_hash_real_init_packed(args);
+               ZEND_HASH_FILL_PACKED(args) {
+                       do {
+                               ZEND_HASH_FILL_ADD(p);
+                               p++;
+                       } while (p != end);
+               } ZEND_HASH_FILL_END();
+       }
+
+       call = execute_data;
+       execute_data = EG(current_execute_data) = EX(prev_execute_data);
+
+       call->func = (fbc->op_array.fn_flags & ZEND_ACC_STATIC) ? fbc->op_array.scope->__callstatic : fbc->op_array.scope->__call;
+       ZEND_ASSERT(zend_vm_calc_used_stack(2, call->func) <= (size_t)(((char*)EG(vm_stack_end)) - (char*)call));
+       ZEND_CALL_NUM_ARGS(call) = 2;
+
+       ZVAL_STR(ZEND_CALL_ARG(call, 1), fbc->common.function_name);
+
+       zval *call_args = ZEND_CALL_ARG(call, 2);
+       if (args) {
+               ZVAL_ARR(call_args, args);
+       } else {
+               ZVAL_EMPTY_ARRAY(call_args);
+       }
+       if (UNEXPECTED(call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS)) {
+               if (zend_hash_num_elements(Z_ARRVAL_P(call_args)) == 0) {
+                       GC_ADDREF(call->extra_named_params);
+                       ZVAL_ARR(call_args, call->extra_named_params);
+               } else {
+                       SEPARATE_ARRAY(call_args);
+                       zend_hash_copy(Z_ARRVAL_P(call_args), call->extra_named_params, zval_add_ref);
+               }
+       }
+       zend_free_trampoline(fbc);
+       fbc = call->func;
+
+       if (EXPECTED(fbc->type == ZEND_USER_FUNCTION)) {
+               if (UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+                       init_func_run_time_cache(&fbc->op_array);
+               }
+               execute_data = call;
+               i_init_func_execute_data(&fbc->op_array, ret, 0 EXECUTE_DATA_CC);
+               zend_observer_maybe_fcall_call_begin(execute_data);
                if (EXPECTED(zend_execute_ex == execute_ex)) {
                        LOAD_OPLINE_EX();
                        ZEND_VM_ENTER_EX();
@@ -3691,6 +4322,80 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_
                        }
                }
        }
+
+       ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+       zval *return_value;
+
+       retval_ptr = RT_CONSTANT(opline, opline->op1);
+       return_value = EX(return_value);
+       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+               SAVE_OPLINE();
+               retval_ptr = ZVAL_UNDEFINED_OP1();
+               if (return_value) {
+                       ZVAL_NULL(return_value);
+               }
+       } else if (!return_value) {
+               if (IS_CONST & (IS_VAR|IS_TMP_VAR)) {
+                       if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
+                               SAVE_OPLINE();
+                               rc_dtor_func(Z_COUNTED_P(retval_ptr));
+                       }
+               }
+       } else {
+               if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
+                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       if (IS_CONST == IS_CONST) {
+                               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+                                       Z_ADDREF_P(return_value);
+                               }
+                       }
+               } else if (IS_CONST == IS_CV) {
+                       do {
+                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+                                               if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+                                                       zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+                                                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                                                       if (GC_MAY_LEAK(ref)) {
+                                                               gc_possible_root(ref);
+                                                       }
+                                                       ZVAL_NULL(retval_ptr);
+                                                       break;
+                                               } else {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       } else {
+                                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       }
+                               }
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       } while (0);
+               } else /* if (IS_CONST == IS_VAR) */ {
+                       if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                               zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                               if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                                       efree_size(ref, sizeof(zend_reference));
+                               } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       Z_ADDREF_P(retval_ptr);
+                               }
+                       } else {
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       }
+               }
+       }
+       zend_observer_maybe_fcall_call_end(execute_data, return_value);
        ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 }
 
@@ -3753,6 +4458,66 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPE
        ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 }
 
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+
+       SAVE_OPLINE();
+
+       do {
+               if ((IS_CONST & (IS_CONST|IS_TMP_VAR)) ||
+                   (IS_CONST == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) {
+                       /* Not supposed to happen, but we'll allow it */
+                       zend_error(E_NOTICE, "Only variable references should be returned by reference");
+
+                       retval_ptr = RT_CONSTANT(opline, opline->op1);
+                       if (!EX(return_value)) {
+
+                       } else {
+                               if (IS_CONST == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                                       ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
+                                       break;
+                               }
+
+                               ZVAL_NEW_REF(EX(return_value), retval_ptr);
+                               if (IS_CONST == IS_CONST) {
+                                       Z_TRY_ADDREF_P(retval_ptr);
+                               }
+                       }
+                       break;
+               }
+
+               retval_ptr = NULL;
+
+               if (IS_CONST == IS_VAR) {
+                       ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+                       if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
+                               zend_error(E_NOTICE, "Only variable references should be returned by reference");
+                               if (EX(return_value)) {
+                                       ZVAL_NEW_REF(EX(return_value), retval_ptr);
+                               } else {
+
+                               }
+                               break;
+                       }
+               }
+
+               if (EX(return_value)) {
+                       if (Z_ISREF_P(retval_ptr)) {
+                               Z_ADDREF_P(retval_ptr);
+                       } else {
+                               ZVAL_MAKE_REF_EX(retval_ptr, 2);
+                       }
+                       ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
+               }
+
+       } while (0);
+
+       zend_observer_maybe_fcall_call_end(execute_data, EX(return_value));
+       ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -3796,6 +4561,51 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CONST_HA
        ZEND_VM_RETURN();
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CONST_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval;
+
+       zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+
+       SAVE_OPLINE();
+       retval = RT_CONSTANT(opline, opline->op1);
+
+       /* Copy return value into generator->retval */
+       if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
+               ZVAL_COPY_VALUE(&generator->retval, retval);
+               if (IS_CONST == IS_CONST) {
+                       if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->retval))) {
+                               Z_ADDREF(generator->retval);
+                       }
+               }
+       } else if (IS_CONST == IS_CV) {
+               ZVAL_COPY_DEREF(&generator->retval, retval);
+       } else /* if (IS_CONST == IS_VAR) */ {
+               if (UNEXPECTED(Z_ISREF_P(retval))) {
+                       zend_refcounted *ref = Z_COUNTED_P(retval);
+
+                       retval = Z_REFVAL_P(retval);
+                       ZVAL_COPY_VALUE(&generator->retval, retval);
+                       if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                               efree_size(ref, sizeof(zend_reference));
+                       } else if (Z_OPT_REFCOUNTED_P(retval)) {
+                               Z_ADDREF_P(retval);
+                       }
+               } else {
+                       ZVAL_COPY_VALUE(&generator->retval, retval);
+               }
+       }
+
+       zend_observer_maybe_fcall_call_end(generator->execute_data, &generator->retval);
+
+       /* Close the generator to free up resources */
+       zend_generator_close(generator, 1);
+
+       /* Pass execution back to handling code */
+       ZEND_VM_RETURN();
+}
+
 static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -4087,8 +4897,77 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
        SAVE_OPLINE();
        inc_filename = RT_CONSTANT(opline, opline->op1);
        new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
+       if (UNEXPECTED(EG(exception) != NULL)) {
+
+               if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
+                       destroy_op_array(new_op_array);
+                       efree_size(new_op_array, sizeof(zend_op_array));
+               }
+               UNDEF_RESULT();
+               HANDLE_EXCEPTION();
+       } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_TRUE(EX_VAR(opline->result.var));
+               }
+       } else if (EXPECTED(new_op_array != NULL)) {
+               zval *return_value = NULL;
+               zend_execute_data *call;
+
+               if (RETURN_VALUE_USED(opline)) {
+                       return_value = EX_VAR(opline->result.var);
+               }
+
+               new_op_array->scope = EX(func)->op_array.scope;
 
+               call = zend_vm_stack_push_call_frame(
+                   (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+                       (zend_function*)new_op_array, 0,
+                       Z_PTR(EX(This)));
+
+               if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
+                       call->symbol_table = EX(symbol_table);
+               } else {
+                       call->symbol_table = zend_rebuild_symbol_table();
+               }
+
+               call->prev_execute_data = execute_data;
+               i_init_code_execute_data(call, new_op_array, return_value);
+
+               if (EXPECTED(zend_execute_ex == execute_ex)) {
+
+                       ZEND_VM_ENTER();
+               } else {
+                       ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
+                       zend_execute_ex(call);
+                       zend_vm_stack_free_call_frame(call);
+               }
+
+               destroy_op_array(new_op_array);
+               efree_size(new_op_array, sizeof(zend_op_array));
+               if (UNEXPECTED(EG(exception) != NULL)) {
+                       zend_rethrow_exception(execute_data);
+
+                       UNDEF_RESULT();
+                       HANDLE_EXCEPTION();
+               }
+       } else if (RETURN_VALUE_USED(opline)) {
+               ZVAL_FALSE(EX_VAR(opline->result.var));
+       }
+
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_op_array *new_op_array;
+       zval *inc_filename;
+
+       SAVE_OPLINE();
+       inc_filename = RT_CONSTANT(opline, opline->op1);
+       new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
        if (UNEXPECTED(EG(exception) != NULL)) {
+
                if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
                        destroy_op_array(new_op_array);
                        efree_size(new_op_array, sizeof(zend_op_array));
@@ -4122,7 +5001,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
 
                call->prev_execute_data = execute_data;
                i_init_code_execute_data(call, new_op_array, return_value);
+               zend_observer_maybe_fcall_call_begin(call);
                if (EXPECTED(zend_execute_ex == execute_ex)) {
+
                        ZEND_VM_ENTER();
                } else {
                        ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -4134,12 +5015,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
                efree_size(new_op_array, sizeof(zend_op_array));
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_rethrow_exception(execute_data);
+
                        UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
        } else if (RETURN_VALUE_USED(opline)) {
                ZVAL_FALSE(EX_VAR(opline->result.var));
        }
+
        ZEND_VM_NEXT_OPCODE();
 }
 
@@ -13575,8 +14458,77 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
        SAVE_OPLINE();
        inc_filename = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
        new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
+       if (UNEXPECTED(EG(exception) != NULL)) {
+               zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+               if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
+                       destroy_op_array(new_op_array);
+                       efree_size(new_op_array, sizeof(zend_op_array));
+               }
+               UNDEF_RESULT();
+               HANDLE_EXCEPTION();
+       } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_TRUE(EX_VAR(opline->result.var));
+               }
+       } else if (EXPECTED(new_op_array != NULL)) {
+               zval *return_value = NULL;
+               zend_execute_data *call;
+
+               if (RETURN_VALUE_USED(opline)) {
+                       return_value = EX_VAR(opline->result.var);
+               }
+
+               new_op_array->scope = EX(func)->op_array.scope;
+
+               call = zend_vm_stack_push_call_frame(
+                   (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+                       (zend_function*)new_op_array, 0,
+                       Z_PTR(EX(This)));
+
+               if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
+                       call->symbol_table = EX(symbol_table);
+               } else {
+                       call->symbol_table = zend_rebuild_symbol_table();
+               }
+
+               call->prev_execute_data = execute_data;
+               i_init_code_execute_data(call, new_op_array, return_value);
+
+               if (EXPECTED(zend_execute_ex == execute_ex)) {
+                       zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       ZEND_VM_ENTER();
+               } else {
+                       ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
+                       zend_execute_ex(call);
+                       zend_vm_stack_free_call_frame(call);
+               }
+
+               destroy_op_array(new_op_array);
+               efree_size(new_op_array, sizeof(zend_op_array));
+               if (UNEXPECTED(EG(exception) != NULL)) {
+                       zend_rethrow_exception(execute_data);
+                       zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       UNDEF_RESULT();
+                       HANDLE_EXCEPTION();
+               }
+       } else if (RETURN_VALUE_USED(opline)) {
+               ZVAL_FALSE(EX_VAR(opline->result.var));
+       }
        zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_op_array *new_op_array;
+       zval *inc_filename;
+
+       SAVE_OPLINE();
+       inc_filename = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
+       new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
        if (UNEXPECTED(EG(exception) != NULL)) {
+               zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
                if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
                        destroy_op_array(new_op_array);
                        efree_size(new_op_array, sizeof(zend_op_array));
@@ -13610,7 +14562,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
 
                call->prev_execute_data = execute_data;
                i_init_code_execute_data(call, new_op_array, return_value);
+               zend_observer_maybe_fcall_call_begin(call);
                if (EXPECTED(zend_execute_ex == execute_ex)) {
+                       zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
                        ZEND_VM_ENTER();
                } else {
                        ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -13622,12 +14576,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
                efree_size(new_op_array, sizeof(zend_op_array));
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_rethrow_exception(execute_data);
+                       zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
                        UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
        } else if (RETURN_VALUE_USED(opline)) {
                ZVAL_FALSE(EX_VAR(opline->result.var));
        }
+       zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
        ZEND_VM_NEXT_OPCODE();
 }
 
@@ -17931,6 +18887,80 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HA
                        }
                }
        }
+
+       ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+       zval *return_value;
+
+       retval_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
+       return_value = EX(return_value);
+       if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+               SAVE_OPLINE();
+               retval_ptr = ZVAL_UNDEFINED_OP1();
+               if (return_value) {
+                       ZVAL_NULL(return_value);
+               }
+       } else if (!return_value) {
+               if (IS_TMP_VAR & (IS_VAR|IS_TMP_VAR)) {
+                       if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
+                               SAVE_OPLINE();
+                               rc_dtor_func(Z_COUNTED_P(retval_ptr));
+                       }
+               }
+       } else {
+               if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
+                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       if (IS_TMP_VAR == IS_CONST) {
+                               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+                                       Z_ADDREF_P(return_value);
+                               }
+                       }
+               } else if (IS_TMP_VAR == IS_CV) {
+                       do {
+                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+                                               if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+                                                       zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+                                                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                                                       if (GC_MAY_LEAK(ref)) {
+                                                               gc_possible_root(ref);
+                                                       }
+                                                       ZVAL_NULL(retval_ptr);
+                                                       break;
+                                               } else {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       } else {
+                                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       }
+                               }
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       } while (0);
+               } else /* if (IS_TMP_VAR == IS_VAR) */ {
+                       if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                               zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                               if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                                       efree_size(ref, sizeof(zend_reference));
+                               } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       Z_ADDREF_P(retval_ptr);
+                               }
+                       } else {
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       }
+               }
+       }
+       zend_observer_maybe_fcall_call_end(execute_data, return_value);
        ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 }
 
@@ -17993,6 +19023,66 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER
        ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 }
 
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+
+       SAVE_OPLINE();
+
+       do {
+               if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR)) ||
+                   (IS_TMP_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) {
+                       /* Not supposed to happen, but we'll allow it */
+                       zend_error(E_NOTICE, "Only variable references should be returned by reference");
+
+                       retval_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
+                       if (!EX(return_value)) {
+                               zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       } else {
+                               if (IS_TMP_VAR == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                                       ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
+                                       break;
+                               }
+
+                               ZVAL_NEW_REF(EX(return_value), retval_ptr);
+                               if (IS_TMP_VAR == IS_CONST) {
+                                       Z_TRY_ADDREF_P(retval_ptr);
+                               }
+                       }
+                       break;
+               }
+
+               retval_ptr = NULL;
+
+               if (IS_TMP_VAR == IS_VAR) {
+                       ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+                       if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
+                               zend_error(E_NOTICE, "Only variable references should be returned by reference");
+                               if (EX(return_value)) {
+                                       ZVAL_NEW_REF(EX(return_value), retval_ptr);
+                               } else {
+
+                               }
+                               break;
+                       }
+               }
+
+               if (EX(return_value)) {
+                       if (Z_ISREF_P(retval_ptr)) {
+                               Z_ADDREF_P(retval_ptr);
+                       } else {
+                               ZVAL_MAKE_REF_EX(retval_ptr, 2);
+                       }
+                       ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
+               }
+
+       } while (0);
+
+       zend_observer_maybe_fcall_call_end(execute_data, EX(return_value));
+       ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -18036,6 +19126,51 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_TMP_HAND
        ZEND_VM_RETURN();
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_TMP_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval;
+
+       zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+
+       SAVE_OPLINE();
+       retval = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
+
+       /* Copy return value into generator->retval */
+       if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
+               ZVAL_COPY_VALUE(&generator->retval, retval);
+               if (IS_TMP_VAR == IS_CONST) {
+                       if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->retval))) {
+                               Z_ADDREF(generator->retval);
+                       }
+               }
+       } else if (IS_TMP_VAR == IS_CV) {
+               ZVAL_COPY_DEREF(&generator->retval, retval);
+       } else /* if (IS_TMP_VAR == IS_VAR) */ {
+               if (UNEXPECTED(Z_ISREF_P(retval))) {
+                       zend_refcounted *ref = Z_COUNTED_P(retval);
+
+                       retval = Z_REFVAL_P(retval);
+                       ZVAL_COPY_VALUE(&generator->retval, retval);
+                       if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                               efree_size(ref, sizeof(zend_reference));
+                       } else if (Z_OPT_REFCOUNTED_P(retval)) {
+                               Z_ADDREF_P(retval);
+                       }
+               } else {
+                       ZVAL_COPY_VALUE(&generator->retval, retval);
+               }
+       }
+
+       zend_observer_maybe_fcall_call_end(generator->execute_data, &generator->retval);
+
+       /* Close the generator to free up resources */
+       zend_generator_close(generator, 1);
+
+       /* Pass execution back to handling code */
+       ZEND_VM_RETURN();
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -20477,6 +21612,80 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HA
                        }
                }
        }
+
+       ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+       zval *return_value;
+
+       retval_ptr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
+       return_value = EX(return_value);
+       if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+               SAVE_OPLINE();
+               retval_ptr = ZVAL_UNDEFINED_OP1();
+               if (return_value) {
+                       ZVAL_NULL(return_value);
+               }
+       } else if (!return_value) {
+               if (IS_VAR & (IS_VAR|IS_TMP_VAR)) {
+                       if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
+                               SAVE_OPLINE();
+                               rc_dtor_func(Z_COUNTED_P(retval_ptr));
+                       }
+               }
+       } else {
+               if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
+                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       if (IS_VAR == IS_CONST) {
+                               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+                                       Z_ADDREF_P(return_value);
+                               }
+                       }
+               } else if (IS_VAR == IS_CV) {
+                       do {
+                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+                                               if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+                                                       zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+                                                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                                                       if (GC_MAY_LEAK(ref)) {
+                                                               gc_possible_root(ref);
+                                                       }
+                                                       ZVAL_NULL(retval_ptr);
+                                                       break;
+                                               } else {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       } else {
+                                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       }
+                               }
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       } while (0);
+               } else /* if (IS_VAR == IS_VAR) */ {
+                       if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                               zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                               if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                                       efree_size(ref, sizeof(zend_reference));
+                               } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       Z_ADDREF_P(retval_ptr);
+                               }
+                       } else {
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       }
+               }
+       }
+       zend_observer_maybe_fcall_call_end(execute_data, return_value);
        ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 }
 
@@ -20540,6 +21749,67 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER
        ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 }
 
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+
+       SAVE_OPLINE();
+
+       do {
+               if ((IS_VAR & (IS_CONST|IS_TMP_VAR)) ||
+                   (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) {
+                       /* Not supposed to happen, but we'll allow it */
+                       zend_error(E_NOTICE, "Only variable references should be returned by reference");
+
+                       retval_ptr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
+                       if (!EX(return_value)) {
+                               zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                       } else {
+                               if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                                       ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
+                                       break;
+                               }
+
+                               ZVAL_NEW_REF(EX(return_value), retval_ptr);
+                               if (IS_VAR == IS_CONST) {
+                                       Z_TRY_ADDREF_P(retval_ptr);
+                               }
+                       }
+                       break;
+               }
+
+               retval_ptr = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
+
+               if (IS_VAR == IS_VAR) {
+                       ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+                       if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
+                               zend_error(E_NOTICE, "Only variable references should be returned by reference");
+                               if (EX(return_value)) {
+                                       ZVAL_NEW_REF(EX(return_value), retval_ptr);
+                               } else {
+                                       zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+                               }
+                               break;
+                       }
+               }
+
+               if (EX(return_value)) {
+                       if (Z_ISREF_P(retval_ptr)) {
+                               Z_ADDREF_P(retval_ptr);
+                       } else {
+                               ZVAL_MAKE_REF_EX(retval_ptr, 2);
+                       }
+                       ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
+               }
+
+               zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+       } while (0);
+
+       zend_observer_maybe_fcall_call_end(execute_data, EX(return_value));
+       ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -20583,6 +21853,51 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_VAR_HAND
        ZEND_VM_RETURN();
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_VAR_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval;
+
+       zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+
+       SAVE_OPLINE();
+       retval = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
+
+       /* Copy return value into generator->retval */
+       if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
+               ZVAL_COPY_VALUE(&generator->retval, retval);
+               if (IS_VAR == IS_CONST) {
+                       if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->retval))) {
+                               Z_ADDREF(generator->retval);
+                       }
+               }
+       } else if (IS_VAR == IS_CV) {
+               ZVAL_COPY_DEREF(&generator->retval, retval);
+       } else /* if (IS_VAR == IS_VAR) */ {
+               if (UNEXPECTED(Z_ISREF_P(retval))) {
+                       zend_refcounted *ref = Z_COUNTED_P(retval);
+
+                       retval = Z_REFVAL_P(retval);
+                       ZVAL_COPY_VALUE(&generator->retval, retval);
+                       if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                               efree_size(ref, sizeof(zend_reference));
+                       } else if (Z_OPT_REFCOUNTED_P(retval)) {
+                               Z_ADDREF_P(retval);
+                       }
+               } else {
+                       ZVAL_COPY_VALUE(&generator->retval, retval);
+               }
+       }
+
+       zend_observer_maybe_fcall_call_end(generator->execute_data, &generator->retval);
+
+       /* Close the generator to free up resources */
+       zend_generator_close(generator, 1);
+
+       /* Pass execution back to handling code */
+       ZEND_VM_RETURN();
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -36991,6 +38306,80 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HAN
                        }
                }
        }
+
+       ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+       zval *return_value;
+
+       retval_ptr = EX_VAR(opline->op1.var);
+       return_value = EX(return_value);
+       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+               SAVE_OPLINE();
+               retval_ptr = ZVAL_UNDEFINED_OP1();
+               if (return_value) {
+                       ZVAL_NULL(return_value);
+               }
+       } else if (!return_value) {
+               if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
+                       if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
+                               SAVE_OPLINE();
+                               rc_dtor_func(Z_COUNTED_P(retval_ptr));
+                       }
+               }
+       } else {
+               if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
+                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       if (IS_CV == IS_CONST) {
+                               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+                                       Z_ADDREF_P(return_value);
+                               }
+                       }
+               } else if (IS_CV == IS_CV) {
+                       do {
+                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+                                               if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+                                                       zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+                                                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                                                       if (GC_MAY_LEAK(ref)) {
+                                                               gc_possible_root(ref);
+                                                       }
+                                                       ZVAL_NULL(retval_ptr);
+                                                       break;
+                                               } else {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       } else {
+                                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       }
+                               }
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       } while (0);
+               } else /* if (IS_CV == IS_VAR) */ {
+                       if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                               zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                               if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                                       efree_size(ref, sizeof(zend_reference));
+                               } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       Z_ADDREF_P(retval_ptr);
+                               }
+                       } else {
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       }
+               }
+       }
+       zend_observer_maybe_fcall_call_end(execute_data, return_value);
        ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 }
 
@@ -37053,6 +38442,66 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(
        ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
 }
 
+static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+
+       SAVE_OPLINE();
+
+       do {
+               if ((IS_CV & (IS_CONST|IS_TMP_VAR)) ||
+                   (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_VALUE)) {
+                       /* Not supposed to happen, but we'll allow it */
+                       zend_error(E_NOTICE, "Only variable references should be returned by reference");
+
+                       retval_ptr = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+                       if (!EX(return_value)) {
+
+                       } else {
+                               if (IS_CV == IS_VAR && UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                                       ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
+                                       break;
+                               }
+
+                               ZVAL_NEW_REF(EX(return_value), retval_ptr);
+                               if (IS_CV == IS_CONST) {
+                                       Z_TRY_ADDREF_P(retval_ptr);
+                               }
+                       }
+                       break;
+               }
+
+               retval_ptr = _get_zval_ptr_cv_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
+
+               if (IS_CV == IS_VAR) {
+                       ZEND_ASSERT(retval_ptr != &EG(uninitialized_zval));
+                       if (opline->extended_value == ZEND_RETURNS_FUNCTION && !Z_ISREF_P(retval_ptr)) {
+                               zend_error(E_NOTICE, "Only variable references should be returned by reference");
+                               if (EX(return_value)) {
+                                       ZVAL_NEW_REF(EX(return_value), retval_ptr);
+                               } else {
+
+                               }
+                               break;
+                       }
+               }
+
+               if (EX(return_value)) {
+                       if (Z_ISREF_P(retval_ptr)) {
+                               Z_ADDREF_P(retval_ptr);
+                       } else {
+                               ZVAL_MAKE_REF_EX(retval_ptr, 2);
+                       }
+                       ZVAL_REF(EX(return_value), Z_REF_P(retval_ptr));
+               }
+
+       } while (0);
+
+       zend_observer_maybe_fcall_call_end(execute_data, EX(return_value));
+       ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -37096,6 +38545,51 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CV_HANDL
        ZEND_VM_RETURN();
 }
 
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_CV_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zval *retval;
+
+       zend_generator *generator = zend_get_running_generator(EXECUTE_DATA_C);
+
+       SAVE_OPLINE();
+       retval = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+
+       /* Copy return value into generator->retval */
+       if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
+               ZVAL_COPY_VALUE(&generator->retval, retval);
+               if (IS_CV == IS_CONST) {
+                       if (UNEXPECTED(Z_OPT_REFCOUNTED(generator->retval))) {
+                               Z_ADDREF(generator->retval);
+                       }
+               }
+       } else if (IS_CV == IS_CV) {
+               ZVAL_COPY_DEREF(&generator->retval, retval);
+       } else /* if (IS_CV == IS_VAR) */ {
+               if (UNEXPECTED(Z_ISREF_P(retval))) {
+                       zend_refcounted *ref = Z_COUNTED_P(retval);
+
+                       retval = Z_REFVAL_P(retval);
+                       ZVAL_COPY_VALUE(&generator->retval, retval);
+                       if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                               efree_size(ref, sizeof(zend_reference));
+                       } else if (Z_OPT_REFCOUNTED_P(retval)) {
+                               Z_ADDREF_P(retval);
+                       }
+               } else {
+                       ZVAL_COPY_VALUE(&generator->retval, retval);
+               }
+       }
+
+       zend_observer_maybe_fcall_call_end(generator->execute_data, &generator->retval);
+
+       /* Close the generator to free up resources */
+       zend_generator_close(generator, 1);
+
+       /* Pass execution back to handling code */
+       ZEND_VM_RETURN();
+}
+
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
@@ -37336,8 +38830,77 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
        SAVE_OPLINE();
        inc_filename = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
        new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
+       if (UNEXPECTED(EG(exception) != NULL)) {
+
+               if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
+                       destroy_op_array(new_op_array);
+                       efree_size(new_op_array, sizeof(zend_op_array));
+               }
+               UNDEF_RESULT();
+               HANDLE_EXCEPTION();
+       } else if (new_op_array == ZEND_FAKE_OP_ARRAY) {
+               if (RETURN_VALUE_USED(opline)) {
+                       ZVAL_TRUE(EX_VAR(opline->result.var));
+               }
+       } else if (EXPECTED(new_op_array != NULL)) {
+               zval *return_value = NULL;
+               zend_execute_data *call;
+
+               if (RETURN_VALUE_USED(opline)) {
+                       return_value = EX_VAR(opline->result.var);
+               }
 
+               new_op_array->scope = EX(func)->op_array.scope;
+
+               call = zend_vm_stack_push_call_frame(
+                   (Z_TYPE_INFO(EX(This)) & ZEND_CALL_HAS_THIS) | ZEND_CALL_NESTED_CODE | ZEND_CALL_HAS_SYMBOL_TABLE,
+                       (zend_function*)new_op_array, 0,
+                       Z_PTR(EX(This)));
+
+               if (EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE) {
+                       call->symbol_table = EX(symbol_table);
+               } else {
+                       call->symbol_table = zend_rebuild_symbol_table();
+               }
+
+               call->prev_execute_data = execute_data;
+               i_init_code_execute_data(call, new_op_array, return_value);
+
+               if (EXPECTED(zend_execute_ex == execute_ex)) {
+
+                       ZEND_VM_ENTER();
+               } else {
+                       ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
+                       zend_execute_ex(call);
+                       zend_vm_stack_free_call_frame(call);
+               }
+
+               destroy_op_array(new_op_array);
+               efree_size(new_op_array, sizeof(zend_op_array));
+               if (UNEXPECTED(EG(exception) != NULL)) {
+                       zend_rethrow_exception(execute_data);
+
+                       UNDEF_RESULT();
+                       HANDLE_EXCEPTION();
+               }
+       } else if (RETURN_VALUE_USED(opline)) {
+               ZVAL_FALSE(EX_VAR(opline->result.var));
+       }
+
+       ZEND_VM_NEXT_OPCODE();
+}
+
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+       USE_OPLINE
+       zend_op_array *new_op_array;
+       zval *inc_filename;
+
+       SAVE_OPLINE();
+       inc_filename = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
+       new_op_array = zend_include_or_eval(inc_filename, opline->extended_value);
        if (UNEXPECTED(EG(exception) != NULL)) {
+
                if (new_op_array != ZEND_FAKE_OP_ARRAY && new_op_array != NULL) {
                        destroy_op_array(new_op_array);
                        efree_size(new_op_array, sizeof(zend_op_array));
@@ -37371,7 +38934,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
 
                call->prev_execute_data = execute_data;
                i_init_code_execute_data(call, new_op_array, return_value);
+               zend_observer_maybe_fcall_call_begin(call);
                if (EXPECTED(zend_execute_ex == execute_ex)) {
+
                        ZEND_VM_ENTER();
                } else {
                        ZEND_ADD_CALL_FLAG(call, ZEND_CALL_TOP);
@@ -37383,12 +38948,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
                efree_size(new_op_array, sizeof(zend_op_array));
                if (UNEXPECTED(EG(exception) != NULL)) {
                        zend_rethrow_exception(execute_data);
+
                        UNDEF_RESULT();
                        HANDLE_EXCEPTION();
                }
        } else if (RETURN_VALUE_USED(opline)) {
                ZVAL_FALSE(EX_VAR(opline->result.var));
        }
+
        ZEND_VM_NEXT_OPCODE();
 }
 
@@ -51443,12 +53010,19 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_LABEL,
                        (void*)&&ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_LABEL,
                        (void*)&&ZEND_DO_FCALL_SPEC_RETVAL_USED_LABEL,
+                       (void*)&&ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_OBSERVER_LABEL,
+                       (void*)&&ZEND_DO_FCALL_SPEC_RETVAL_USED_OBSERVER_LABEL,
                        (void*)&&ZEND_INIT_FCALL_SPEC_CONST_LABEL,
                        (void*)&&ZEND_RETURN_SPEC_CONST_LABEL,
+                       (void*)&&ZEND_RETURN_SPEC_CONST_OBSERVER_LABEL,
                        (void*)&&ZEND_RETURN_SPEC_TMP_LABEL,
+                       (void*)&&ZEND_RETURN_SPEC_TMP_OBSERVER_LABEL,
                        (void*)&&ZEND_RETURN_SPEC_VAR_LABEL,
+                       (void*)&&ZEND_RETURN_SPEC_VAR_OBSERVER_LABEL,
+                       (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_RETURN_SPEC_CV_LABEL,
+                       (void*)&&ZEND_RETURN_SPEC_CV_OBSERVER_LABEL,
                        (void*)&&ZEND_RECV_SPEC_UNUSED_LABEL,
                        (void*)&&ZEND_RECV_INIT_SPEC_CONST_LABEL,
                        (void*)&&ZEND_SEND_VAL_SPEC_CONST_CONST_LABEL,
@@ -51609,10 +53183,15 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_LABEL,
                        (void*)&&ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_LABEL,
                        (void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_CONST_LABEL,
+                       (void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_CONST_OBSERVER_LABEL,
                        (void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_LABEL,
+                       (void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER_LABEL,
                        (void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_LABEL,
+                       (void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER_LABEL,
+                       (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_CV_LABEL,
+                       (void*)&&ZEND_INCLUDE_OR_EVAL_SPEC_CV_OBSERVER_LABEL,
                        (void*)&&ZEND_UNSET_VAR_SPEC_CONST_UNUSED_LABEL,
                        (void*)&&ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_LABEL,
                        (void*)&&ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_LABEL,
@@ -52068,10 +53647,15 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_CLONE_SPEC_UNUSED_LABEL,
                        (void*)&&ZEND_CLONE_SPEC_CV_LABEL,
                        (void*)&&ZEND_RETURN_BY_REF_SPEC_CONST_LABEL,
+                       (void*)&&ZEND_RETURN_BY_REF_SPEC_CONST_OBSERVER_LABEL,
                        (void*)&&ZEND_RETURN_BY_REF_SPEC_TMP_LABEL,
+                       (void*)&&ZEND_RETURN_BY_REF_SPEC_TMP_OBSERVER_LABEL,
                        (void*)&&ZEND_RETURN_BY_REF_SPEC_VAR_LABEL,
+                       (void*)&&ZEND_RETURN_BY_REF_SPEC_VAR_OBSERVER_LABEL,
+                       (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_RETURN_BY_REF_SPEC_CV_LABEL,
+                       (void*)&&ZEND_RETURN_BY_REF_SPEC_CV_OBSERVER_LABEL,
                        (void*)&&ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST_LABEL,
                        (void*)&&ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_LABEL,
                        (void*)&&ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_LABEL,
@@ -52270,8 +53854,12 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_DO_ICALL_SPEC_RETVAL_USED_LABEL,
                        (void*)&&ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_LABEL,
                        (void*)&&ZEND_DO_UCALL_SPEC_RETVAL_USED_LABEL,
+                       (void*)&&ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_OBSERVER_LABEL,
+                       (void*)&&ZEND_DO_UCALL_SPEC_RETVAL_USED_OBSERVER_LABEL,
                        (void*)&&ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_LABEL,
                        (void*)&&ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_LABEL,
+                       (void*)&&ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_OBSERVER_LABEL,
+                       (void*)&&ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_OBSERVER_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
@@ -52392,6 +53980,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_LABEL,
                        (void*)&&ZEND_HANDLE_EXCEPTION_SPEC_LABEL,
+                       (void*)&&ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER_LABEL,
                        (void*)&&ZEND_USER_OPCODE_SPEC_LABEL,
                        (void*)&&ZEND_ASSERT_CHECK_SPEC_LABEL,
                        (void*)&&ZEND_JMP_SET_SPEC_CONST_LABEL,
@@ -52414,6 +54003,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_LABEL,
                        (void*)&&ZEND_FETCH_CLASS_NAME_SPEC_CV_LABEL,
                        (void*)&&ZEND_CALL_TRAMPOLINE_SPEC_LABEL,
+                       (void*)&&ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER_LABEL,
                        (void*)&&ZEND_DISCARD_EXCEPTION_SPEC_LABEL,
                        (void*)&&ZEND_YIELD_SPEC_CONST_CONST_LABEL,
                        (void*)&&ZEND_YIELD_SPEC_CONST_TMPVAR_LABEL,
@@ -52441,10 +54031,15 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_YIELD_SPEC_CV_UNUSED_LABEL,
                        (void*)&&ZEND_YIELD_SPEC_CV_CV_LABEL,
                        (void*)&&ZEND_GENERATOR_RETURN_SPEC_CONST_LABEL,
+                       (void*)&&ZEND_GENERATOR_RETURN_SPEC_CONST_OBSERVER_LABEL,
                        (void*)&&ZEND_GENERATOR_RETURN_SPEC_TMP_LABEL,
+                       (void*)&&ZEND_GENERATOR_RETURN_SPEC_TMP_OBSERVER_LABEL,
                        (void*)&&ZEND_GENERATOR_RETURN_SPEC_VAR_LABEL,
+                       (void*)&&ZEND_GENERATOR_RETURN_SPEC_VAR_OBSERVER_LABEL,
+                       (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_GENERATOR_RETURN_SPEC_CV_LABEL,
+                       (void*)&&ZEND_GENERATOR_RETURN_SPEC_CV_OBSERVER_LABEL,
                        (void*)&&ZEND_FAST_CALL_SPEC_LABEL,
                        (void*)&&ZEND_FAST_RET_SPEC_LABEL,
                        (void*)&&ZEND_RECV_VARIADIC_SPEC_UNUSED_LABEL,
@@ -53741,6 +55336,14 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_DO_UCALL_SPEC_RETVAL_USED)
                                ZEND_DO_UCALL_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_OBSERVER):
+                               VM_TRACE(ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_OBSERVER)
+                               ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_DO_UCALL_SPEC_RETVAL_USED_OBSERVER):
+                               VM_TRACE(ZEND_DO_UCALL_SPEC_RETVAL_USED_OBSERVER)
+                               ZEND_DO_UCALL_SPEC_RETVAL_USED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED):
                                VM_TRACE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED)
                                ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -53749,6 +55352,14 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED)
                                ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_OBSERVER):
+                               VM_TRACE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_OBSERVER)
+                               ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_OBSERVER):
+                               VM_TRACE(ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_OBSERVER)
+                               ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_DO_FCALL_SPEC_RETVAL_UNUSED):
                                VM_TRACE(ZEND_DO_FCALL_SPEC_RETVAL_UNUSED)
                                ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -53757,6 +55368,14 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_DO_FCALL_SPEC_RETVAL_USED)
                                ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_OBSERVER):
+                               VM_TRACE(ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_OBSERVER)
+                               ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_DO_FCALL_SPEC_RETVAL_USED_OBSERVER):
+                               VM_TRACE(ZEND_DO_FCALL_SPEC_RETVAL_USED_OBSERVER)
+                               ZEND_DO_FCALL_SPEC_RETVAL_USED_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_GENERATOR_CREATE_SPEC):
                                VM_TRACE(ZEND_GENERATOR_CREATE_SPEC)
                                ZEND_GENERATOR_CREATE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -53829,6 +55448,10 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_HANDLE_EXCEPTION_SPEC)
                                ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER):
+                               VM_TRACE(ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER)
+                               ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_USER_OPCODE_SPEC):
                                VM_TRACE(ZEND_USER_OPCODE_SPEC)
                                ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -53853,6 +55476,10 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_CALL_TRAMPOLINE_SPEC)
                                ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER):
+                               VM_TRACE(ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER)
+                               ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_JMP_FORWARD_SPEC):
                                VM_TRACE(ZEND_JMP_FORWARD_SPEC)
                                ZEND_JMP_FORWARD_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -53995,6 +55622,81 @@ zend_leave_helper_SPEC_LABEL:
                        }
                }
        }
+
+       goto zend_leave_helper_SPEC_LABEL;
+}
+
+                       HYBRID_CASE(ZEND_RETURN_SPEC_CONST_OBSERVER):
+                               VM_TRACE(ZEND_RETURN_SPEC_CONST_OBSERVER)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+       zval *return_value;
+
+       retval_ptr = RT_CONSTANT(opline, opline->op1);
+       return_value = EX(return_value);
+       if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+               SAVE_OPLINE();
+               retval_ptr = ZVAL_UNDEFINED_OP1();
+               if (return_value) {
+                       ZVAL_NULL(return_value);
+               }
+       } else if (!return_value) {
+               if (IS_CONST & (IS_VAR|IS_TMP_VAR)) {
+                       if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
+                               SAVE_OPLINE();
+                               rc_dtor_func(Z_COUNTED_P(retval_ptr));
+                       }
+               }
+       } else {
+               if ((IS_CONST & (IS_CONST|IS_TMP_VAR))) {
+                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       if (IS_CONST == IS_CONST) {
+                               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+                                       Z_ADDREF_P(return_value);
+                               }
+                       }
+               } else if (IS_CONST == IS_CV) {
+                       do {
+                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+                                               if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+                                                       zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+                                                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                                                       if (GC_MAY_LEAK(ref)) {
+                                                               gc_possible_root(ref);
+                                                       }
+                                                       ZVAL_NULL(retval_ptr);
+                                                       break;
+                                               } else {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       } else {
+                                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       }
+                               }
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       } while (0);
+               } else /* if (IS_CONST == IS_VAR) */ {
+                       if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                               zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                               if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                                       efree_size(ref, sizeof(zend_reference));
+                               } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       Z_ADDREF_P(retval_ptr);
+                               }
+                       } else {
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       }
+               }
+       }
+       zend_observer_maybe_fcall_call_end(execute_data, return_value);
        goto zend_leave_helper_SPEC_LABEL;
 }
 
@@ -54002,10 +55704,18 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_RETURN_BY_REF_SPEC_CONST)
                                ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_RETURN_BY_REF_SPEC_CONST_OBSERVER):
+                               VM_TRACE(ZEND_RETURN_BY_REF_SPEC_CONST_OBSERVER)
+                               ZEND_RETURN_BY_REF_SPEC_CONST_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_CONST):
                                VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_CONST)
                                ZEND_GENERATOR_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_CONST_OBSERVER):
+                               VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_CONST_OBSERVER)
+                               ZEND_GENERATOR_RETURN_SPEC_CONST_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_THROW_SPEC_CONST):
                                VM_TRACE(ZEND_THROW_SPEC_CONST)
                                ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -54034,6 +55744,10 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_CONST)
                                ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_INCLUDE_OR_EVAL_SPEC_CONST_OBSERVER):
+                               VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_CONST_OBSERVER)
+                               ZEND_INCLUDE_OR_EVAL_SPEC_CONST_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_FE_RESET_R_SPEC_CONST):
                                VM_TRACE(ZEND_FE_RESET_R_SPEC_CONST)
                                ZEND_FE_RESET_R_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -55134,6 +56848,10 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR)
                                ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER):
+                               VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER)
+                               ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_YIELD_FROM_SPEC_TMPVAR):
                                VM_TRACE(ZEND_YIELD_FROM_SPEC_TMPVAR)
                                ZEND_YIELD_FROM_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -55516,6 +57234,81 @@ zend_leave_helper_SPEC_LABEL:
                        }
                }
        }
+
+       goto zend_leave_helper_SPEC_LABEL;
+}
+
+                       HYBRID_CASE(ZEND_RETURN_SPEC_TMP_OBSERVER):
+                               VM_TRACE(ZEND_RETURN_SPEC_TMP_OBSERVER)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+       zval *return_value;
+
+       retval_ptr = _get_zval_ptr_tmp(opline->op1.var EXECUTE_DATA_CC);
+       return_value = EX(return_value);
+       if (IS_TMP_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+               SAVE_OPLINE();
+               retval_ptr = ZVAL_UNDEFINED_OP1();
+               if (return_value) {
+                       ZVAL_NULL(return_value);
+               }
+       } else if (!return_value) {
+               if (IS_TMP_VAR & (IS_VAR|IS_TMP_VAR)) {
+                       if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
+                               SAVE_OPLINE();
+                               rc_dtor_func(Z_COUNTED_P(retval_ptr));
+                       }
+               }
+       } else {
+               if ((IS_TMP_VAR & (IS_CONST|IS_TMP_VAR))) {
+                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       if (IS_TMP_VAR == IS_CONST) {
+                               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+                                       Z_ADDREF_P(return_value);
+                               }
+                       }
+               } else if (IS_TMP_VAR == IS_CV) {
+                       do {
+                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+                                               if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+                                                       zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+                                                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                                                       if (GC_MAY_LEAK(ref)) {
+                                                               gc_possible_root(ref);
+                                                       }
+                                                       ZVAL_NULL(retval_ptr);
+                                                       break;
+                                               } else {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       } else {
+                                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       }
+                               }
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       } while (0);
+               } else /* if (IS_TMP_VAR == IS_VAR) */ {
+                       if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                               zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                               if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                                       efree_size(ref, sizeof(zend_reference));
+                               } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       Z_ADDREF_P(retval_ptr);
+                               }
+                       } else {
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       }
+               }
+       }
+       zend_observer_maybe_fcall_call_end(execute_data, return_value);
        goto zend_leave_helper_SPEC_LABEL;
 }
 
@@ -55523,10 +57316,18 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_RETURN_BY_REF_SPEC_TMP)
                                ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_RETURN_BY_REF_SPEC_TMP_OBSERVER):
+                               VM_TRACE(ZEND_RETURN_BY_REF_SPEC_TMP_OBSERVER)
+                               ZEND_RETURN_BY_REF_SPEC_TMP_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_TMP):
                                VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_TMP)
                                ZEND_GENERATOR_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_TMP_OBSERVER):
+                               VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_TMP_OBSERVER)
+                               ZEND_GENERATOR_RETURN_SPEC_TMP_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_SEND_USER_SPEC_TMP):
                                VM_TRACE(ZEND_SEND_USER_SPEC_TMP)
                                ZEND_SEND_USER_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -55813,6 +57614,81 @@ zend_leave_helper_SPEC_LABEL:
                        }
                }
        }
+
+       goto zend_leave_helper_SPEC_LABEL;
+}
+
+                       HYBRID_CASE(ZEND_RETURN_SPEC_VAR_OBSERVER):
+                               VM_TRACE(ZEND_RETURN_SPEC_VAR_OBSERVER)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+       zval *return_value;
+
+       retval_ptr = _get_zval_ptr_var(opline->op1.var EXECUTE_DATA_CC);
+       return_value = EX(return_value);
+       if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+               SAVE_OPLINE();
+               retval_ptr = ZVAL_UNDEFINED_OP1();
+               if (return_value) {
+                       ZVAL_NULL(return_value);
+               }
+       } else if (!return_value) {
+               if (IS_VAR & (IS_VAR|IS_TMP_VAR)) {
+                       if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
+                               SAVE_OPLINE();
+                               rc_dtor_func(Z_COUNTED_P(retval_ptr));
+                       }
+               }
+       } else {
+               if ((IS_VAR & (IS_CONST|IS_TMP_VAR))) {
+                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       if (IS_VAR == IS_CONST) {
+                               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+                                       Z_ADDREF_P(return_value);
+                               }
+                       }
+               } else if (IS_VAR == IS_CV) {
+                       do {
+                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+                                               if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+                                                       zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+                                                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                                                       if (GC_MAY_LEAK(ref)) {
+                                                               gc_possible_root(ref);
+                                                       }
+                                                       ZVAL_NULL(retval_ptr);
+                                                       break;
+                                               } else {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       } else {
+                                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       }
+                               }
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       } while (0);
+               } else /* if (IS_VAR == IS_VAR) */ {
+                       if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                               zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                               if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                                       efree_size(ref, sizeof(zend_reference));
+                               } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       Z_ADDREF_P(retval_ptr);
+                               }
+                       } else {
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       }
+               }
+       }
+       zend_observer_maybe_fcall_call_end(execute_data, return_value);
        goto zend_leave_helper_SPEC_LABEL;
 }
 
@@ -55820,10 +57696,18 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_RETURN_BY_REF_SPEC_VAR)
                                ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_RETURN_BY_REF_SPEC_VAR_OBSERVER):
+                               VM_TRACE(ZEND_RETURN_BY_REF_SPEC_VAR_OBSERVER)
+                               ZEND_RETURN_BY_REF_SPEC_VAR_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_VAR):
                                VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_VAR)
                                ZEND_GENERATOR_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_VAR_OBSERVER):
+                               VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_VAR_OBSERVER)
+                               ZEND_GENERATOR_RETURN_SPEC_VAR_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_SEND_USER_SPEC_VAR):
                                VM_TRACE(ZEND_SEND_USER_SPEC_VAR)
                                ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -56926,6 +58810,81 @@ zend_leave_helper_SPEC_LABEL:
                        }
                }
        }
+
+       goto zend_leave_helper_SPEC_LABEL;
+}
+
+                       HYBRID_CASE(ZEND_RETURN_SPEC_CV_OBSERVER):
+                               VM_TRACE(ZEND_RETURN_SPEC_CV_OBSERVER)
+{
+       USE_OPLINE
+       zval *retval_ptr;
+       zval *return_value;
+
+       retval_ptr = EX_VAR(opline->op1.var);
+       return_value = EX(return_value);
+       if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) {
+               SAVE_OPLINE();
+               retval_ptr = ZVAL_UNDEFINED_OP1();
+               if (return_value) {
+                       ZVAL_NULL(return_value);
+               }
+       } else if (!return_value) {
+               if (IS_CV & (IS_VAR|IS_TMP_VAR)) {
+                       if (Z_REFCOUNTED_P(retval_ptr) && !Z_DELREF_P(retval_ptr)) {
+                               SAVE_OPLINE();
+                               rc_dtor_func(Z_COUNTED_P(retval_ptr));
+                       }
+               }
+       } else {
+               if ((IS_CV & (IS_CONST|IS_TMP_VAR))) {
+                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       if (IS_CV == IS_CONST) {
+                               if (UNEXPECTED(Z_OPT_REFCOUNTED_P(return_value))) {
+                                       Z_ADDREF_P(return_value);
+                               }
+                       }
+               } else if (IS_CV == IS_CV) {
+                       do {
+                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       if (EXPECTED(!Z_OPT_ISREF_P(retval_ptr))) {
+                                               if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) {
+                                                       zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+                                                       ZVAL_COPY_VALUE(return_value, retval_ptr);
+                                                       if (GC_MAY_LEAK(ref)) {
+                                                               gc_possible_root(ref);
+                                                       }
+                                                       ZVAL_NULL(retval_ptr);
+                                                       break;
+                                               } else {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       } else {
+                                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                                               if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                                       Z_ADDREF_P(retval_ptr);
+                                               }
+                                       }
+                               }
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       } while (0);
+               } else /* if (IS_CV == IS_VAR) */ {
+                       if (UNEXPECTED(Z_ISREF_P(retval_ptr))) {
+                               zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
+
+                               retval_ptr = Z_REFVAL_P(retval_ptr);
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                               if (UNEXPECTED(GC_DELREF(ref) == 0)) {
+                                       efree_size(ref, sizeof(zend_reference));
+                               } else if (Z_OPT_REFCOUNTED_P(retval_ptr)) {
+                                       Z_ADDREF_P(retval_ptr);
+                               }
+                       } else {
+                               ZVAL_COPY_VALUE(return_value, retval_ptr);
+                       }
+               }
+       }
+       zend_observer_maybe_fcall_call_end(execute_data, return_value);
        goto zend_leave_helper_SPEC_LABEL;
 }
 
@@ -56933,10 +58892,18 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_RETURN_BY_REF_SPEC_CV)
                                ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_RETURN_BY_REF_SPEC_CV_OBSERVER):
+                               VM_TRACE(ZEND_RETURN_BY_REF_SPEC_CV_OBSERVER)
+                               ZEND_RETURN_BY_REF_SPEC_CV_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_CV):
                                VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_CV)
                                ZEND_GENERATOR_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_GENERATOR_RETURN_SPEC_CV_OBSERVER):
+                               VM_TRACE(ZEND_GENERATOR_RETURN_SPEC_CV_OBSERVER)
+                               ZEND_GENERATOR_RETURN_SPEC_CV_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_THROW_SPEC_CV):
                                VM_TRACE(ZEND_THROW_SPEC_CV)
                                ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -56961,6 +58928,10 @@ zend_leave_helper_SPEC_LABEL:
                                VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_CV)
                                ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_INCLUDE_OR_EVAL_SPEC_CV_OBSERVER):
+                               VM_TRACE(ZEND_INCLUDE_OR_EVAL_SPEC_CV_OBSERVER)
+                               ZEND_INCLUDE_OR_EVAL_SPEC_CV_OBSERVER_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_FE_RESET_R_SPEC_CV):
                                VM_TRACE(ZEND_FE_RESET_R_SPEC_CV)
                                ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -57955,7 +59926,11 @@ ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value)
        }
        EX(prev_execute_data) = EG(current_execute_data);
        i_init_code_execute_data(execute_data, op_array, return_value);
+       if (ZEND_OBSERVER_ENABLED) {
+               zend_observer_maybe_fcall_call_begin(execute_data);
+       }
        zend_execute_ex(execute_data);
+       /* Observer end handlers are called from ZEND_RETURN */
        zend_vm_stack_free_call_frame(execute_data);
 }
 
@@ -59315,12 +61290,19 @@ void zend_vm_init(void)
                ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
                ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HANDLER,
                ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER,
+               ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER,
+               ZEND_DO_FCALL_SPEC_RETVAL_USED_OBSERVER_HANDLER,
                ZEND_INIT_FCALL_SPEC_CONST_HANDLER,
                ZEND_RETURN_SPEC_CONST_HANDLER,
+               ZEND_RETURN_SPEC_CONST_OBSERVER_HANDLER,
                ZEND_RETURN_SPEC_TMP_HANDLER,
+               ZEND_RETURN_SPEC_TMP_OBSERVER_HANDLER,
                ZEND_RETURN_SPEC_VAR_HANDLER,
+               ZEND_RETURN_SPEC_VAR_OBSERVER_HANDLER,
+               ZEND_NULL_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_RETURN_SPEC_CV_HANDLER,
+               ZEND_RETURN_SPEC_CV_OBSERVER_HANDLER,
                ZEND_RECV_SPEC_UNUSED_HANDLER,
                ZEND_RECV_INIT_SPEC_CONST_HANDLER,
                ZEND_SEND_VAL_SPEC_CONST_CONST_HANDLER,
@@ -59481,10 +61463,15 @@ void zend_vm_init(void)
                ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER,
                ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER,
                ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
+               ZEND_INCLUDE_OR_EVAL_SPEC_CONST_OBSERVER_HANDLER,
                ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER,
+               ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER_HANDLER,
                ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HANDLER,
+               ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER_HANDLER,
+               ZEND_NULL_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
+               ZEND_INCLUDE_OR_EVAL_SPEC_CV_OBSERVER_HANDLER,
                ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER,
                ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER,
                ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER,
@@ -59940,10 +61927,15 @@ void zend_vm_init(void)
                ZEND_CLONE_SPEC_UNUSED_HANDLER,
                ZEND_CLONE_SPEC_CV_HANDLER,
                ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
+               ZEND_RETURN_BY_REF_SPEC_CONST_OBSERVER_HANDLER,
                ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
+               ZEND_RETURN_BY_REF_SPEC_TMP_OBSERVER_HANDLER,
                ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
+               ZEND_RETURN_BY_REF_SPEC_VAR_OBSERVER_HANDLER,
+               ZEND_NULL_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
+               ZEND_RETURN_BY_REF_SPEC_CV_OBSERVER_HANDLER,
                ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST_HANDLER,
                ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER,
                ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR_HANDLER,
@@ -60142,8 +62134,12 @@ void zend_vm_init(void)
                ZEND_DO_ICALL_SPEC_RETVAL_USED_HANDLER,
                ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_HANDLER,
                ZEND_DO_UCALL_SPEC_RETVAL_USED_HANDLER,
+               ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER,
+               ZEND_DO_UCALL_SPEC_RETVAL_USED_OBSERVER_HANDLER,
                ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_HANDLER,
                ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_HANDLER,
+               ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_OBSERVER_HANDLER,
+               ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_OBSERVER_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_NULL_HANDLER,
@@ -60264,6 +62260,7 @@ void zend_vm_init(void)
                ZEND_NULL_HANDLER,
                ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER,
                ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
+               ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER_HANDLER,
                ZEND_USER_OPCODE_SPEC_HANDLER,
                ZEND_ASSERT_CHECK_SPEC_HANDLER,
                ZEND_JMP_SET_SPEC_CONST_HANDLER,
@@ -60286,6 +62283,7 @@ void zend_vm_init(void)
                ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER,
                ZEND_FETCH_CLASS_NAME_SPEC_CV_HANDLER,
                ZEND_CALL_TRAMPOLINE_SPEC_HANDLER,
+               ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER_HANDLER,
                ZEND_DISCARD_EXCEPTION_SPEC_HANDLER,
                ZEND_YIELD_SPEC_CONST_CONST_HANDLER,
                ZEND_YIELD_SPEC_CONST_TMPVAR_HANDLER,
@@ -60313,10 +62311,15 @@ void zend_vm_init(void)
                ZEND_YIELD_SPEC_CV_UNUSED_HANDLER,
                ZEND_YIELD_SPEC_CV_CV_HANDLER,
                ZEND_GENERATOR_RETURN_SPEC_CONST_HANDLER,
+               ZEND_GENERATOR_RETURN_SPEC_CONST_OBSERVER_HANDLER,
                ZEND_GENERATOR_RETURN_SPEC_TMP_HANDLER,
+               ZEND_GENERATOR_RETURN_SPEC_TMP_OBSERVER_HANDLER,
                ZEND_GENERATOR_RETURN_SPEC_VAR_HANDLER,
+               ZEND_GENERATOR_RETURN_SPEC_VAR_OBSERVER_HANDLER,
+               ZEND_NULL_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_GENERATOR_RETURN_SPEC_CV_HANDLER,
+               ZEND_GENERATOR_RETURN_SPEC_CV_OBSERVER_HANDLER,
                ZEND_FAST_CALL_SPEC_HANDLER,
                ZEND_FAST_RET_SPEC_HANDLER,
                ZEND_RECV_VARIADIC_SPEC_UNUSED_HANDLER,
@@ -61449,147 +63452,147 @@ void zend_vm_init(void)
                1347,
                1348,
                1349,
-               1350 | SPEC_RULE_RETVAL,
-               1352,
-               1353 | SPEC_RULE_OP1,
-               1358,
-               1359,
-               1360 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1385 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
-               1435 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1460 | SPEC_RULE_OP1,
-               1465,
-               1466,
-               1467 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1492 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1517 | SPEC_RULE_OP1,
-               1522 | SPEC_RULE_OP1,
-               1527 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1552 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1577 | SPEC_RULE_OP1,
-               1582,
-               1583,
-               1584 | SPEC_RULE_OP1,
-               1589 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1614 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1639 | SPEC_RULE_OP1,
-               1644 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1669 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1694 | SPEC_RULE_OP1,
-               1699 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1724 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1749 | SPEC_RULE_OP1,
-               1754 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1779 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1804 | SPEC_RULE_OP1,
-               1809 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1834 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1859 | SPEC_RULE_OP1,
-               1864 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1889 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1914 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               1939,
-               1940 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
-               1950,
+               1350 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
+               1354,
+               1355 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+               1365,
+               1366,
+               1367 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1392 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
+               1442 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1467 | SPEC_RULE_OP1,
+               1472,
+               1473,
+               1474 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1499 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1524 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+               1534 | SPEC_RULE_OP1,
+               1539 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1564 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1589 | SPEC_RULE_OP1,
+               1594,
+               1595,
+               1596 | SPEC_RULE_OP1,
+               1601 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1626 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1651 | SPEC_RULE_OP1,
+               1656 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1681 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1706 | SPEC_RULE_OP1,
+               1711 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1736 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1761 | SPEC_RULE_OP1,
+               1766 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1791 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1816 | SPEC_RULE_OP1,
+               1821 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1846 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1871 | SPEC_RULE_OP1,
+               1876 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1901 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               1926 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
                1951,
-               1952,
-               1953,
-               1954,
-               1955 | SPEC_RULE_OP2,
-               1960,
-               1961 | SPEC_RULE_OP1,
-               1966 | SPEC_RULE_OP2,
-               1971 | SPEC_RULE_OP1,
-               1976 | SPEC_RULE_OP1,
-               1981 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2006 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2031 | SPEC_RULE_OP1,
-               2036 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2061 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
-               2111 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2136 | SPEC_RULE_OP2,
-               2141,
-               2142 | SPEC_RULE_OP1,
-               2147 | SPEC_RULE_OP1,
-               2152,
-               2153 | SPEC_RULE_OP1,
-               2158 | SPEC_RULE_OP1,
-               2163 | SPEC_RULE_OP1,
-               2168,
+               1952 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
+               1962,
+               1963,
+               1964,
+               1965,
+               1966,
+               1967 | SPEC_RULE_OP2,
+               1972,
+               1973 | SPEC_RULE_OP1,
+               1978 | SPEC_RULE_OP2,
+               1983 | SPEC_RULE_OP1,
+               1988 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+               1998 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2023 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2048 | SPEC_RULE_OP1,
+               2053 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2078 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_QUICK_ARG,
+               2128 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2153 | SPEC_RULE_OP2,
+               2158,
+               2159 | SPEC_RULE_OP1,
+               2164 | SPEC_RULE_OP1,
                2169,
-               2170 | SPEC_RULE_OP2,
-               2175 | SPEC_RULE_RETVAL,
-               2177 | SPEC_RULE_RETVAL,
-               2179 | SPEC_RULE_RETVAL,
-               2181 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2181 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2206 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2206 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2231 | SPEC_RULE_OP1,
-               2236,
-               2237 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2262,
-               2263 | SPEC_RULE_OP1,
-               2268,
-               2269,
-               2270,
-               2271,
-               2272,
-               2273,
-               2274,
-               2275 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2300,
-               2301,
-               2302,
-               2303 | SPEC_RULE_OP1,
-               2308,
-               2309 | SPEC_RULE_ISSET,
-               2311 | SPEC_RULE_OP2,
-               2316,
-               2317 | SPEC_RULE_OP1,
-               2322,
+               2170 | SPEC_RULE_OP1,
+               2175 | SPEC_RULE_OP1,
+               2180 | SPEC_RULE_OP1,
+               2185,
+               2186,
+               2187 | SPEC_RULE_OP2,
+               2192 | SPEC_RULE_RETVAL,
+               2194 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
+               2198 | SPEC_RULE_RETVAL | SPEC_RULE_OBSERVER,
+               2202 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2202 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2227 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2227 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2252 | SPEC_RULE_OP1,
+               2257,
+               2258 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2283,
+               2284 | SPEC_RULE_OP1,
+               2289,
+               2290,
+               2291,
+               2292,
+               2293,
+               2294,
+               2295,
+               2296 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2321 | SPEC_RULE_OBSERVER,
                2323,
-               2324 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2349 | SPEC_RULE_OP1,
-               2354,
-               2355,
-               2356,
-               2357,
-               2358 | SPEC_RULE_OP1,
-               2363,
-               2364,
-               2365 | SPEC_RULE_OP1,
-               2370 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2395,
-               2396 | SPEC_RULE_OP1,
-               2401,
-               2402,
-               2403,
-               2404,
-               2405,
-               2406,
-               2407,
-               2408,
-               2409 | SPEC_RULE_OP1,
-               2414,
-               2415,
-               2416,
-               2417 | SPEC_RULE_OP2,
-               2422,
-               2423 | SPEC_RULE_OP1,
-               2428 | SPEC_RULE_OP1,
-               2433 | SPEC_RULE_OP1,
-               2438 | SPEC_RULE_OP1,
-               2443 | SPEC_RULE_OP1,
-               2448,
-               2449 | SPEC_RULE_OP1,
-               2454 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2479 | SPEC_RULE_OP1,
-               2484 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
-               2509 | SPEC_RULE_OP1,
-               2514 | SPEC_RULE_OP1,
-               2519,
-               3423
+               2324,
+               2325 | SPEC_RULE_OP1,
+               2330,
+               2331 | SPEC_RULE_ISSET,
+               2333 | SPEC_RULE_OP2,
+               2338,
+               2339 | SPEC_RULE_OP1,
+               2344 | SPEC_RULE_OBSERVER,
+               2346,
+               2347 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2372 | SPEC_RULE_OP1 | SPEC_RULE_OBSERVER,
+               2382,
+               2383,
+               2384,
+               2385,
+               2386 | SPEC_RULE_OP1,
+               2391,
+               2392,
+               2393 | SPEC_RULE_OP1,
+               2398 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2423,
+               2424 | SPEC_RULE_OP1,
+               2429,
+               2430,
+               2431,
+               2432,
+               2433,
+               2434,
+               2435,
+               2436,
+               2437 | SPEC_RULE_OP1,
+               2442,
+               2443,
+               2444,
+               2445 | SPEC_RULE_OP2,
+               2450,
+               2451 | SPEC_RULE_OP1,
+               2456 | SPEC_RULE_OP1,
+               2461 | SPEC_RULE_OP1,
+               2466 | SPEC_RULE_OP1,
+               2471 | SPEC_RULE_OP1,
+               2476,
+               2477 | SPEC_RULE_OP1,
+               2482 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2507 | SPEC_RULE_OP1,
+               2512 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
+               2537 | SPEC_RULE_OP1,
+               2542 | SPEC_RULE_OP1,
+               2547,
+               3451
        };
 #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
        zend_opcode_handler_funcs = labels;
@@ -61698,6 +63701,9 @@ static uint32_t ZEND_FASTCALL zend_vm_get_opcode_handler_idx(uint32_t spec, cons
        if (spec & SPEC_EXTRA_MASK) {
                if (spec & SPEC_RULE_RETVAL) {
                        offset = offset * 2 + (op->result_type != IS_UNUSED);
+                       if ((spec & SPEC_RULE_OBSERVER) && ZEND_OBSERVER_ENABLED) {
+                               offset += 2;
+                       }
                } else if (spec & SPEC_RULE_QUICK_ARG) {
                        offset = offset * 2 + (op->op2.num <= MAX_ARG_FLAG_NUM);
                } else if (spec & SPEC_RULE_OP_DATA) {
@@ -61711,6 +63717,11 @@ static uint32_t ZEND_FASTCALL zend_vm_get_opcode_handler_idx(uint32_t spec, cons
                        } else if (op->result_type == (IS_SMART_BRANCH_JMPNZ|IS_TMP_VAR)) {
                                offset += 2;
                        }
+               } else if (spec & SPEC_RULE_OBSERVER) {
+                       offset = offset * 2;
+                       if (ZEND_OBSERVER_ENABLED) {
+                               offset += 1;
+                       }
                }
        }
        return (spec & SPEC_START_MASK) + offset;
@@ -61754,7 +63765,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2522 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+                               spec = 2550 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
                                if (op->op1_type < op->op2_type) {
                                        zend_swap_operands(op);
                                }
@@ -61762,7 +63773,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2547 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+                               spec = 2575 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
                                if (op->op1_type < op->op2_type) {
                                        zend_swap_operands(op);
                                }
@@ -61770,7 +63781,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2572 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+                               spec = 2600 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
                                if (op->op1_type < op->op2_type) {
                                        zend_swap_operands(op);
                                }
@@ -61781,17 +63792,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2597 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+                               spec = 2625 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
                        } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2622 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+                               spec = 2650 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
                        } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2647 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+                               spec = 2675 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
                        }
                        break;
                case ZEND_MUL:
@@ -61802,17 +63813,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2672 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+                               spec = 2700 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
                        } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2697 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+                               spec = 2725 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
                        } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2722 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+                               spec = 2750 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
                        }
                        break;
                case ZEND_IS_IDENTICAL:
@@ -61823,14 +63834,14 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2747 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+                               spec = 2775 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
                        } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2822 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+                               spec = 2850 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
                        } else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
-                               spec = 3047 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+                               spec = 3075 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
                        }
                        break;
                case ZEND_IS_NOT_IDENTICAL:
@@ -61841,14 +63852,14 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2897 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+                               spec = 2925 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
                        } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2972 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+                               spec = 3000 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
                        } else if (op->op1_type == IS_CV && (op->op2_type & (IS_CONST|IS_CV)) && !(op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) && !(op2_info & (MAY_BE_UNDEF|MAY_BE_REF))) {
-                               spec = 3052 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
+                               spec = 3080 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;
                        }
                        break;
                case ZEND_IS_EQUAL:
@@ -61859,12 +63870,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2747 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+                               spec = 2775 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
                        } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2822 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+                               spec = 2850 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
                        }
                        break;
                case ZEND_IS_NOT_EQUAL:
@@ -61875,12 +63886,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2897 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+                               spec = 2925 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
                        } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 2972 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
+                               spec = 3000 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;
                        }
                        break;
                case ZEND_IS_SMALLER:
@@ -61888,12 +63899,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 3057 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+                               spec = 3085 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
                        } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 3132 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+                               spec = 3160 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
                        }
                        break;
                case ZEND_IS_SMALLER_OR_EQUAL:
@@ -61901,74 +63912,74 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 3207 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+                               spec = 3235 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
                        } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 3282 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
+                               spec = 3310 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
                        }
                        break;
                case ZEND_QM_ASSIGN:
                        if (op1_info == MAY_BE_LONG) {
-                               spec = 3369 | SPEC_RULE_OP1;
+                               spec = 3397 | SPEC_RULE_OP1;
                        } else if (op1_info == MAY_BE_DOUBLE) {
-                               spec = 3374 | SPEC_RULE_OP1;
+                               spec = 3402 | SPEC_RULE_OP1;
                        } else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) {
-                               spec = 3379 | SPEC_RULE_OP1;
+                               spec = 3407 | SPEC_RULE_OP1;
                        }
                        break;
                case ZEND_PRE_INC:
                        if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
-                               spec = 3357 | SPEC_RULE_RETVAL;
+                               spec = 3385 | SPEC_RULE_RETVAL;
                        } else if (op1_info == MAY_BE_LONG) {
-                               spec = 3359 | SPEC_RULE_RETVAL;
+                               spec = 3387 | SPEC_RULE_RETVAL;
                        }
                        break;
                case ZEND_PRE_DEC:
                        if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
-                               spec = 3361 | SPEC_RULE_RETVAL;
+                               spec = 3389 | SPEC_RULE_RETVAL;
                        } else if (op1_info == MAY_BE_LONG) {
-                               spec = 3363 | SPEC_RULE_RETVAL;
+                               spec = 3391 | SPEC_RULE_RETVAL;
                        }
                        break;
                case ZEND_POST_INC:
                        if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
-                               spec = 3365;
+                               spec = 3393;
                        } else if (op1_info == MAY_BE_LONG) {
-                               spec = 3366;
+                               spec = 3394;
                        }
                        break;
                case ZEND_POST_DEC:
                        if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
-                               spec = 3367;
+                               spec = 3395;
                        } else if (op1_info == MAY_BE_LONG) {
-                               spec = 3368;
+                               spec = 3396;
                        }
                        break;
                case ZEND_JMP:
                        if (OP_JMP_ADDR(op, op->op1) > op) {
-                               spec = 2521;
+                               spec = 2549;
                        }
                        break;
                case ZEND_RECV:
                        if (op->op2.num == MAY_BE_ANY) {
-                               spec = 2520;
+                               spec = 2548;
                        }
                        break;
                case ZEND_SEND_VAL:
                        if (op->op1_type == IS_CONST && op->op2_type == IS_UNUSED && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
-                               spec = 3419;
+                               spec = 3447;
                        }
                        break;
                case ZEND_SEND_VAR_EX:
                        if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
-                               spec = 3414 | SPEC_RULE_OP1;
+                               spec = 3442 | SPEC_RULE_OP1;
                        }
                        break;
                case ZEND_FE_FETCH_R:
                        if (op->op2_type == IS_CV && (op1_info & (MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
-                               spec = 3421 | SPEC_RULE_RETVAL;
+                               spec = 3449 | SPEC_RULE_RETVAL;
                        }
                        break;
                case ZEND_FETCH_DIM_R:
@@ -61976,17 +63987,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
                                if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
                                        break;
                                }
-                               spec = 3384 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
+                               spec = 3412 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
                        }
                        break;
                case ZEND_SEND_VAL_EX:
                        if (op->op2_type == IS_UNUSED && op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
-                               spec = 3420;
+                               spec = 3448;
                        }
                        break;
                case ZEND_SEND_VAR:
                        if (op->op2_type == IS_UNUSED && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
-                               spec = 3409 | SPEC_RULE_OP1;
+                               spec = 3437 | SPEC_RULE_OP1;
                        }
                        break;
                case ZEND_BW_OR:
index fcd52aba9c8da54ded36a8537befc627ba888d36..22911760e43e1c14e849ae8cf85aae5cc98971c0 100644 (file)
@@ -55,7 +55,11 @@ ZEND_API void zend_{%EXECUTOR_NAME%}(zend_op_array *op_array, zval *return_value
        }
        EX(prev_execute_data) = EG(current_execute_data);
        i_init_code_execute_data(execute_data, op_array, return_value);
+       if (ZEND_OBSERVER_ENABLED) {
+               zend_observer_maybe_fcall_call_begin(execute_data);
+       }
        zend_{%EXECUTOR_NAME%}_ex(execute_data);
+       /* Observer end handlers are called from ZEND_RETURN */
        zend_vm_stack_free_call_frame(execute_data);
 }
 
index d05c278c17f8550ac977cda577ae5020ed78e8da..2c2a64b294ccbcdab15ab7d400664aee5827db2c 100755 (executable)
@@ -793,6 +793,12 @@ function gen_code($f, $spec, $kind, $code, $op1, $op2, $name, $extra_spec=null)
         "/opline->extended_value\s*&\s*~\s*ZEND_ISEMPTY/" => isset($extra_spec['ISSET']) ?
             ($extra_spec['ISSET'] == 0 ? "\\0" : "opline->extended_value")
             : "\\0",
+        "/OBSERVER_FCALL_BEGIN_HANDLERS\(\s*(.*)\s*\)/" => isset($extra_spec['OBSERVER']) ?
+            ($extra_spec['OBSERVER'] == 0 ? "" : "zend_observer_maybe_fcall_call_begin(\\1)")
+            : "",
+        "/OBSERVER_FCALL_END_HANDLERS\(\s*([^,]*)\s*,\s*(.*)\s*\)/" => isset($extra_spec['OBSERVER']) ?
+            ($extra_spec['OBSERVER'] == 0 ? "" : "zend_observer_maybe_fcall_call_end(\\1, \\2)")
+            : "",
     );
     $code = preg_replace(array_keys($specialized_replacements), array_values($specialized_replacements), $code);
 
@@ -952,6 +958,9 @@ function is_hot_handler($hot, $op1, $op2, $extra_spec) {
     if (isset($extra_spec["SMART_BRANCH"]) && $extra_spec["SMART_BRANCH"] == 0) {
         return false;
     }
+    if (isset($extra_spec["OBSERVER"]) && $extra_spec["OBSERVER"] == 1) {
+        return false;
+    }
     if ($hot === 'HOT_' || $hot === 'INLINE_') {
         return true;
     } else if ($hot === 'HOT_NOCONST_') {
@@ -970,6 +979,8 @@ function is_hot_handler($hot, $op1, $op2, $extra_spec) {
 function is_cold_handler($hot, $op1, $op2, $extra_spec) {
     if ($hot === 'COLD_') {
         return true;
+    } else if (isset($extra_spec["OBSERVER"]) && $extra_spec["OBSERVER"] == 1) {
+        return true;
     } else if ($hot === 'COLD_CONST_') {
         return ($op1 === 'CONST');
     } else if ($hot === 'COLD_CONSTCONST_') {
@@ -1550,6 +1561,11 @@ function extra_spec_name($extra_spec) {
             $s .= "_EMPTY";
         }
     }
+    if (isset($extra_spec["OBSERVER"])) {
+        if ($extra_spec["OBSERVER"]) {
+            $s .= "_OBSERVER";
+        }
+    }
     return $s;
 }
 
@@ -1573,6 +1589,9 @@ function extra_spec_flags($extra_spec) {
     if (isset($extra_spec["ISSET"])) {
         $s[] = "SPEC_RULE_ISSET";
     }
+    if (isset($extra_spec["OBSERVER"])) {
+        $s[] = "SPEC_RULE_OBSERVER";
+    }
     return $s;
 }
 
@@ -1771,6 +1790,7 @@ function gen_executor($f, $skl, $spec, $kind, $executor_name, $initializer_name)
                     out($f,"#define SPEC_RULE_SMART_BRANCH 0x00200000\n");
                     out($f,"#define SPEC_RULE_COMMUTATIVE  0x00800000\n");
                     out($f,"#define SPEC_RULE_ISSET        0x01000000\n");
+                    out($f,"#define SPEC_RULE_OBSERVER     0x02000000\n");
                     out($f,"\n");
                     out($f,"static const uint32_t *zend_spec_handlers;\n");
                     out($f,"static const void * const *zend_opcode_handlers;\n");
@@ -2247,6 +2267,9 @@ function parse_spec_rules($def, $lineno, $str) {
                 case "ISSET":
                     $ret["ISSET"] = array(0, 1);
                     break;
+                case "OBSERVER":
+                    $ret["OBSERVER"] = array(0, 1);
+                    break;
                 default:
                     die("ERROR ($def:$lineno): Wrong specialization rules '$str'\n");
             }
@@ -2653,7 +2676,8 @@ function gen_vm($def, $skel) {
             isset($used_extra_spec["RETVAL"]) ||
             isset($used_extra_spec["QUICK_ARG"]) ||
             isset($used_extra_spec["SMART_BRANCH"]) ||
-            isset($used_extra_spec["ISSET"])) {
+            isset($used_extra_spec["ISSET"]) ||
+            isset($used_extra_spec["OBSERVER"])) {
 
             $else = "";
             out($f, "\tif (spec & SPEC_EXTRA_MASK) {\n");
@@ -2661,6 +2685,9 @@ function gen_vm($def, $skel) {
             if (isset($used_extra_spec["RETVAL"])) {
                 out($f, "\t\t{$else}if (spec & SPEC_RULE_RETVAL) {\n");
                 out($f, "\t\t\toffset = offset * 2 + (op->result_type != IS_UNUSED);\n");
+                out($f, "\t\t\tif ((spec & SPEC_RULE_OBSERVER) && ZEND_OBSERVER_ENABLED) {\n");
+                out($f,        "\t\t\t\toffset += 2;\n");
+                out($f, "\t\t\t}\n");
                 $else = "} else ";
             }
             if (isset($used_extra_spec["QUICK_ARG"])) {
@@ -2688,6 +2715,14 @@ function gen_vm($def, $skel) {
                 out($f, "\t\t\t}\n");
                 $else = "} else ";
             }
+            if (isset($used_extra_spec["OBSERVER"])) {
+                out($f, "\t\t{$else}if (spec & SPEC_RULE_OBSERVER) {\n");
+                out($f,        "\t\t\toffset = offset * 2;\n");
+                out($f, "\t\t\tif (ZEND_OBSERVER_ENABLED) {\n");
+                out($f,        "\t\t\t\toffset += 1;\n");
+                out($f, "\t\t\t}\n");
+                $else = "} else ";
+            }
             if ($else !== "") {
                 out($f, "\t\t}\n");
             }
index afcc07a8fdc35725023efb895c70300a9a551820..8410c70e15ceb5d7608f5cb76ca6007dac0d8a5f 100644 (file)
        _(1349, ZEND_INIT_FCALL_BY_NAME_SPEC_CONST) \
        _(1350, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED) \
        _(1351, ZEND_DO_FCALL_SPEC_RETVAL_USED) \
-       _(1352, ZEND_INIT_FCALL_SPEC_CONST) \
-       _(1353, ZEND_RETURN_SPEC_CONST) \
-       _(1354, ZEND_RETURN_SPEC_TMP) \
-       _(1355, ZEND_RETURN_SPEC_VAR) \
-       _(1357, ZEND_RETURN_SPEC_CV) \
-       _(1358, ZEND_RECV_SPEC_UNUSED) \
-       _(1359, ZEND_RECV_INIT_SPEC_CONST) \
-       _(1360, ZEND_SEND_VAL_SPEC_CONST_CONST) \
-       _(1363, ZEND_SEND_VAL_SPEC_CONST_UNUSED) \
-       _(1365, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \
-       _(1368, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \
-       _(1370, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \
-       _(1373, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \
-       _(1405, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \
-       _(1406, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \
-       _(1411, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED) \
-       _(1412, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED_QUICK) \
-       _(1425, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \
-       _(1426, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \
-       _(1431, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED) \
-       _(1432, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED_QUICK) \
-       _(1445, ZEND_SEND_REF_SPEC_VAR_CONST) \
-       _(1448, ZEND_SEND_REF_SPEC_VAR_UNUSED) \
-       _(1455, ZEND_SEND_REF_SPEC_CV_CONST) \
-       _(1458, ZEND_SEND_REF_SPEC_CV_UNUSED) \
-       _(1460, ZEND_NEW_SPEC_CONST_UNUSED) \
-       _(1462, ZEND_NEW_SPEC_VAR_UNUSED) \
-       _(1463, ZEND_NEW_SPEC_UNUSED_UNUSED) \
-       _(1465, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \
-       _(1466, ZEND_FREE_SPEC_TMPVAR) \
-       _(1467, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \
-       _(1468, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
-       _(1469, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
-       _(1470, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \
-       _(1471, ZEND_INIT_ARRAY_SPEC_CONST_CV) \
-       _(1472, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \
-       _(1473, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
-       _(1474, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
-       _(1475, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \
-       _(1476, ZEND_INIT_ARRAY_SPEC_TMP_CV) \
-       _(1477, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \
-       _(1478, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
-       _(1479, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
-       _(1480, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \
-       _(1481, ZEND_INIT_ARRAY_SPEC_VAR_CV) \
-       _(1482, ZEND_INIT_ARRAY_SPEC_UNUSED_CONST) \
-       _(1483, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
-       _(1484, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
-       _(1485, ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED) \
-       _(1486, ZEND_INIT_ARRAY_SPEC_UNUSED_CV) \
-       _(1487, ZEND_INIT_ARRAY_SPEC_CV_CONST) \
-       _(1488, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
-       _(1489, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
-       _(1490, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \
-       _(1491, ZEND_INIT_ARRAY_SPEC_CV_CV) \
-       _(1492, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \
-       _(1493, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
-       _(1494, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
-       _(1495, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \
-       _(1496, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \
-       _(1497, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \
-       _(1498, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
-       _(1499, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
-       _(1500, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \
-       _(1501, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \
-       _(1502, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \
-       _(1503, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
-       _(1504, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
-       _(1505, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \
-       _(1506, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \
-       _(1512, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \
-       _(1513, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
-       _(1514, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
-       _(1515, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \
-       _(1516, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \
-       _(1517, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \
-       _(1518, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
-       _(1519, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
-       _(1521, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \
-       _(1522, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \
-       _(1523, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
-       _(1524, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
-       _(1526, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \
-       _(1537, ZEND_UNSET_DIM_SPEC_VAR_CONST) \
-       _(1538, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
-       _(1539, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
-       _(1541, ZEND_UNSET_DIM_SPEC_VAR_CV) \
-       _(1547, ZEND_UNSET_DIM_SPEC_CV_CONST) \
-       _(1548, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
-       _(1549, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
-       _(1551, ZEND_UNSET_DIM_SPEC_CV_CV) \
-       _(1562, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \
-       _(1563, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
-       _(1564, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
-       _(1566, ZEND_UNSET_OBJ_SPEC_VAR_CV) \
-       _(1567, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \
-       _(1568, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
-       _(1569, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
-       _(1571, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \
-       _(1572, ZEND_UNSET_OBJ_SPEC_CV_CONST) \
-       _(1573, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
-       _(1574, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
-       _(1576, ZEND_UNSET_OBJ_SPEC_CV_CV) \
-       _(1577, ZEND_FE_RESET_R_SPEC_CONST) \
-       _(1578, ZEND_FE_RESET_R_SPEC_TMP) \
-       _(1579, ZEND_FE_RESET_R_SPEC_VAR) \
-       _(1581, ZEND_FE_RESET_R_SPEC_CV) \
-       _(1582, ZEND_FE_FETCH_R_SPEC_VAR) \
-       _(1583, ZEND_EXIT_SPEC) \
-       _(1584, ZEND_FETCH_R_SPEC_CONST_UNUSED) \
-       _(1585, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
-       _(1586, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
-       _(1588, ZEND_FETCH_R_SPEC_CV_UNUSED) \
-       _(1589, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \
-       _(1590, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
-       _(1591, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
-       _(1593, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \
-       _(1594, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
-       _(1595, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
-       _(1596, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
-       _(1598, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
-       _(1599, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
-       _(1600, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
-       _(1601, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
-       _(1603, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
-       _(1609, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \
-       _(1610, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
-       _(1611, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
-       _(1613, ZEND_FETCH_DIM_R_SPEC_CV_CV) \
-       _(1614, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \
-       _(1615, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
-       _(1616, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
-       _(1618, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \
-       _(1619, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
-       _(1620, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
-       _(1621, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
-       _(1623, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
-       _(1624, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
-       _(1625, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
-       _(1626, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
-       _(1628, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
-       _(1629, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \
-       _(1630, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
-       _(1631, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
-       _(1633, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \
-       _(1634, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \
-       _(1635, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
-       _(1636, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
-       _(1638, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \
-       _(1639, ZEND_FETCH_W_SPEC_CONST_UNUSED) \
-       _(1640, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
-       _(1641, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
-       _(1643, ZEND_FETCH_W_SPEC_CV_UNUSED) \
-       _(1654, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \
-       _(1655, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
-       _(1656, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
-       _(1657, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \
-       _(1658, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \
-       _(1664, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \
-       _(1665, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
-       _(1666, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
-       _(1667, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \
-       _(1668, ZEND_FETCH_DIM_W_SPEC_CV_CV) \
-       _(1679, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \
-       _(1680, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
-       _(1681, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
-       _(1683, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \
-       _(1684, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \
-       _(1685, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
-       _(1686, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
-       _(1688, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \
-       _(1689, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \
-       _(1690, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
-       _(1691, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
-       _(1693, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \
-       _(1694, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \
-       _(1695, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
-       _(1696, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
-       _(1698, ZEND_FETCH_RW_SPEC_CV_UNUSED) \
-       _(1709, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \
-       _(1710, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
-       _(1711, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
-       _(1712, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \
-       _(1713, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \
-       _(1719, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \
-       _(1720, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
-       _(1721, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
-       _(1722, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \
-       _(1723, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \
-       _(1734, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \
-       _(1735, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
-       _(1736, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
-       _(1738, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \
-       _(1739, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \
-       _(1740, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
-       _(1741, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
-       _(1743, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \
-       _(1744, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \
-       _(1745, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
-       _(1746, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
-       _(1748, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \
-       _(1749, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \
-       _(1750, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
-       _(1751, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
-       _(1753, ZEND_FETCH_IS_SPEC_CV_UNUSED) \
-       _(1754, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \
-       _(1755, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
-       _(1756, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
-       _(1758, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \
-       _(1759, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
-       _(1760, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
-       _(1761, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
-       _(1763, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
-       _(1764, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
-       _(1765, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
-       _(1766, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
-       _(1768, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
-       _(1774, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \
-       _(1775, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
-       _(1776, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
-       _(1778, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \
-       _(1779, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \
-       _(1780, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
-       _(1781, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
-       _(1783, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \
-       _(1784, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
-       _(1785, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
-       _(1786, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
-       _(1788, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
-       _(1789, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
-       _(1790, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
-       _(1791, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
-       _(1793, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
-       _(1794, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \
-       _(1795, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
-       _(1796, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
-       _(1798, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \
-       _(1799, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \
-       _(1800, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
-       _(1801, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
-       _(1803, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \
-       _(1804, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \
-       _(1805, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
-       _(1806, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
-       _(1808, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \
-       _(1809, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \
-       _(1810, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
-       _(1811, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
-       _(1812, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \
-       _(1813, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \
-       _(1814, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \
-       _(1815, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
-       _(1816, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
-       _(1817, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \
-       _(1818, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \
-       _(1819, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \
-       _(1820, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
-       _(1821, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
-       _(1822, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \
-       _(1823, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \
-       _(1829, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \
-       _(1830, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
-       _(1831, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
-       _(1832, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \
-       _(1833, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \
-       _(1834, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \
-       _(1835, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
-       _(1836, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
-       _(1838, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \
-       _(1839, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \
-       _(1840, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
-       _(1841, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
-       _(1843, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \
-       _(1844, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \
-       _(1845, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
-       _(1846, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
-       _(1848, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \
-       _(1849, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \
-       _(1850, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
-       _(1851, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
-       _(1853, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \
-       _(1854, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \
-       _(1855, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
-       _(1856, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
-       _(1858, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \
-       _(1859, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \
-       _(1860, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
-       _(1861, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
-       _(1863, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \
-       _(1874, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \
-       _(1875, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
-       _(1876, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
-       _(1878, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \
-       _(1884, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \
-       _(1885, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
-       _(1886, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
-       _(1888, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \
-       _(1899, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \
-       _(1900, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
-       _(1901, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
-       _(1903, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \
-       _(1904, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \
-       _(1905, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
-       _(1906, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
-       _(1908, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \
-       _(1909, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \
-       _(1910, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
-       _(1911, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
-       _(1913, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \
-       _(1914, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \
-       _(1915, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
-       _(1916, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
-       _(1918, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \
-       _(1919, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
-       _(1920, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-       _(1921, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-       _(1923, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
-       _(1924, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
-       _(1925, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-       _(1926, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-       _(1928, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
-       _(1934, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
-       _(1935, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-       _(1936, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
-       _(1938, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
-       _(1939, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \
-       _(1940, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \
-       _(1941, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \
-       _(1946, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED) \
-       _(1947, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED_QUICK) \
-       _(1950, ZEND_EXT_STMT_SPEC) \
-       _(1951, ZEND_EXT_FCALL_BEGIN_SPEC) \
-       _(1952, ZEND_EXT_FCALL_END_SPEC) \
-       _(1953, ZEND_EXT_NOP_SPEC) \
-       _(1954, ZEND_TICKS_SPEC) \
-       _(1955, ZEND_SEND_VAR_NO_REF_SPEC_VAR_CONST) \
-       _(1958, ZEND_SEND_VAR_NO_REF_SPEC_VAR_UNUSED) \
-       _(1960, ZEND_CATCH_SPEC_CONST) \
-       _(1961, ZEND_THROW_SPEC_CONST) \
-       _(1962, ZEND_THROW_SPEC_TMPVAR) \
-       _(1963, ZEND_THROW_SPEC_TMPVAR) \
-       _(1965, ZEND_THROW_SPEC_CV) \
-       _(1966, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \
-       _(1967, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
-       _(1968, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
-       _(1969, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \
-       _(1970, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \
-       _(1971, ZEND_CLONE_SPEC_CONST) \
-       _(1972, ZEND_CLONE_SPEC_TMPVAR) \
-       _(1973, ZEND_CLONE_SPEC_TMPVAR) \
-       _(1974, ZEND_CLONE_SPEC_UNUSED) \
-       _(1975, ZEND_CLONE_SPEC_CV) \
-       _(1976, ZEND_RETURN_BY_REF_SPEC_CONST) \
-       _(1977, ZEND_RETURN_BY_REF_SPEC_TMP) \
-       _(1978, ZEND_RETURN_BY_REF_SPEC_VAR) \
-       _(1980, ZEND_RETURN_BY_REF_SPEC_CV) \
-       _(1981, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \
-       _(1982, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
-       _(1983, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
-       _(1985, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \
-       _(1986, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
-       _(1987, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
-       _(1988, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
-       _(1990, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
-       _(1991, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
-       _(1992, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
-       _(1993, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
-       _(1995, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
-       _(1996, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \
-       _(1997, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
-       _(1998, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
-       _(2000, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \
-       _(2001, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \
-       _(2002, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
-       _(2003, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
-       _(2005, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \
-       _(2006, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \
-       _(2007, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
-       _(2008, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
-       _(2009, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \
-       _(2010, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \
-       _(2016, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \
-       _(2017, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
-       _(2018, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
-       _(2019, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \
-       _(2020, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \
-       _(2021, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \
-       _(2022, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
-       _(2023, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
-       _(2024, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \
-       _(2025, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \
-       _(2031, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \
-       _(2032, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
-       _(2033, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
-       _(2035, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \
-       _(2036, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \
-       _(2037, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
-       _(2038, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
-       _(2040, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \
-       _(2041, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
-       _(2042, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
-       _(2043, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
-       _(2045, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
-       _(2046, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
-       _(2047, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
-       _(2048, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
-       _(2050, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
-       _(2056, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \
-       _(2057, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
-       _(2058, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
-       _(2060, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \
-       _(2061, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \
-       _(2062, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \
-       _(2067, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED) \
-       _(2068, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED_QUICK) \
-       _(2071, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \
-       _(2072, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \
-       _(2077, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED) \
-       _(2078, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED_QUICK) \
-       _(2121, ZEND_SEND_VAR_SPEC_VAR_CONST) \
-       _(2124, ZEND_SEND_VAR_SPEC_VAR_UNUSED) \
-       _(2131, ZEND_SEND_VAR_SPEC_CV_CONST) \
-       _(2134, ZEND_SEND_VAR_SPEC_CV_UNUSED) \
-       _(2136, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \
-       _(2137, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
-       _(2138, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
-       _(2140, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \
-       _(2141, ZEND_SEND_ARRAY_SPEC) \
-       _(2142, ZEND_SEND_USER_SPEC_CONST) \
-       _(2143, ZEND_SEND_USER_SPEC_TMP) \
-       _(2144, ZEND_SEND_USER_SPEC_VAR) \
-       _(2146, ZEND_SEND_USER_SPEC_CV) \
-       _(2147, ZEND_STRLEN_SPEC_CONST) \
-       _(2148, ZEND_STRLEN_SPEC_TMPVAR) \
-       _(2149, ZEND_STRLEN_SPEC_TMPVAR) \
-       _(2151, ZEND_STRLEN_SPEC_CV) \
-       _(2152, ZEND_DEFINED_SPEC_CONST) \
-       _(2153, ZEND_TYPE_CHECK_SPEC_CONST) \
-       _(2154, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
-       _(2155, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
-       _(2157, ZEND_TYPE_CHECK_SPEC_CV) \
-       _(2158, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \
-       _(2159, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \
-       _(2160, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \
-       _(2161, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \
-       _(2162, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \
-       _(2163, ZEND_FE_RESET_RW_SPEC_CONST) \
-       _(2164, ZEND_FE_RESET_RW_SPEC_TMP) \
-       _(2165, ZEND_FE_RESET_RW_SPEC_VAR) \
-       _(2167, ZEND_FE_RESET_RW_SPEC_CV) \
-       _(2168, ZEND_FE_FETCH_RW_SPEC_VAR) \
-       _(2169, ZEND_FE_FREE_SPEC_TMPVAR) \
-       _(2170, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \
-       _(2171, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
-       _(2172, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
-       _(2174, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \
-       _(2175, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \
-       _(2176, ZEND_DO_ICALL_SPEC_RETVAL_USED) \
-       _(2177, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \
-       _(2178, ZEND_DO_UCALL_SPEC_RETVAL_USED) \
-       _(2179, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \
-       _(2180, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \
-       _(2191, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \
-       _(2192, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
-       _(2193, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
-       _(2195, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \
-       _(2196, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \
-       _(2197, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
-       _(2198, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
-       _(2200, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \
-       _(2201, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \
-       _(2202, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
-       _(2203, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
-       _(2205, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \
-       _(2216, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \
-       _(2217, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
-       _(2218, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
-       _(2220, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \
-       _(2221, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \
-       _(2222, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
-       _(2223, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
-       _(2225, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \
-       _(2226, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \
-       _(2227, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
-       _(2228, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
-       _(2230, ZEND_POST_INC_OBJ_SPEC_CV_CV) \
-       _(2231, ZEND_ECHO_SPEC_CONST) \
-       _(2232, ZEND_ECHO_SPEC_TMPVAR) \
-       _(2233, ZEND_ECHO_SPEC_TMPVAR) \
-       _(2235, ZEND_ECHO_SPEC_CV) \
-       _(2242, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
-       _(2244, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
-       _(2245, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
-       _(2247, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
-       _(2249, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
-       _(2250, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
-       _(2257, ZEND_INSTANCEOF_SPEC_CV_CONST) \
-       _(2259, ZEND_INSTANCEOF_SPEC_CV_VAR) \
-       _(2260, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \
-       _(2262, ZEND_GENERATOR_CREATE_SPEC) \
-       _(2265, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \
-       _(2267, ZEND_MAKE_REF_SPEC_CV_UNUSED) \
-       _(2268, ZEND_DECLARE_FUNCTION_SPEC) \
-       _(2269, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED) \
-       _(2270, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \
-       _(2271, ZEND_DECLARE_CLASS_SPEC_CONST) \
-       _(2272, ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST) \
-       _(2273, ZEND_DECLARE_ANON_CLASS_SPEC) \
-       _(2274, ZEND_ADD_ARRAY_UNPACK_SPEC) \
-       _(2275, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \
-       _(2276, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
-       _(2277, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
-       _(2279, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \
-       _(2280, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
-       _(2281, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
-       _(2282, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
-       _(2284, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
-       _(2285, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
-       _(2286, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
-       _(2287, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
-       _(2289, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
-       _(2290, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \
-       _(2291, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
-       _(2292, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
-       _(2294, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \
-       _(2295, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \
-       _(2296, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
-       _(2297, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
-       _(2299, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \
-       _(2300, ZEND_HANDLE_EXCEPTION_SPEC) \
-       _(2301, ZEND_USER_OPCODE_SPEC) \
-       _(2302, ZEND_ASSERT_CHECK_SPEC) \
-       _(2303, ZEND_JMP_SET_SPEC_CONST) \
-       _(2304, ZEND_JMP_SET_SPEC_TMP) \
-       _(2305, ZEND_JMP_SET_SPEC_VAR) \
-       _(2307, ZEND_JMP_SET_SPEC_CV) \
-       _(2308, ZEND_UNSET_CV_SPEC_CV_UNUSED) \
-       _(2309, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \
-       _(2310, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \
-       _(2311, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \
-       _(2312, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
-       _(2313, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
-       _(2315, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \
-       _(2316, ZEND_SEPARATE_SPEC_VAR_UNUSED) \
-       _(2318, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \
-       _(2319, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \
-       _(2320, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \
-       _(2321, ZEND_FETCH_CLASS_NAME_SPEC_CV) \
-       _(2322, ZEND_CALL_TRAMPOLINE_SPEC) \
-       _(2323, ZEND_DISCARD_EXCEPTION_SPEC) \
-       _(2324, ZEND_YIELD_SPEC_CONST_CONST) \
-       _(2325, ZEND_YIELD_SPEC_CONST_TMPVAR) \
-       _(2326, ZEND_YIELD_SPEC_CONST_TMPVAR) \
-       _(2327, ZEND_YIELD_SPEC_CONST_UNUSED) \
-       _(2328, ZEND_YIELD_SPEC_CONST_CV) \
-       _(2329, ZEND_YIELD_SPEC_TMP_CONST) \
-       _(2330, ZEND_YIELD_SPEC_TMP_TMPVAR) \
-       _(2331, ZEND_YIELD_SPEC_TMP_TMPVAR) \
-       _(2332, ZEND_YIELD_SPEC_TMP_UNUSED) \
-       _(2333, ZEND_YIELD_SPEC_TMP_CV) \
-       _(2334, ZEND_YIELD_SPEC_VAR_CONST) \
-       _(2335, ZEND_YIELD_SPEC_VAR_TMPVAR) \
-       _(2336, ZEND_YIELD_SPEC_VAR_TMPVAR) \
-       _(2337, ZEND_YIELD_SPEC_VAR_UNUSED) \
-       _(2338, ZEND_YIELD_SPEC_VAR_CV) \
-       _(2339, ZEND_YIELD_SPEC_UNUSED_CONST) \
-       _(2340, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \
-       _(2341, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \
-       _(2342, ZEND_YIELD_SPEC_UNUSED_UNUSED) \
-       _(2343, ZEND_YIELD_SPEC_UNUSED_CV) \
-       _(2344, ZEND_YIELD_SPEC_CV_CONST) \
-       _(2345, ZEND_YIELD_SPEC_CV_TMPVAR) \
-       _(2346, ZEND_YIELD_SPEC_CV_TMPVAR) \
-       _(2347, ZEND_YIELD_SPEC_CV_UNUSED) \
-       _(2348, ZEND_YIELD_SPEC_CV_CV) \
-       _(2349, ZEND_GENERATOR_RETURN_SPEC_CONST) \
-       _(2350, ZEND_GENERATOR_RETURN_SPEC_TMP) \
-       _(2351, ZEND_GENERATOR_RETURN_SPEC_VAR) \
-       _(2353, ZEND_GENERATOR_RETURN_SPEC_CV) \
-       _(2354, ZEND_FAST_CALL_SPEC) \
-       _(2355, ZEND_FAST_RET_SPEC) \
-       _(2356, ZEND_RECV_VARIADIC_SPEC_UNUSED) \
-       _(2357, ZEND_SEND_UNPACK_SPEC) \
-       _(2358, ZEND_YIELD_FROM_SPEC_CONST) \
-       _(2359, ZEND_YIELD_FROM_SPEC_TMPVAR) \
-       _(2360, ZEND_YIELD_FROM_SPEC_TMPVAR) \
-       _(2362, ZEND_YIELD_FROM_SPEC_CV) \
-       _(2363, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \
-       _(2364, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
-       _(2365, ZEND_COALESCE_SPEC_CONST) \
-       _(2366, ZEND_COALESCE_SPEC_TMP) \
-       _(2367, ZEND_COALESCE_SPEC_VAR) \
-       _(2369, ZEND_COALESCE_SPEC_CV) \
-       _(2370, ZEND_SPACESHIP_SPEC_CONST_CONST) \
-       _(2371, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
-       _(2372, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
-       _(2374, ZEND_SPACESHIP_SPEC_CONST_CV) \
-       _(2375, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
-       _(2376, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
-       _(2377, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
-       _(2379, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
-       _(2380, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
-       _(2381, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
-       _(2382, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
-       _(2384, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
-       _(2390, ZEND_SPACESHIP_SPEC_CV_CONST) \
-       _(2391, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
-       _(2392, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
-       _(2394, ZEND_SPACESHIP_SPEC_CV_CV) \
-       _(2395, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \
-       _(2396, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \
-       _(2399, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \
-       _(2401, ZEND_FETCH_STATIC_PROP_R_SPEC) \
-       _(2402, ZEND_FETCH_STATIC_PROP_W_SPEC) \
-       _(2403, ZEND_FETCH_STATIC_PROP_RW_SPEC) \
-       _(2404, ZEND_FETCH_STATIC_PROP_IS_SPEC) \
-       _(2405, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC) \
-       _(2406, ZEND_FETCH_STATIC_PROP_UNSET_SPEC) \
-       _(2407, ZEND_UNSET_STATIC_PROP_SPEC) \
-       _(2408, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC) \
-       _(2409, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \
-       _(2411, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \
-       _(2412, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \
-       _(2414, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \
-       _(2415, ZEND_BIND_STATIC_SPEC_CV_UNUSED) \
-       _(2416, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \
-       _(2417, ZEND_SEND_FUNC_ARG_SPEC_VAR_CONST) \
-       _(2420, ZEND_SEND_FUNC_ARG_SPEC_VAR_UNUSED) \
-       _(2422, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \
-       _(2423, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \
-       _(2424, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
-       _(2425, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
-       _(2427, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
-       _(2428, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \
-       _(2429, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
-       _(2430, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
-       _(2432, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
-       _(2433, ZEND_IN_ARRAY_SPEC_CONST_CONST) \
-       _(2434, ZEND_IN_ARRAY_SPEC_TMP_CONST) \
-       _(2435, ZEND_IN_ARRAY_SPEC_VAR_CONST) \
-       _(2437, ZEND_IN_ARRAY_SPEC_CV_CONST) \
-       _(2438, ZEND_COUNT_SPEC_CONST_UNUSED) \
-       _(2439, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
-       _(2440, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
-       _(2442, ZEND_COUNT_SPEC_CV_UNUSED) \
-       _(2443, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \
-       _(2444, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
-       _(2445, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
-       _(2446, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \
-       _(2447, ZEND_GET_CLASS_SPEC_CV_UNUSED) \
-       _(2448, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \
-       _(2449, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \
-       _(2450, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \
-       _(2451, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \
-       _(2453, ZEND_GET_TYPE_SPEC_CV_UNUSED) \
-       _(2454, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \
-       _(2455, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
-       _(2456, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
-       _(2458, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \
-       _(2459, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
-       _(2460, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
-       _(2461, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
-       _(2463, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
-       _(2464, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
-       _(2465, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
-       _(2466, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
-       _(2468, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
-       _(2474, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \
-       _(2475, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
-       _(2476, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
-       _(2478, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \
-       _(2479, ZEND_MATCH_SPEC_CONST_CONST) \
-       _(2480, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
-       _(2481, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
-       _(2483, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
-       _(2489, ZEND_CASE_STRICT_SPEC_TMP_CONST) \
-       _(2490, ZEND_CASE_STRICT_SPEC_TMP_TMP) \
-       _(2491, ZEND_CASE_STRICT_SPEC_TMP_VAR) \
-       _(2493, ZEND_CASE_STRICT_SPEC_TMP_CV) \
-       _(2494, ZEND_CASE_STRICT_SPEC_VAR_CONST) \
-       _(2495, ZEND_CASE_STRICT_SPEC_VAR_TMP) \
-       _(2496, ZEND_CASE_STRICT_SPEC_VAR_VAR) \
-       _(2498, ZEND_CASE_STRICT_SPEC_VAR_CV) \
-       _(2509, ZEND_MATCH_ERROR_SPEC_CONST_UNUSED) \
-       _(2510, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
-       _(2511, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
-       _(2513, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
-       _(2514, ZEND_JMP_NULL_SPEC_CONST) \
-       _(2515, ZEND_JMP_NULL_SPEC_TMPVARCV) \
-       _(2516, ZEND_JMP_NULL_SPEC_TMPVARCV) \
-       _(2518, ZEND_JMP_NULL_SPEC_TMPVARCV) \
-       _(2519, ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED) \
-       _(2520, ZEND_RECV_NOTYPE_SPEC) \
-       _(2521, ZEND_JMP_FORWARD_SPEC) \
-       _(2527, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2528, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2529, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2531, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2532, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2533, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2534, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2536, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2542, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2543, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2544, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2546, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2552, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
-       _(2553, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2554, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2556, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2557, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
-       _(2558, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2559, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2561, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2567, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
-       _(2568, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2569, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2571, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2577, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2578, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2579, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2581, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2582, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2583, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2584, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2586, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2592, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2593, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2594, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2596, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2598, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
-       _(2599, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
-       _(2601, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
-       _(2602, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2603, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2604, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2606, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2607, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2608, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2609, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2611, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2617, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2618, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2619, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2621, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2623, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
-       _(2624, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
-       _(2626, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
-       _(2627, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
-       _(2628, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2629, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2631, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2632, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
-       _(2633, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2634, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2636, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2642, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
-       _(2643, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2644, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2646, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2648, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(2649, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(2651, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(2652, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2653, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2654, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2656, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2657, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2658, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2659, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2661, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2667, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2668, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2669, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2671, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2677, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2678, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2679, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2681, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2682, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2683, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2684, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2686, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2692, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
-       _(2693, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2694, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2696, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
-       _(2702, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2703, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2704, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2706, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2707, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2708, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2709, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2711, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2717, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2718, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2719, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2721, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2727, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2728, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2729, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2731, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2732, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2733, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2734, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2736, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2742, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2743, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2744, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2746, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2762, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2763, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2764, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2765, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2766, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2767, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2768, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2769, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2770, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2774, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2775, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2776, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2777, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2778, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2779, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2780, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2781, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2782, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2783, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2784, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2785, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2789, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2790, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2791, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2814, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2815, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2819, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2820, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2821, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2837, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2838, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2839, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2840, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2841, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2842, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2843, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2844, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2845, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2849, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2850, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2851, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2852, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2853, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2854, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2855, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2856, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2857, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2858, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2859, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2860, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2864, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2865, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2866, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2889, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2890, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2894, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2895, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2896, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2912, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2913, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2914, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2915, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2916, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2917, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2918, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2919, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2920, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2924, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2925, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2926, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2927, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2928, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2929, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2930, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2931, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2932, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2933, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2934, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2935, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2939, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2940, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2941, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2964, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2965, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2969, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(2970, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2971, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2987, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(2988, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(2989, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(2990, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2991, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2992, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2993, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(2994, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(2995, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(2999, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3000, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3001, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3002, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(3003, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3004, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3005, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3006, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3007, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3008, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3009, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3010, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3014, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3015, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3016, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3039, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3040, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3044, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3045, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3046, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3047, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
-       _(3051, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \
-       _(3052, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
-       _(3056, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \
-       _(3060, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
-       _(3061, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3062, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3063, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
-       _(3064, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3065, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3069, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
-       _(3070, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3071, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3072, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
-       _(3073, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3074, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3075, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3076, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3077, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3078, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3079, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3080, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3084, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3085, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3086, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3087, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
-       _(3088, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3089, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3090, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3091, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3092, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3093, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3094, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3095, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3099, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3100, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3101, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3117, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
-       _(3118, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3119, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3120, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3121, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3122, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3123, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3124, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3125, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3130, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3131, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3135, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(3136, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3137, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3138, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(3139, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3140, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3144, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(3145, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3146, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3147, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(3148, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3149, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3150, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3151, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3152, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3153, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3154, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3155, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3159, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3160, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3161, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3162, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(3163, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3164, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3165, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3166, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3167, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3168, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3169, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3170, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3174, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3175, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3176, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(3193, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3194, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3199, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3200, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3205, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3206, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3210, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
-       _(3211, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3212, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3213, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
-       _(3214, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3215, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3219, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
-       _(3220, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3221, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3222, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(3223, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3224, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3225, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3226, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3227, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3228, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3229, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3230, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3234, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3235, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3236, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3237, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(3238, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3239, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3240, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3241, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3242, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3243, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3244, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3245, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3249, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3250, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3251, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
-       _(3268, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3269, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3274, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3275, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
-       _(3280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3285, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(3286, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3287, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3288, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(3289, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3290, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3294, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
-       _(3295, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
-       _(3296, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
-       _(3297, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(3298, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3299, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3300, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3301, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3302, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3303, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3304, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3305, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3309, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3310, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3311, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3312, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(3313, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3314, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3315, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3316, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3317, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3318, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3319, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3320, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3324, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3325, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3326, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
-       _(3343, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
-       _(3344, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
-       _(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3349, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3350, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
-       _(3355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
-       _(3356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
-       _(3357, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
-       _(3358, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
-       _(3359, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \
-       _(3360, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \
-       _(3361, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
-       _(3362, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
-       _(3363, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \
-       _(3364, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \
-       _(3365, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \
-       _(3366, ZEND_POST_INC_LONG_SPEC_CV) \
-       _(3367, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \
-       _(3368, ZEND_POST_DEC_LONG_SPEC_CV) \
-       _(3369, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \
-       _(3370, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
-       _(3371, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
-       _(3373, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
-       _(3374, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \
-       _(3375, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
-       _(3376, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
-       _(3378, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
-       _(3379, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \
-       _(3380, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
-       _(3381, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
-       _(3383, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
-       _(3385, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
-       _(3386, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
-       _(3388, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
-       _(3389, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
-       _(3390, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-       _(3391, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-       _(3393, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-       _(3394, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
-       _(3395, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-       _(3396, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-       _(3398, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
-       _(3404, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \
-       _(3405, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
-       _(3406, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
-       _(3408, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
-       _(3411, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \
-       _(3413, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \
-       _(3416, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \
-       _(3418, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \
-       _(3419, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \
-       _(3420, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \
-       _(3421, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \
-       _(3422, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \
-       _(3422+1, ZEND_NULL)
+       _(1352, ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_OBSERVER) \
+       _(1353, ZEND_DO_FCALL_SPEC_RETVAL_USED_OBSERVER) \
+       _(1354, ZEND_INIT_FCALL_SPEC_CONST) \
+       _(1355, ZEND_RETURN_SPEC_CONST) \
+       _(1356, ZEND_RETURN_SPEC_CONST_OBSERVER) \
+       _(1357, ZEND_RETURN_SPEC_TMP) \
+       _(1358, ZEND_RETURN_SPEC_TMP_OBSERVER) \
+       _(1359, ZEND_RETURN_SPEC_VAR) \
+       _(1360, ZEND_RETURN_SPEC_VAR_OBSERVER) \
+       _(1363, ZEND_RETURN_SPEC_CV) \
+       _(1364, ZEND_RETURN_SPEC_CV_OBSERVER) \
+       _(1365, ZEND_RECV_SPEC_UNUSED) \
+       _(1366, ZEND_RECV_INIT_SPEC_CONST) \
+       _(1367, ZEND_SEND_VAL_SPEC_CONST_CONST) \
+       _(1370, ZEND_SEND_VAL_SPEC_CONST_UNUSED) \
+       _(1372, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \
+       _(1375, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \
+       _(1377, ZEND_SEND_VAL_SPEC_TMPVAR_CONST) \
+       _(1380, ZEND_SEND_VAL_SPEC_TMPVAR_UNUSED) \
+       _(1412, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \
+       _(1413, ZEND_SEND_VAR_EX_SPEC_VAR_CONST) \
+       _(1418, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED) \
+       _(1419, ZEND_SEND_VAR_EX_SPEC_VAR_UNUSED_QUICK) \
+       _(1432, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \
+       _(1433, ZEND_SEND_VAR_EX_SPEC_CV_CONST) \
+       _(1438, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED) \
+       _(1439, ZEND_SEND_VAR_EX_SPEC_CV_UNUSED_QUICK) \
+       _(1452, ZEND_SEND_REF_SPEC_VAR_CONST) \
+       _(1455, ZEND_SEND_REF_SPEC_VAR_UNUSED) \
+       _(1462, ZEND_SEND_REF_SPEC_CV_CONST) \
+       _(1465, ZEND_SEND_REF_SPEC_CV_UNUSED) \
+       _(1467, ZEND_NEW_SPEC_CONST_UNUSED) \
+       _(1469, ZEND_NEW_SPEC_VAR_UNUSED) \
+       _(1470, ZEND_NEW_SPEC_UNUSED_UNUSED) \
+       _(1472, ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST) \
+       _(1473, ZEND_FREE_SPEC_TMPVAR) \
+       _(1474, ZEND_INIT_ARRAY_SPEC_CONST_CONST) \
+       _(1475, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
+       _(1476, ZEND_INIT_ARRAY_SPEC_CONST_TMPVAR) \
+       _(1477, ZEND_INIT_ARRAY_SPEC_CONST_UNUSED) \
+       _(1478, ZEND_INIT_ARRAY_SPEC_CONST_CV) \
+       _(1479, ZEND_INIT_ARRAY_SPEC_TMP_CONST) \
+       _(1480, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
+       _(1481, ZEND_INIT_ARRAY_SPEC_TMP_TMPVAR) \
+       _(1482, ZEND_INIT_ARRAY_SPEC_TMP_UNUSED) \
+       _(1483, ZEND_INIT_ARRAY_SPEC_TMP_CV) \
+       _(1484, ZEND_INIT_ARRAY_SPEC_VAR_CONST) \
+       _(1485, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
+       _(1486, ZEND_INIT_ARRAY_SPEC_VAR_TMPVAR) \
+       _(1487, ZEND_INIT_ARRAY_SPEC_VAR_UNUSED) \
+       _(1488, ZEND_INIT_ARRAY_SPEC_VAR_CV) \
+       _(1489, ZEND_INIT_ARRAY_SPEC_UNUSED_CONST) \
+       _(1490, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
+       _(1491, ZEND_INIT_ARRAY_SPEC_UNUSED_TMPVAR) \
+       _(1492, ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED) \
+       _(1493, ZEND_INIT_ARRAY_SPEC_UNUSED_CV) \
+       _(1494, ZEND_INIT_ARRAY_SPEC_CV_CONST) \
+       _(1495, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
+       _(1496, ZEND_INIT_ARRAY_SPEC_CV_TMPVAR) \
+       _(1497, ZEND_INIT_ARRAY_SPEC_CV_UNUSED) \
+       _(1498, ZEND_INIT_ARRAY_SPEC_CV_CV) \
+       _(1499, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST) \
+       _(1500, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
+       _(1501, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMPVAR) \
+       _(1502, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED) \
+       _(1503, ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV) \
+       _(1504, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST) \
+       _(1505, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
+       _(1506, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMPVAR) \
+       _(1507, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED) \
+       _(1508, ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV) \
+       _(1509, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST) \
+       _(1510, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
+       _(1511, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMPVAR) \
+       _(1512, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED) \
+       _(1513, ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV) \
+       _(1519, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST) \
+       _(1520, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
+       _(1521, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPVAR) \
+       _(1522, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED) \
+       _(1523, ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV) \
+       _(1524, ZEND_INCLUDE_OR_EVAL_SPEC_CONST) \
+       _(1525, ZEND_INCLUDE_OR_EVAL_SPEC_CONST_OBSERVER) \
+       _(1526, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
+       _(1527, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER) \
+       _(1528, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR) \
+       _(1529, ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_OBSERVER) \
+       _(1532, ZEND_INCLUDE_OR_EVAL_SPEC_CV) \
+       _(1533, ZEND_INCLUDE_OR_EVAL_SPEC_CV_OBSERVER) \
+       _(1534, ZEND_UNSET_VAR_SPEC_CONST_UNUSED) \
+       _(1535, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
+       _(1536, ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) \
+       _(1538, ZEND_UNSET_VAR_SPEC_CV_UNUSED) \
+       _(1549, ZEND_UNSET_DIM_SPEC_VAR_CONST) \
+       _(1550, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
+       _(1551, ZEND_UNSET_DIM_SPEC_VAR_TMPVAR) \
+       _(1553, ZEND_UNSET_DIM_SPEC_VAR_CV) \
+       _(1559, ZEND_UNSET_DIM_SPEC_CV_CONST) \
+       _(1560, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
+       _(1561, ZEND_UNSET_DIM_SPEC_CV_TMPVAR) \
+       _(1563, ZEND_UNSET_DIM_SPEC_CV_CV) \
+       _(1574, ZEND_UNSET_OBJ_SPEC_VAR_CONST) \
+       _(1575, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
+       _(1576, ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR) \
+       _(1578, ZEND_UNSET_OBJ_SPEC_VAR_CV) \
+       _(1579, ZEND_UNSET_OBJ_SPEC_UNUSED_CONST) \
+       _(1580, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
+       _(1581, ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR) \
+       _(1583, ZEND_UNSET_OBJ_SPEC_UNUSED_CV) \
+       _(1584, ZEND_UNSET_OBJ_SPEC_CV_CONST) \
+       _(1585, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
+       _(1586, ZEND_UNSET_OBJ_SPEC_CV_TMPVAR) \
+       _(1588, ZEND_UNSET_OBJ_SPEC_CV_CV) \
+       _(1589, ZEND_FE_RESET_R_SPEC_CONST) \
+       _(1590, ZEND_FE_RESET_R_SPEC_TMP) \
+       _(1591, ZEND_FE_RESET_R_SPEC_VAR) \
+       _(1593, ZEND_FE_RESET_R_SPEC_CV) \
+       _(1594, ZEND_FE_FETCH_R_SPEC_VAR) \
+       _(1595, ZEND_EXIT_SPEC) \
+       _(1596, ZEND_FETCH_R_SPEC_CONST_UNUSED) \
+       _(1597, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
+       _(1598, ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) \
+       _(1600, ZEND_FETCH_R_SPEC_CV_UNUSED) \
+       _(1601, ZEND_FETCH_DIM_R_SPEC_CONST_CONST) \
+       _(1602, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
+       _(1603, ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR) \
+       _(1605, ZEND_FETCH_DIM_R_SPEC_CONST_CV) \
+       _(1606, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
+       _(1607, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+       _(1608, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+       _(1610, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
+       _(1611, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CONST) \
+       _(1612, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+       _(1613, ZEND_FETCH_DIM_R_SPEC_TMPVAR_TMPVAR) \
+       _(1615, ZEND_FETCH_DIM_R_SPEC_TMPVAR_CV) \
+       _(1621, ZEND_FETCH_DIM_R_SPEC_CV_CONST) \
+       _(1622, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
+       _(1623, ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR) \
+       _(1625, ZEND_FETCH_DIM_R_SPEC_CV_CV) \
+       _(1626, ZEND_FETCH_OBJ_R_SPEC_CONST_CONST) \
+       _(1627, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
+       _(1628, ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR) \
+       _(1630, ZEND_FETCH_OBJ_R_SPEC_CONST_CV) \
+       _(1631, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
+       _(1632, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+       _(1633, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+       _(1635, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
+       _(1636, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST) \
+       _(1637, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+       _(1638, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR) \
+       _(1640, ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV) \
+       _(1641, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST) \
+       _(1642, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
+       _(1643, ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR) \
+       _(1645, ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV) \
+       _(1646, ZEND_FETCH_OBJ_R_SPEC_CV_CONST) \
+       _(1647, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
+       _(1648, ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR) \
+       _(1650, ZEND_FETCH_OBJ_R_SPEC_CV_CV) \
+       _(1651, ZEND_FETCH_W_SPEC_CONST_UNUSED) \
+       _(1652, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
+       _(1653, ZEND_FETCH_W_SPEC_TMPVAR_UNUSED) \
+       _(1655, ZEND_FETCH_W_SPEC_CV_UNUSED) \
+       _(1666, ZEND_FETCH_DIM_W_SPEC_VAR_CONST) \
+       _(1667, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
+       _(1668, ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR) \
+       _(1669, ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED) \
+       _(1670, ZEND_FETCH_DIM_W_SPEC_VAR_CV) \
+       _(1676, ZEND_FETCH_DIM_W_SPEC_CV_CONST) \
+       _(1677, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
+       _(1678, ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR) \
+       _(1679, ZEND_FETCH_DIM_W_SPEC_CV_UNUSED) \
+       _(1680, ZEND_FETCH_DIM_W_SPEC_CV_CV) \
+       _(1691, ZEND_FETCH_OBJ_W_SPEC_VAR_CONST) \
+       _(1692, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
+       _(1693, ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR) \
+       _(1695, ZEND_FETCH_OBJ_W_SPEC_VAR_CV) \
+       _(1696, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST) \
+       _(1697, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
+       _(1698, ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR) \
+       _(1700, ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV) \
+       _(1701, ZEND_FETCH_OBJ_W_SPEC_CV_CONST) \
+       _(1702, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
+       _(1703, ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR) \
+       _(1705, ZEND_FETCH_OBJ_W_SPEC_CV_CV) \
+       _(1706, ZEND_FETCH_RW_SPEC_CONST_UNUSED) \
+       _(1707, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
+       _(1708, ZEND_FETCH_RW_SPEC_TMPVAR_UNUSED) \
+       _(1710, ZEND_FETCH_RW_SPEC_CV_UNUSED) \
+       _(1721, ZEND_FETCH_DIM_RW_SPEC_VAR_CONST) \
+       _(1722, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
+       _(1723, ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR) \
+       _(1724, ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED) \
+       _(1725, ZEND_FETCH_DIM_RW_SPEC_VAR_CV) \
+       _(1731, ZEND_FETCH_DIM_RW_SPEC_CV_CONST) \
+       _(1732, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
+       _(1733, ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR) \
+       _(1734, ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED) \
+       _(1735, ZEND_FETCH_DIM_RW_SPEC_CV_CV) \
+       _(1746, ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST) \
+       _(1747, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
+       _(1748, ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR) \
+       _(1750, ZEND_FETCH_OBJ_RW_SPEC_VAR_CV) \
+       _(1751, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST) \
+       _(1752, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
+       _(1753, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVAR) \
+       _(1755, ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV) \
+       _(1756, ZEND_FETCH_OBJ_RW_SPEC_CV_CONST) \
+       _(1757, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
+       _(1758, ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR) \
+       _(1760, ZEND_FETCH_OBJ_RW_SPEC_CV_CV) \
+       _(1761, ZEND_FETCH_IS_SPEC_CONST_UNUSED) \
+       _(1762, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
+       _(1763, ZEND_FETCH_IS_SPEC_TMPVAR_UNUSED) \
+       _(1765, ZEND_FETCH_IS_SPEC_CV_UNUSED) \
+       _(1766, ZEND_FETCH_DIM_IS_SPEC_CONST_CONST) \
+       _(1767, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
+       _(1768, ZEND_FETCH_DIM_IS_SPEC_CONST_TMPVAR) \
+       _(1770, ZEND_FETCH_DIM_IS_SPEC_CONST_CV) \
+       _(1771, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
+       _(1772, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+       _(1773, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+       _(1775, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
+       _(1776, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CONST) \
+       _(1777, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+       _(1778, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_TMPVAR) \
+       _(1780, ZEND_FETCH_DIM_IS_SPEC_TMPVAR_CV) \
+       _(1786, ZEND_FETCH_DIM_IS_SPEC_CV_CONST) \
+       _(1787, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
+       _(1788, ZEND_FETCH_DIM_IS_SPEC_CV_TMPVAR) \
+       _(1790, ZEND_FETCH_DIM_IS_SPEC_CV_CV) \
+       _(1791, ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST) \
+       _(1792, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
+       _(1793, ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR) \
+       _(1795, ZEND_FETCH_OBJ_IS_SPEC_CONST_CV) \
+       _(1796, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
+       _(1797, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+       _(1798, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+       _(1800, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
+       _(1801, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST) \
+       _(1802, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+       _(1803, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR) \
+       _(1805, ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV) \
+       _(1806, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST) \
+       _(1807, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
+       _(1808, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVAR) \
+       _(1810, ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV) \
+       _(1811, ZEND_FETCH_OBJ_IS_SPEC_CV_CONST) \
+       _(1812, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
+       _(1813, ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR) \
+       _(1815, ZEND_FETCH_OBJ_IS_SPEC_CV_CV) \
+       _(1816, ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED) \
+       _(1817, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
+       _(1818, ZEND_FETCH_FUNC_ARG_SPEC_TMPVAR_UNUSED) \
+       _(1820, ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED) \
+       _(1821, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CONST) \
+       _(1822, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
+       _(1823, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_TMPVAR) \
+       _(1824, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_UNUSED) \
+       _(1825, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_CV) \
+       _(1826, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST) \
+       _(1827, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
+       _(1828, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR) \
+       _(1829, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED) \
+       _(1830, ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV) \
+       _(1831, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST) \
+       _(1832, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
+       _(1833, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMPVAR) \
+       _(1834, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED) \
+       _(1835, ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV) \
+       _(1841, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST) \
+       _(1842, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
+       _(1843, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMPVAR) \
+       _(1844, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED) \
+       _(1845, ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV) \
+       _(1846, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST) \
+       _(1847, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
+       _(1848, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR) \
+       _(1850, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV) \
+       _(1851, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CONST) \
+       _(1852, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
+       _(1853, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TMPVAR) \
+       _(1855, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV) \
+       _(1856, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST) \
+       _(1857, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
+       _(1858, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMPVAR) \
+       _(1860, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV) \
+       _(1861, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST) \
+       _(1862, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
+       _(1863, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR) \
+       _(1865, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV) \
+       _(1866, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST) \
+       _(1867, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
+       _(1868, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR) \
+       _(1870, ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV) \
+       _(1871, ZEND_FETCH_UNSET_SPEC_CONST_UNUSED) \
+       _(1872, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
+       _(1873, ZEND_FETCH_UNSET_SPEC_TMPVAR_UNUSED) \
+       _(1875, ZEND_FETCH_UNSET_SPEC_CV_UNUSED) \
+       _(1886, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST) \
+       _(1887, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
+       _(1888, ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVAR) \
+       _(1890, ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV) \
+       _(1896, ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST) \
+       _(1897, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
+       _(1898, ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR) \
+       _(1900, ZEND_FETCH_DIM_UNSET_SPEC_CV_CV) \
+       _(1911, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST) \
+       _(1912, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
+       _(1913, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVAR) \
+       _(1915, ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV) \
+       _(1916, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST) \
+       _(1917, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
+       _(1918, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMPVAR) \
+       _(1920, ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV) \
+       _(1921, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST) \
+       _(1922, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
+       _(1923, ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR) \
+       _(1925, ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV) \
+       _(1926, ZEND_FETCH_LIST_R_SPEC_CONST_CONST) \
+       _(1927, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
+       _(1928, ZEND_FETCH_LIST_R_SPEC_CONST_TMPVAR) \
+       _(1930, ZEND_FETCH_LIST_R_SPEC_CONST_CV) \
+       _(1931, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
+       _(1932, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+       _(1933, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+       _(1935, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
+       _(1936, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
+       _(1937, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+       _(1938, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+       _(1940, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
+       _(1946, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CONST) \
+       _(1947, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+       _(1948, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_TMPVAR) \
+       _(1950, ZEND_FETCH_LIST_R_SPEC_TMPVARCV_CV) \
+       _(1951, ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST) \
+       _(1952, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \
+       _(1953, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_CONST) \
+       _(1958, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED) \
+       _(1959, ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_UNUSED_QUICK) \
+       _(1962, ZEND_EXT_STMT_SPEC) \
+       _(1963, ZEND_EXT_FCALL_BEGIN_SPEC) \
+       _(1964, ZEND_EXT_FCALL_END_SPEC) \
+       _(1965, ZEND_EXT_NOP_SPEC) \
+       _(1966, ZEND_TICKS_SPEC) \
+       _(1967, ZEND_SEND_VAR_NO_REF_SPEC_VAR_CONST) \
+       _(1970, ZEND_SEND_VAR_NO_REF_SPEC_VAR_UNUSED) \
+       _(1972, ZEND_CATCH_SPEC_CONST) \
+       _(1973, ZEND_THROW_SPEC_CONST) \
+       _(1974, ZEND_THROW_SPEC_TMPVAR) \
+       _(1975, ZEND_THROW_SPEC_TMPVAR) \
+       _(1977, ZEND_THROW_SPEC_CV) \
+       _(1978, ZEND_FETCH_CLASS_SPEC_UNUSED_CONST) \
+       _(1979, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
+       _(1980, ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR) \
+       _(1981, ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED) \
+       _(1982, ZEND_FETCH_CLASS_SPEC_UNUSED_CV) \
+       _(1983, ZEND_CLONE_SPEC_CONST) \
+       _(1984, ZEND_CLONE_SPEC_TMPVAR) \
+       _(1985, ZEND_CLONE_SPEC_TMPVAR) \
+       _(1986, ZEND_CLONE_SPEC_UNUSED) \
+       _(1987, ZEND_CLONE_SPEC_CV) \
+       _(1988, ZEND_RETURN_BY_REF_SPEC_CONST) \
+       _(1989, ZEND_RETURN_BY_REF_SPEC_CONST_OBSERVER) \
+       _(1990, ZEND_RETURN_BY_REF_SPEC_TMP) \
+       _(1991, ZEND_RETURN_BY_REF_SPEC_TMP_OBSERVER) \
+       _(1992, ZEND_RETURN_BY_REF_SPEC_VAR) \
+       _(1993, ZEND_RETURN_BY_REF_SPEC_VAR_OBSERVER) \
+       _(1996, ZEND_RETURN_BY_REF_SPEC_CV) \
+       _(1997, ZEND_RETURN_BY_REF_SPEC_CV_OBSERVER) \
+       _(1998, ZEND_INIT_METHOD_CALL_SPEC_CONST_CONST) \
+       _(1999, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
+       _(2000, ZEND_INIT_METHOD_CALL_SPEC_CONST_TMPVAR) \
+       _(2002, ZEND_INIT_METHOD_CALL_SPEC_CONST_CV) \
+       _(2003, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
+       _(2004, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+       _(2005, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+       _(2007, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
+       _(2008, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CONST) \
+       _(2009, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+       _(2010, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_TMPVAR) \
+       _(2012, ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_CV) \
+       _(2013, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST) \
+       _(2014, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+       _(2015, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+       _(2017, ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV) \
+       _(2018, ZEND_INIT_METHOD_CALL_SPEC_CV_CONST) \
+       _(2019, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
+       _(2020, ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVAR) \
+       _(2022, ZEND_INIT_METHOD_CALL_SPEC_CV_CV) \
+       _(2023, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST) \
+       _(2024, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
+       _(2025, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMPVAR) \
+       _(2026, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) \
+       _(2027, ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV) \
+       _(2033, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST) \
+       _(2034, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
+       _(2035, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR) \
+       _(2036, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED) \
+       _(2037, ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV) \
+       _(2038, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CONST) \
+       _(2039, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+       _(2040, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_TMPVAR) \
+       _(2041, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED) \
+       _(2042, ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_CV) \
+       _(2048, ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED) \
+       _(2049, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
+       _(2050, ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_UNUSED) \
+       _(2052, ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) \
+       _(2053, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST) \
+       _(2054, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
+       _(2055, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMPVAR) \
+       _(2057, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV) \
+       _(2058, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
+       _(2059, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+       _(2060, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+       _(2062, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
+       _(2063, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CONST) \
+       _(2064, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+       _(2065, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_TMPVAR) \
+       _(2067, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMPVAR_CV) \
+       _(2073, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST) \
+       _(2074, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
+       _(2075, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMPVAR) \
+       _(2077, ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV) \
+       _(2078, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \
+       _(2079, ZEND_SEND_VAL_EX_SPEC_CONST_CONST) \
+       _(2084, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED) \
+       _(2085, ZEND_SEND_VAL_EX_SPEC_CONST_UNUSED_QUICK) \
+       _(2088, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \
+       _(2089, ZEND_SEND_VAL_EX_SPEC_TMP_CONST) \
+       _(2094, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED) \
+       _(2095, ZEND_SEND_VAL_EX_SPEC_TMP_UNUSED_QUICK) \
+       _(2138, ZEND_SEND_VAR_SPEC_VAR_CONST) \
+       _(2141, ZEND_SEND_VAR_SPEC_VAR_UNUSED) \
+       _(2148, ZEND_SEND_VAR_SPEC_CV_CONST) \
+       _(2151, ZEND_SEND_VAR_SPEC_CV_UNUSED) \
+       _(2153, ZEND_INIT_USER_CALL_SPEC_CONST_CONST) \
+       _(2154, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
+       _(2155, ZEND_INIT_USER_CALL_SPEC_CONST_TMPVAR) \
+       _(2157, ZEND_INIT_USER_CALL_SPEC_CONST_CV) \
+       _(2158, ZEND_SEND_ARRAY_SPEC) \
+       _(2159, ZEND_SEND_USER_SPEC_CONST) \
+       _(2160, ZEND_SEND_USER_SPEC_TMP) \
+       _(2161, ZEND_SEND_USER_SPEC_VAR) \
+       _(2163, ZEND_SEND_USER_SPEC_CV) \
+       _(2164, ZEND_STRLEN_SPEC_CONST) \
+       _(2165, ZEND_STRLEN_SPEC_TMPVAR) \
+       _(2166, ZEND_STRLEN_SPEC_TMPVAR) \
+       _(2168, ZEND_STRLEN_SPEC_CV) \
+       _(2169, ZEND_DEFINED_SPEC_CONST) \
+       _(2170, ZEND_TYPE_CHECK_SPEC_CONST) \
+       _(2171, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
+       _(2172, ZEND_TYPE_CHECK_SPEC_TMPVAR) \
+       _(2174, ZEND_TYPE_CHECK_SPEC_CV) \
+       _(2175, ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED) \
+       _(2176, ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED) \
+       _(2177, ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED) \
+       _(2178, ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED) \
+       _(2179, ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) \
+       _(2180, ZEND_FE_RESET_RW_SPEC_CONST) \
+       _(2181, ZEND_FE_RESET_RW_SPEC_TMP) \
+       _(2182, ZEND_FE_RESET_RW_SPEC_VAR) \
+       _(2184, ZEND_FE_RESET_RW_SPEC_CV) \
+       _(2185, ZEND_FE_FETCH_RW_SPEC_VAR) \
+       _(2186, ZEND_FE_FREE_SPEC_TMPVAR) \
+       _(2187, ZEND_INIT_DYNAMIC_CALL_SPEC_CONST) \
+       _(2188, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
+       _(2189, ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR) \
+       _(2191, ZEND_INIT_DYNAMIC_CALL_SPEC_CV) \
+       _(2192, ZEND_DO_ICALL_SPEC_RETVAL_UNUSED) \
+       _(2193, ZEND_DO_ICALL_SPEC_RETVAL_USED) \
+       _(2194, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED) \
+       _(2195, ZEND_DO_UCALL_SPEC_RETVAL_USED) \
+       _(2196, ZEND_DO_UCALL_SPEC_RETVAL_UNUSED_OBSERVER) \
+       _(2197, ZEND_DO_UCALL_SPEC_RETVAL_USED_OBSERVER) \
+       _(2198, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED) \
+       _(2199, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED) \
+       _(2200, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_UNUSED_OBSERVER) \
+       _(2201, ZEND_DO_FCALL_BY_NAME_SPEC_RETVAL_USED_OBSERVER) \
+       _(2212, ZEND_PRE_INC_OBJ_SPEC_VAR_CONST) \
+       _(2213, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
+       _(2214, ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR) \
+       _(2216, ZEND_PRE_INC_OBJ_SPEC_VAR_CV) \
+       _(2217, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST) \
+       _(2218, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+       _(2219, ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+       _(2221, ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV) \
+       _(2222, ZEND_PRE_INC_OBJ_SPEC_CV_CONST) \
+       _(2223, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
+       _(2224, ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR) \
+       _(2226, ZEND_PRE_INC_OBJ_SPEC_CV_CV) \
+       _(2237, ZEND_POST_INC_OBJ_SPEC_VAR_CONST) \
+       _(2238, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
+       _(2239, ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR) \
+       _(2241, ZEND_POST_INC_OBJ_SPEC_VAR_CV) \
+       _(2242, ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST) \
+       _(2243, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+       _(2244, ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR) \
+       _(2246, ZEND_POST_INC_OBJ_SPEC_UNUSED_CV) \
+       _(2247, ZEND_POST_INC_OBJ_SPEC_CV_CONST) \
+       _(2248, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
+       _(2249, ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR) \
+       _(2251, ZEND_POST_INC_OBJ_SPEC_CV_CV) \
+       _(2252, ZEND_ECHO_SPEC_CONST) \
+       _(2253, ZEND_ECHO_SPEC_TMPVAR) \
+       _(2254, ZEND_ECHO_SPEC_TMPVAR) \
+       _(2256, ZEND_ECHO_SPEC_CV) \
+       _(2263, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
+       _(2265, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
+       _(2266, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
+       _(2268, ZEND_INSTANCEOF_SPEC_TMPVAR_CONST) \
+       _(2270, ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) \
+       _(2271, ZEND_INSTANCEOF_SPEC_TMPVAR_UNUSED) \
+       _(2278, ZEND_INSTANCEOF_SPEC_CV_CONST) \
+       _(2280, ZEND_INSTANCEOF_SPEC_CV_VAR) \
+       _(2281, ZEND_INSTANCEOF_SPEC_CV_UNUSED) \
+       _(2283, ZEND_GENERATOR_CREATE_SPEC) \
+       _(2286, ZEND_MAKE_REF_SPEC_VAR_UNUSED) \
+       _(2288, ZEND_MAKE_REF_SPEC_CV_UNUSED) \
+       _(2289, ZEND_DECLARE_FUNCTION_SPEC) \
+       _(2290, ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED) \
+       _(2291, ZEND_DECLARE_CONST_SPEC_CONST_CONST) \
+       _(2292, ZEND_DECLARE_CLASS_SPEC_CONST) \
+       _(2293, ZEND_DECLARE_CLASS_DELAYED_SPEC_CONST_CONST) \
+       _(2294, ZEND_DECLARE_ANON_CLASS_SPEC) \
+       _(2295, ZEND_ADD_ARRAY_UNPACK_SPEC) \
+       _(2296, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST) \
+       _(2297, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
+       _(2298, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMPVAR) \
+       _(2300, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV) \
+       _(2301, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
+       _(2302, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+       _(2303, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+       _(2305, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
+       _(2306, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CONST) \
+       _(2307, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+       _(2308, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) \
+       _(2310, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_CV) \
+       _(2311, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST) \
+       _(2312, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
+       _(2313, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMPVAR) \
+       _(2315, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV) \
+       _(2316, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST) \
+       _(2317, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
+       _(2318, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMPVAR) \
+       _(2320, ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV) \
+       _(2321, ZEND_HANDLE_EXCEPTION_SPEC) \
+       _(2322, ZEND_HANDLE_EXCEPTION_SPEC_OBSERVER) \
+       _(2323, ZEND_USER_OPCODE_SPEC) \
+       _(2324, ZEND_ASSERT_CHECK_SPEC) \
+       _(2325, ZEND_JMP_SET_SPEC_CONST) \
+       _(2326, ZEND_JMP_SET_SPEC_TMP) \
+       _(2327, ZEND_JMP_SET_SPEC_VAR) \
+       _(2329, ZEND_JMP_SET_SPEC_CV) \
+       _(2330, ZEND_UNSET_CV_SPEC_CV_UNUSED) \
+       _(2331, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \
+       _(2332, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \
+       _(2333, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \
+       _(2334, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
+       _(2335, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
+       _(2337, ZEND_FETCH_LIST_W_SPEC_VAR_CV) \
+       _(2338, ZEND_SEPARATE_SPEC_VAR_UNUSED) \
+       _(2340, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \
+       _(2341, ZEND_FETCH_CLASS_NAME_SPEC_TMPVAR) \
+       _(2342, ZEND_FETCH_CLASS_NAME_SPEC_UNUSED) \
+       _(2343, ZEND_FETCH_CLASS_NAME_SPEC_CV) \
+       _(2344, ZEND_CALL_TRAMPOLINE_SPEC) \
+       _(2345, ZEND_CALL_TRAMPOLINE_SPEC_OBSERVER) \
+       _(2346, ZEND_DISCARD_EXCEPTION_SPEC) \
+       _(2347, ZEND_YIELD_SPEC_CONST_CONST) \
+       _(2348, ZEND_YIELD_SPEC_CONST_TMPVAR) \
+       _(2349, ZEND_YIELD_SPEC_CONST_TMPVAR) \
+       _(2350, ZEND_YIELD_SPEC_CONST_UNUSED) \
+       _(2351, ZEND_YIELD_SPEC_CONST_CV) \
+       _(2352, ZEND_YIELD_SPEC_TMP_CONST) \
+       _(2353, ZEND_YIELD_SPEC_TMP_TMPVAR) \
+       _(2354, ZEND_YIELD_SPEC_TMP_TMPVAR) \
+       _(2355, ZEND_YIELD_SPEC_TMP_UNUSED) \
+       _(2356, ZEND_YIELD_SPEC_TMP_CV) \
+       _(2357, ZEND_YIELD_SPEC_VAR_CONST) \
+       _(2358, ZEND_YIELD_SPEC_VAR_TMPVAR) \
+       _(2359, ZEND_YIELD_SPEC_VAR_TMPVAR) \
+       _(2360, ZEND_YIELD_SPEC_VAR_UNUSED) \
+       _(2361, ZEND_YIELD_SPEC_VAR_CV) \
+       _(2362, ZEND_YIELD_SPEC_UNUSED_CONST) \
+       _(2363, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \
+       _(2364, ZEND_YIELD_SPEC_UNUSED_TMPVAR) \
+       _(2365, ZEND_YIELD_SPEC_UNUSED_UNUSED) \
+       _(2366, ZEND_YIELD_SPEC_UNUSED_CV) \
+       _(2367, ZEND_YIELD_SPEC_CV_CONST) \
+       _(2368, ZEND_YIELD_SPEC_CV_TMPVAR) \
+       _(2369, ZEND_YIELD_SPEC_CV_TMPVAR) \
+       _(2370, ZEND_YIELD_SPEC_CV_UNUSED) \
+       _(2371, ZEND_YIELD_SPEC_CV_CV) \
+       _(2372, ZEND_GENERATOR_RETURN_SPEC_CONST) \
+       _(2373, ZEND_GENERATOR_RETURN_SPEC_CONST_OBSERVER) \
+       _(2374, ZEND_GENERATOR_RETURN_SPEC_TMP) \
+       _(2375, ZEND_GENERATOR_RETURN_SPEC_TMP_OBSERVER) \
+       _(2376, ZEND_GENERATOR_RETURN_SPEC_VAR) \
+       _(2377, ZEND_GENERATOR_RETURN_SPEC_VAR_OBSERVER) \
+       _(2380, ZEND_GENERATOR_RETURN_SPEC_CV) \
+       _(2381, ZEND_GENERATOR_RETURN_SPEC_CV_OBSERVER) \
+       _(2382, ZEND_FAST_CALL_SPEC) \
+       _(2383, ZEND_FAST_RET_SPEC) \
+       _(2384, ZEND_RECV_VARIADIC_SPEC_UNUSED) \
+       _(2385, ZEND_SEND_UNPACK_SPEC) \
+       _(2386, ZEND_YIELD_FROM_SPEC_CONST) \
+       _(2387, ZEND_YIELD_FROM_SPEC_TMPVAR) \
+       _(2388, ZEND_YIELD_FROM_SPEC_TMPVAR) \
+       _(2390, ZEND_YIELD_FROM_SPEC_CV) \
+       _(2391, ZEND_COPY_TMP_SPEC_TMPVAR_UNUSED) \
+       _(2392, ZEND_BIND_GLOBAL_SPEC_CV_CONST) \
+       _(2393, ZEND_COALESCE_SPEC_CONST) \
+       _(2394, ZEND_COALESCE_SPEC_TMP) \
+       _(2395, ZEND_COALESCE_SPEC_VAR) \
+       _(2397, ZEND_COALESCE_SPEC_CV) \
+       _(2398, ZEND_SPACESHIP_SPEC_CONST_CONST) \
+       _(2399, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
+       _(2400, ZEND_SPACESHIP_SPEC_CONST_TMPVAR) \
+       _(2402, ZEND_SPACESHIP_SPEC_CONST_CV) \
+       _(2403, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
+       _(2404, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+       _(2405, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+       _(2407, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
+       _(2408, ZEND_SPACESHIP_SPEC_TMPVAR_CONST) \
+       _(2409, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+       _(2410, ZEND_SPACESHIP_SPEC_TMPVAR_TMPVAR) \
+       _(2412, ZEND_SPACESHIP_SPEC_TMPVAR_CV) \
+       _(2418, ZEND_SPACESHIP_SPEC_CV_CONST) \
+       _(2419, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
+       _(2420, ZEND_SPACESHIP_SPEC_CV_TMPVAR) \
+       _(2422, ZEND_SPACESHIP_SPEC_CV_CV) \
+       _(2423, ZEND_FUNC_NUM_ARGS_SPEC_UNUSED_UNUSED) \
+       _(2424, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \
+       _(2427, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \
+       _(2429, ZEND_FETCH_STATIC_PROP_R_SPEC) \
+       _(2430, ZEND_FETCH_STATIC_PROP_W_SPEC) \
+       _(2431, ZEND_FETCH_STATIC_PROP_RW_SPEC) \
+       _(2432, ZEND_FETCH_STATIC_PROP_IS_SPEC) \
+       _(2433, ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC) \
+       _(2434, ZEND_FETCH_STATIC_PROP_UNSET_SPEC) \
+       _(2435, ZEND_UNSET_STATIC_PROP_SPEC) \
+       _(2436, ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC) \
+       _(2437, ZEND_FETCH_CLASS_CONSTANT_SPEC_CONST_CONST) \
+       _(2439, ZEND_FETCH_CLASS_CONSTANT_SPEC_VAR_CONST) \
+       _(2440, ZEND_FETCH_CLASS_CONSTANT_SPEC_UNUSED_CONST) \
+       _(2442, ZEND_BIND_LEXICAL_SPEC_TMP_CV) \
+       _(2443, ZEND_BIND_STATIC_SPEC_CV_UNUSED) \
+       _(2444, ZEND_FETCH_THIS_SPEC_UNUSED_UNUSED) \
+       _(2445, ZEND_SEND_FUNC_ARG_SPEC_VAR_CONST) \
+       _(2448, ZEND_SEND_FUNC_ARG_SPEC_VAR_UNUSED) \
+       _(2450, ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED_UNUSED) \
+       _(2451, ZEND_SWITCH_LONG_SPEC_CONST_CONST) \
+       _(2452, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+       _(2453, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+       _(2455, ZEND_SWITCH_LONG_SPEC_TMPVARCV_CONST) \
+       _(2456, ZEND_SWITCH_STRING_SPEC_CONST_CONST) \
+       _(2457, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+       _(2458, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+       _(2460, ZEND_SWITCH_STRING_SPEC_TMPVARCV_CONST) \
+       _(2461, ZEND_IN_ARRAY_SPEC_CONST_CONST) \
+       _(2462, ZEND_IN_ARRAY_SPEC_TMP_CONST) \
+       _(2463, ZEND_IN_ARRAY_SPEC_VAR_CONST) \
+       _(2465, ZEND_IN_ARRAY_SPEC_CV_CONST) \
+       _(2466, ZEND_COUNT_SPEC_CONST_UNUSED) \
+       _(2467, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
+       _(2468, ZEND_COUNT_SPEC_TMPVAR_UNUSED) \
+       _(2470, ZEND_COUNT_SPEC_CV_UNUSED) \
+       _(2471, ZEND_GET_CLASS_SPEC_CONST_UNUSED) \
+       _(2472, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
+       _(2473, ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED) \
+       _(2474, ZEND_GET_CLASS_SPEC_UNUSED_UNUSED) \
+       _(2475, ZEND_GET_CLASS_SPEC_CV_UNUSED) \
+       _(2476, ZEND_GET_CALLED_CLASS_SPEC_UNUSED_UNUSED) \
+       _(2477, ZEND_GET_TYPE_SPEC_CONST_UNUSED) \
+       _(2478, ZEND_GET_TYPE_SPEC_TMP_UNUSED) \
+       _(2479, ZEND_GET_TYPE_SPEC_VAR_UNUSED) \
+       _(2481, ZEND_GET_TYPE_SPEC_CV_UNUSED) \
+       _(2482, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CONST) \
+       _(2483, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
+       _(2484, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_TMPVAR) \
+       _(2486, ZEND_ARRAY_KEY_EXISTS_SPEC_CONST_CV) \
+       _(2487, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
+       _(2488, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+       _(2489, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+       _(2491, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
+       _(2492, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CONST) \
+       _(2493, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+       _(2494, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_TMPVAR) \
+       _(2496, ZEND_ARRAY_KEY_EXISTS_SPEC_TMPVAR_CV) \
+       _(2502, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CONST) \
+       _(2503, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
+       _(2504, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_TMPVAR) \
+       _(2506, ZEND_ARRAY_KEY_EXISTS_SPEC_CV_CV) \
+       _(2507, ZEND_MATCH_SPEC_CONST_CONST) \
+       _(2508, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
+       _(2509, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
+       _(2511, ZEND_MATCH_SPEC_TMPVARCV_CONST) \
+       _(2517, ZEND_CASE_STRICT_SPEC_TMP_CONST) \
+       _(2518, ZEND_CASE_STRICT_SPEC_TMP_TMP) \
+       _(2519, ZEND_CASE_STRICT_SPEC_TMP_VAR) \
+       _(2521, ZEND_CASE_STRICT_SPEC_TMP_CV) \
+       _(2522, ZEND_CASE_STRICT_SPEC_VAR_CONST) \
+       _(2523, ZEND_CASE_STRICT_SPEC_VAR_TMP) \
+       _(2524, ZEND_CASE_STRICT_SPEC_VAR_VAR) \
+       _(2526, ZEND_CASE_STRICT_SPEC_VAR_CV) \
+       _(2537, ZEND_MATCH_ERROR_SPEC_CONST_UNUSED) \
+       _(2538, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
+       _(2539, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
+       _(2541, ZEND_MATCH_ERROR_SPEC_TMPVARCV_UNUSED) \
+       _(2542, ZEND_JMP_NULL_SPEC_CONST) \
+       _(2543, ZEND_JMP_NULL_SPEC_TMPVARCV) \
+       _(2544, ZEND_JMP_NULL_SPEC_TMPVARCV) \
+       _(2546, ZEND_JMP_NULL_SPEC_TMPVARCV) \
+       _(2547, ZEND_CHECK_UNDEF_ARGS_SPEC_UNUSED_UNUSED) \
+       _(2548, ZEND_RECV_NOTYPE_SPEC) \
+       _(2549, ZEND_JMP_FORWARD_SPEC) \
+       _(2555, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2556, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2557, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2559, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2560, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2561, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2562, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2564, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2570, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2571, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2572, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2574, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2580, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+       _(2581, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2582, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2584, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2585, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+       _(2586, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2587, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2589, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2595, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \
+       _(2596, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2597, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2599, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2605, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2606, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2607, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2609, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2610, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2611, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2612, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2614, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2620, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2621, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2622, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2624, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2626, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+       _(2627, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+       _(2629, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \
+       _(2630, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2631, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2632, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2634, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2635, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2636, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2637, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2639, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2645, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2646, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2647, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2649, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2651, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+       _(2652, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+       _(2654, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \
+       _(2655, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+       _(2656, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2657, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2659, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2660, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+       _(2661, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2662, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2664, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2670, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \
+       _(2671, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2672, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2674, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2676, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(2677, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(2679, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(2680, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2681, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2682, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2684, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2685, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2686, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2687, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2689, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2695, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2696, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2697, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2699, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2705, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2706, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2707, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2709, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2710, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2711, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2712, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2714, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2720, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \
+       _(2721, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2722, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2724, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \
+       _(2730, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2731, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2732, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2734, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2735, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2736, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2737, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2739, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2745, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2746, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2747, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2749, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2755, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2756, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2757, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2759, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2760, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2761, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2762, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2764, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2770, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2771, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2772, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2774, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2790, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2791, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2792, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2793, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2794, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2795, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2796, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2797, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2798, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2802, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2803, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2804, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2805, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2806, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2807, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2808, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2809, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2810, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2811, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2812, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2813, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2817, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2818, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2819, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2835, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2836, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2837, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2847, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2848, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2849, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2865, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2866, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2867, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2868, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2869, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2870, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2871, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2872, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2873, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2877, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2878, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2879, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2880, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2881, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2882, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2883, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2884, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2885, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2886, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2887, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2888, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2892, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2893, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2894, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2910, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(2911, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2912, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2922, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(2923, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2924, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2940, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2941, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2942, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2943, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2944, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2945, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2946, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2947, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2948, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2952, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2953, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2954, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2955, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2956, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2957, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2958, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2959, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2960, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2961, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2962, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2963, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2967, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2968, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2969, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2985, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(2986, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(2987, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(2988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(2997, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(2998, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(2999, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3015, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3016, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3017, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3018, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3019, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3020, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3021, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3022, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3023, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3027, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3028, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3029, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3030, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3031, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3032, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3033, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3034, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3035, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3036, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3037, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3038, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3042, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3043, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3044, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3060, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3061, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3062, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3072, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3073, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3074, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3075, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
+       _(3079, ZEND_IS_IDENTICAL_NOTHROW_SPEC_CV_CV) \
+       _(3080, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CONST) \
+       _(3084, ZEND_IS_NOT_IDENTICAL_NOTHROW_SPEC_CV_CV) \
+       _(3088, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+       _(3089, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3090, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3091, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+       _(3092, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3093, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3097, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \
+       _(3098, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3099, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3100, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+       _(3101, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3102, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3103, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3104, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3105, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3106, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3107, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3108, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3112, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3113, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3114, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3115, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+       _(3116, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3117, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3118, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3119, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3120, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3121, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3122, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3123, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3127, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3128, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3129, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \
+       _(3146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3147, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3148, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3149, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3157, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3158, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3159, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3163, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(3164, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3165, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3166, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(3167, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3168, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3172, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(3173, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3174, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3175, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3176, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3177, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3178, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3179, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3180, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3181, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3182, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3183, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3187, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3188, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3189, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3190, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3191, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3192, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3193, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3194, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3195, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3196, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3197, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3198, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3202, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3203, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3204, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3222, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3223, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3224, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3232, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3233, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3234, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3238, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+       _(3239, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3240, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3241, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+       _(3242, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3243, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3247, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \
+       _(3248, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3249, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3250, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(3251, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3252, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3253, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3254, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3255, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3256, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3257, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3258, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3262, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3263, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3264, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3265, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(3266, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3267, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3268, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3269, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3270, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3271, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3272, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3273, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \
+       _(3296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3297, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3298, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3299, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3307, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \
+       _(3308, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3309, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3313, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(3314, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3315, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3316, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(3317, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3318, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3322, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \
+       _(3323, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \
+       _(3324, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \
+       _(3325, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3326, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3327, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3328, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3329, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3330, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3331, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3332, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3333, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3337, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3338, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3339, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3340, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3341, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3342, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3343, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3344, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3345, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3346, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3347, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3348, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \
+       _(3371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \
+       _(3372, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \
+       _(3373, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3374, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3382, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \
+       _(3383, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \
+       _(3384, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \
+       _(3385, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+       _(3386, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+       _(3387, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_UNUSED) \
+       _(3388, ZEND_PRE_INC_LONG_SPEC_CV_RETVAL_USED) \
+       _(3389, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_UNUSED) \
+       _(3390, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_CV_RETVAL_USED) \
+       _(3391, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_UNUSED) \
+       _(3392, ZEND_PRE_DEC_LONG_SPEC_CV_RETVAL_USED) \
+       _(3393, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_CV) \
+       _(3394, ZEND_POST_INC_LONG_SPEC_CV) \
+       _(3395, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_CV) \
+       _(3396, ZEND_POST_DEC_LONG_SPEC_CV) \
+       _(3397, ZEND_QM_ASSIGN_LONG_SPEC_CONST) \
+       _(3398, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+       _(3399, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+       _(3401, ZEND_QM_ASSIGN_LONG_SPEC_TMPVARCV) \
+       _(3402, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \
+       _(3403, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+       _(3404, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+       _(3406, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \
+       _(3407, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \
+       _(3408, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+       _(3409, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+       _(3411, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \
+       _(3413, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+       _(3414, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+       _(3416, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \
+       _(3417, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
+       _(3418, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+       _(3419, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+       _(3421, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+       _(3422, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \
+       _(3423, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+       _(3424, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+       _(3426, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \
+       _(3432, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \
+       _(3433, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+       _(3434, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+       _(3436, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \
+       _(3439, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \
+       _(3441, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \
+       _(3444, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_UNUSED) \
+       _(3446, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_UNUSED) \
+       _(3447, ZEND_SEND_VAL_SIMPLE_SPEC_CONST) \
+       _(3448, ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST) \
+       _(3449, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \
+       _(3450, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \
+       _(3450+1, ZEND_NULL)
index 116bb6031f405b77beea92aaeab611d4920cb004..7e7f3edec48d16466542b1060acf65a789faa3e8 100644 (file)
@@ -1458,7 +1458,8 @@ PHP_ADD_SOURCES(Zend, \
     zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c zend_gc.c \
     zend_closures.c zend_weakrefs.c zend_float.c zend_string.c zend_signal.c zend_generators.c \
     zend_virtual_cwd.c zend_ast.c zend_objects.c zend_object_handlers.c zend_objects_API.c \
-    zend_default_classes.c zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_gdb.c, \
+    zend_default_classes.c zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_gdb.c \
+    zend_observer.c, \
        -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
 
 PHP_ADD_BUILD_DIR(main main/streams)
index 9ee1a5b5d7243f6b38153a72392a62090ce9b1be..725b33d9131267bd49ff062a9ade7416a54ef1c0 100644 (file)
@@ -44,6 +44,7 @@
 #include "zend_accelerator_util_funcs.h"
 #include "zend_accelerator_hash.h"
 #include "zend_file_cache.h"
+#include "zend_observer.h"
 #include "ext/pcre/php_pcre.h"
 #include "ext/standard/md5.h"
 #include "ext/hash/php_hash.h"
@@ -2977,6 +2978,15 @@ static zend_result accel_post_startup(void)
                }
        }
 
+#ifdef HAVE_JIT
+       /* TODO Observer support for JIT */
+       if (ZEND_OBSERVER_ENABLED) {
+               JIT_G(enabled) = 0;
+               JIT_G(on) = 0;
+               zend_accel_error(ACCEL_LOG_INFO, "Observer extension present. Disabling JIT.");
+       }
+#endif
+
        /* Initialize zend_func_info_rid */
        zend_optimizer_startup();
 
index 900c70f59d5af353d867bc2daa57d64bdb14fd44..64fd421292e76aadcec72db7b4da4434e9f85eb3 100644 (file)
 #include "php.h"
 #include "php_ini.h"
 #include "ext/standard/info.h"
+#include "ext/standard/php_var.h"
 #include "php_test.h"
 #include "test_arginfo.h"
 #include "zend_attributes.h"
+#include "zend_observer.h"
+#include "zend_smart_str.h"
+
+ZEND_BEGIN_MODULE_GLOBALS(zend_test)
+       int observer_enabled;
+       int observer_show_output;
+       int observer_observe_all;
+       int observer_observe_includes;
+       int observer_observe_functions;
+       int observer_show_return_type;
+       int observer_show_return_value;
+       int observer_nesting_depth;
+ZEND_END_MODULE_GLOBALS(zend_test)
+
+ZEND_DECLARE_MODULE_GLOBALS(zend_test)
+
+#define ZT_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(zend_test, v)
 
 static zend_class_entry *zend_test_interface;
 static zend_class_entry *zend_test_class;
@@ -277,6 +295,18 @@ ZEND_METHOD(_ZendTestTrait, testMethod) /* {{{ */ {
 }
 /* }}} */
 
+PHP_INI_BEGIN()
+       STD_PHP_INI_BOOLEAN("zend_test.observer.enabled", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_enabled, zend_zend_test_globals, zend_test_globals)
+       STD_PHP_INI_BOOLEAN("zend_test.observer.show_output", "1", PHP_INI_SYSTEM, OnUpdateBool, observer_show_output, zend_zend_test_globals, zend_test_globals)
+       STD_PHP_INI_BOOLEAN("zend_test.observer.observe_all", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_observe_all, zend_zend_test_globals, zend_test_globals)
+       STD_PHP_INI_BOOLEAN("zend_test.observer.observe_includes", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_observe_includes, zend_zend_test_globals, zend_test_globals)
+       STD_PHP_INI_BOOLEAN("zend_test.observer.observe_functions", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_observe_functions, zend_zend_test_globals, zend_test_globals)
+       STD_PHP_INI_BOOLEAN("zend_test.observer.show_return_type", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_return_type, zend_zend_test_globals, zend_test_globals)
+       STD_PHP_INI_BOOLEAN("zend_test.observer.show_return_value", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_show_return_value, zend_zend_test_globals, zend_test_globals)
+PHP_INI_END()
+
+static zend_observer_fcall observer_fcall_init(zend_function *fbc);
+
 PHP_MINIT_FUNCTION(zend_test)
 {
        zend_class_entry class_entry;
@@ -362,19 +392,118 @@ PHP_MINIT_FUNCTION(zend_test)
                attr->validator = zend_attribute_validate_zendtestattribute;
        }
 
+       // Loading via dl() not supported with the observer API
+       if (type != MODULE_TEMPORARY) {
+               REGISTER_INI_ENTRIES();
+               if (ZT_G(observer_enabled)) {
+                       zend_observer_fcall_register(observer_fcall_init);
+               }
+       } else {
+               (void)ini_entries;
+       }
+
        return SUCCESS;
 }
 
 PHP_MSHUTDOWN_FUNCTION(zend_test)
 {
+       if (type != MODULE_TEMPORARY) {
+               UNREGISTER_INI_ENTRIES();
+       }
+
        return SUCCESS;
 }
 
+static void observer_begin(zend_execute_data *execute_data)
+{
+       if (!ZT_G(observer_show_output)) {
+               return;
+       }
+
+       if (execute_data->func && execute_data->func->common.function_name) {
+               if (execute_data->func->common.scope) {
+                       php_printf("%*s<%s::%s>\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(execute_data->func->common.scope->name), ZSTR_VAL(execute_data->func->common.function_name));
+               } else {
+                       php_printf("%*s<%s>\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(execute_data->func->common.function_name));
+               }
+       } else {
+               php_printf("%*s<file '%s'>\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(execute_data->func->op_array.filename));
+       }
+       ZT_G(observer_nesting_depth)++;
+}
+
+static void get_retval_info(zval *retval, smart_str *buf)
+{
+       if (!ZT_G(observer_show_return_type) && !ZT_G(observer_show_return_value)) {
+               return;
+       }
+
+       smart_str_appendc(buf, ':');
+       if (retval == NULL) {
+               smart_str_appendl(buf, "NULL", 4);
+       } else if (ZT_G(observer_show_return_value)) {
+               php_var_export_ex(retval, 2 * ZT_G(observer_nesting_depth) + 3, buf);
+       } else if (ZT_G(observer_show_return_type)) {
+               smart_str_appends(buf, zend_zval_type_name(retval));
+       }
+       smart_str_0(buf);
+}
+
+static void observer_end(zend_execute_data *execute_data, zval *retval)
+{
+       if (!ZT_G(observer_show_output)) {
+               return;
+       }
+
+       if (EG(exception)) {
+               php_printf("%*s<!-- Exception: %s -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(EG(exception)->ce->name));
+       }
+       ZT_G(observer_nesting_depth)--;
+       if (execute_data->func && execute_data->func->common.function_name) {
+               smart_str retval_info = {0};
+               get_retval_info(retval, &retval_info);
+               if (execute_data->func->common.scope) {
+                       php_printf("%*s</%s::%s%s>\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(execute_data->func->common.scope->name), ZSTR_VAL(execute_data->func->common.function_name), retval_info.s ? ZSTR_VAL(retval_info.s) : "");
+               } else {
+                       php_printf("%*s</%s%s>\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(execute_data->func->common.function_name), retval_info.s ? ZSTR_VAL(retval_info.s) : "");
+               }
+               smart_str_free(&retval_info);
+       } else {
+               php_printf("%*s</file '%s'>\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(execute_data->func->op_array.filename));
+       }
+}
+
+static void observer_show_init(zend_function *fbc)
+{
+       if (fbc->common.function_name) {
+               if (fbc->common.scope) {
+                       php_printf("%*s<!-- init %s::%s() -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
+               } else {
+                       php_printf("%*s<!-- init %s() -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->common.function_name));
+               }
+       } else {
+               php_printf("%*s<!-- init '%s' -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->op_array.filename));
+       }
+}
+
+static zend_observer_fcall observer_fcall_init(zend_function *fbc)
+{
+       if (ZT_G(observer_show_output)) {
+               observer_show_init(fbc);
+       }
+
+       if (ZT_G(observer_observe_all)) {
+               return (zend_observer_fcall){observer_begin, observer_end};
+       } else if (ZT_G(observer_observe_includes) && !fbc->common.function_name) {
+               return (zend_observer_fcall){observer_begin, observer_end};
+       } else if (ZT_G(observer_observe_functions) && fbc->common.function_name) {
+               return (zend_observer_fcall){observer_begin, observer_end};
+       }
+       return (zend_observer_fcall){NULL, NULL};
+}
+
 PHP_RINIT_FUNCTION(zend_test)
 {
-#if defined(COMPILE_DL_ZEND_TEST) && defined(ZTS)
-       ZEND_TSRMLS_CACHE_UPDATE();
-#endif
        return SUCCESS;
 }
 
@@ -383,11 +512,21 @@ PHP_RSHUTDOWN_FUNCTION(zend_test)
        return SUCCESS;
 }
 
+static PHP_GINIT_FUNCTION(zend_test)
+{
+#if defined(COMPILE_DL_ZEND_TEST) && defined(ZTS)
+       ZEND_TSRMLS_CACHE_UPDATE();
+#endif
+       memset(zend_test_globals, 0, sizeof(*zend_test_globals));
+}
+
 PHP_MINFO_FUNCTION(zend_test)
 {
        php_info_print_table_start();
        php_info_print_table_header(2, "zend-test extension", "enabled");
        php_info_print_table_end();
+
+       DISPLAY_INI_ENTRIES();
 }
 
 zend_module_entry zend_test_module_entry = {
@@ -400,7 +539,11 @@ zend_module_entry zend_test_module_entry = {
        PHP_RSHUTDOWN(zend_test),
        PHP_MINFO(zend_test),
        PHP_ZEND_TEST_VERSION,
-       STANDARD_MODULE_PROPERTIES
+       PHP_MODULE_GLOBALS(zend_test),
+       PHP_GINIT(zend_test),
+       NULL,
+       NULL,
+       STANDARD_MODULE_PROPERTIES_EX
 };
 
 #ifdef COMPILE_DL_ZEND_TEST
diff --git a/ext/zend_test/tests/observer.inc b/ext/zend_test/tests/observer.inc
new file mode 100644 (file)
index 0000000..611e9fa
--- /dev/null
@@ -0,0 +1,8 @@
+<?php
+
+function foo_observer_test()
+{
+    echo __FUNCTION__ . PHP_EOL;
+}
+
+foo_observer_test();
diff --git a/ext/zend_test/tests/observer_basic_01.phpt b/ext/zend_test/tests/observer_basic_01.phpt
new file mode 100644 (file)
index 0000000..9e31204
--- /dev/null
@@ -0,0 +1,55 @@
+--TEST--
+Observer: Basic observability of userland functions
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+<?php
+function bar()
+{
+    echo 'Bar' . PHP_EOL;
+    var_dump(array_sum([1,2,3]));
+}
+
+function foo()
+{
+    echo 'Foo' . PHP_EOL;
+    bar();
+}
+
+foo();
+foo();
+foo();
+
+echo 'DONE' . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_basic_01.php' -->
+<file '%s/observer_basic_01.php'>
+  <!-- init foo() -->
+  <foo>
+Foo
+    <!-- init bar() -->
+    <bar>
+Bar
+int(6)
+    </bar>
+  </foo>
+  <foo>
+Foo
+    <bar>
+Bar
+int(6)
+    </bar>
+  </foo>
+  <foo>
+Foo
+    <bar>
+Bar
+int(6)
+    </bar>
+  </foo>
+DONE
+</file '%s/observer_basic_01.php'>
diff --git a/ext/zend_test/tests/observer_basic_02.phpt b/ext/zend_test/tests/observer_basic_02.phpt
new file mode 100644 (file)
index 0000000..9d16b4f
--- /dev/null
@@ -0,0 +1,59 @@
+--TEST--
+Observer: Basic observability of userland methods
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+<?php
+class TestClass
+{
+    private function bar()
+    {
+        echo 'Bar' . PHP_EOL;
+        var_dump(array_sum([1,2,3]));
+    }
+
+    public function foo()
+    {
+        echo 'Foo' . PHP_EOL;
+        $this->bar();
+    }
+}
+
+$test = new TestClass();
+$test->foo();
+$test->foo();
+$test->foo();
+
+echo 'DONE' . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_basic_02.php' -->
+<file '%s/observer_basic_02.php'>
+  <!-- init TestClass::foo() -->
+  <TestClass::foo>
+Foo
+    <!-- init TestClass::bar() -->
+    <TestClass::bar>
+Bar
+int(6)
+    </TestClass::bar>
+  </TestClass::foo>
+  <TestClass::foo>
+Foo
+    <TestClass::bar>
+Bar
+int(6)
+    </TestClass::bar>
+  </TestClass::foo>
+  <TestClass::foo>
+Foo
+    <TestClass::bar>
+Bar
+int(6)
+    </TestClass::bar>
+  </TestClass::foo>
+DONE
+</file '%s/observer_basic_02.php'>
diff --git a/ext/zend_test/tests/observer_basic_03.phpt b/ext/zend_test/tests/observer_basic_03.phpt
new file mode 100644 (file)
index 0000000..6a2d0b1
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Observer: Basic observability of includes
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+<?php
+function foo()
+{
+    echo 'Foo' . PHP_EOL;
+}
+
+foo();
+include __DIR__ . '/observer.inc';
+foo();
+?>
+--EXPECTF--
+<!-- init '%s/observer_basic_03.php' -->
+<file '%s/observer_basic_03.php'>
+  <!-- init foo() -->
+  <foo>
+Foo
+  </foo>
+  <!-- init '%s/observer.inc' -->
+  <file '%s/observer.inc'>
+    <!-- init foo_observer_test() -->
+    <foo_observer_test>
+foo_observer_test
+    </foo_observer_test>
+  </file '%s/observer.inc'>
+  <foo>
+Foo
+  </foo>
+</file '%s/observer_basic_03.php'>
diff --git a/ext/zend_test/tests/observer_basic_04.phpt b/ext/zend_test/tests/observer_basic_04.phpt
new file mode 100644 (file)
index 0000000..6c0a8df
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+Observer: Basic observability of includes only (no functions)
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_includes=1
+--FILE--
+<?php
+function foo()
+{
+    echo 'Foo' . PHP_EOL;
+}
+
+foo();
+include __DIR__ . '/observer.inc';
+foo();
+?>
+--EXPECTF--
+<!-- init '%s/observer_basic_04.php' -->
+<file '%s/observer_basic_04.php'>
+  <!-- init foo() -->
+Foo
+  <!-- init '%s/observer.inc' -->
+  <file '%s/observer.inc'>
+    <!-- init foo_observer_test() -->
+foo_observer_test
+  </file '%s/observer.inc'>
+Foo
+</file '%s/observer_basic_04.php'>
diff --git a/ext/zend_test/tests/observer_basic_05.phpt b/ext/zend_test/tests/observer_basic_05.phpt
new file mode 100644 (file)
index 0000000..27462aa
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Observer: Basic observability of functions only (no includes)
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_functions=1
+--FILE--
+<?php
+function foo()
+{
+    echo 'Foo' . PHP_EOL;
+}
+
+foo();
+include __DIR__ . '/observer.inc';
+foo();
+?>
+--EXPECTF--
+<!-- init '%s/observer_basic_05.php' -->
+<!-- init foo() -->
+<foo>
+Foo
+</foo>
+<!-- init '%s/observer.inc' -->
+<!-- init foo_observer_test() -->
+<foo_observer_test>
+foo_observer_test
+</foo_observer_test>
+<foo>
+Foo
+</foo>
diff --git a/ext/zend_test/tests/observer_closure_01.phpt b/ext/zend_test/tests/observer_closure_01.phpt
new file mode 100644 (file)
index 0000000..3e12049
--- /dev/null
@@ -0,0 +1,49 @@
+--TEST--
+Observer: Basic observability of closures
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+<?php
+$bar = function() {
+    var_dump(array_sum([40,2]));
+};
+
+$foo = function($bar) {
+    echo 'Answer' . PHP_EOL;
+    $bar();
+};
+
+$foo($bar);
+$foo($bar);
+$foo($bar);
+
+echo 'DONE' . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_closure_%d.php' -->
+<file '%s/observer_closure_%d.php'>
+  <!-- init {closure}() -->
+  <{closure}>
+Answer
+    <!-- init {closure}() -->
+    <{closure}>
+int(42)
+    </{closure}>
+  </{closure}>
+  <{closure}>
+Answer
+    <{closure}>
+int(42)
+    </{closure}>
+  </{closure}>
+  <{closure}>
+Answer
+    <{closure}>
+int(42)
+    </{closure}>
+  </{closure}>
+DONE
+</file '%s/observer_closure_%d.php'>
diff --git a/ext/zend_test/tests/observer_eval_01.phpt b/ext/zend_test/tests/observer_eval_01.phpt
new file mode 100644 (file)
index 0000000..1a230c7
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Observer: Basic eval observability
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+<?php
+echo eval("return 'Foo eval' . PHP_EOL;");
+echo 'DONE' . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_eval_%d.php' -->
+<file '%s/observer_eval_%d.php'>
+  <!-- init '%s/observer_eval_%d.php(%d) : eval()'d code' -->
+  <file '%s/observer_eval_%d.php(%d) : eval()'d code'>
+  </file '%s/observer_eval_%d.php(%d) : eval()'d code'>
+Foo eval
+DONE
+</file '%s/observer_eval_%d.php'>
diff --git a/ext/zend_test/tests/observer_exception_01.phpt b/ext/zend_test/tests/observer_exception_01.phpt
new file mode 100644 (file)
index 0000000..fd49c06
--- /dev/null
@@ -0,0 +1,46 @@
+--TEST--
+Observer: Basic observability of userland functions with uncaught exceptions
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+<?php
+function foo()
+{
+    static $callCount = 0;
+    echo 'Call #' . $callCount . PHP_EOL;
+    if (++$callCount == 3) {
+        throw new RuntimeException('Third time is a charm');
+    }
+}
+
+foo();
+foo();
+foo();
+
+echo 'You should not see this' . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_exception_%d.php' -->
+<file '%s/observer_exception_%d.php'>
+  <!-- init foo() -->
+  <foo>
+Call #0
+  </foo>
+  <foo>
+Call #1
+  </foo>
+  <foo>
+Call #2
+    <!-- Exception: RuntimeException -->
+  </foo>
+  <!-- Exception: RuntimeException -->
+</file '%s/observer_exception_%d.php'>
+
+Fatal error: Uncaught RuntimeException: Third time is a charm in %s/observer_exception_%d.php:%d
+Stack trace:
+#0 %s/observer_exception_%d.php(%d): foo()
+#1 {main}
+  thrown in %s/observer_exception_%d.php on line %d
diff --git a/ext/zend_test/tests/observer_generator_01.phpt b/ext/zend_test/tests/observer_generator_01.phpt
new file mode 100644 (file)
index 0000000..a2d8b02
--- /dev/null
@@ -0,0 +1,47 @@
+--TEST--
+Observer: Basic generator observability
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+zend_test.observer.show_return_value=1
+--FILE--
+<?php
+function getResults() {
+    for ($i = 10; $i < 13; $i++) {
+        yield $i;
+    }
+}
+
+function doSomething() {
+    $generator = getResults();
+    foreach ($generator as $value) {
+        echo $value . PHP_EOL;
+    }
+
+    return 'Done';
+}
+
+echo doSomething() . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_generator_%d.php' -->
+<file '%s/observer_generator_%d.php'>
+  <!-- init doSomething() -->
+  <doSomething>
+    <!-- init getResults() -->
+    <getResults>
+    </getResults:10>
+10
+    <getResults>
+    </getResults:11>
+11
+    <getResults>
+    </getResults:12>
+12
+    <getResults>
+    </getResults:NULL>
+  </doSomething:'Done'>
+Done
+</file '%s/observer_generator_%d.php'>
diff --git a/ext/zend_test/tests/observer_generator_02.phpt b/ext/zend_test/tests/observer_generator_02.phpt
new file mode 100644 (file)
index 0000000..2e045f9
--- /dev/null
@@ -0,0 +1,50 @@
+--TEST--
+Observer: Generator with explicit return
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+zend_test.observer.show_return_value=1
+--FILE--
+<?php
+function getResults() {
+    for ($i = 10; $i < 13; $i++) {
+        yield $i;
+    }
+    return 1337;
+}
+
+function doSomething() {
+    $generator = getResults();
+    foreach ($generator as $value) {
+        echo $value . PHP_EOL;
+    }
+    echo $generator->getReturn() . PHP_EOL;
+
+    return 'Done';
+}
+
+echo doSomething() . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_generator_%d.php' -->
+<file '%s/observer_generator_%d.php'>
+  <!-- init doSomething() -->
+  <doSomething>
+    <!-- init getResults() -->
+    <getResults>
+    </getResults:10>
+10
+    <getResults>
+    </getResults:11>
+11
+    <getResults>
+    </getResults:12>
+12
+    <getResults>
+    </getResults:1337>
+1337
+  </doSomething:'Done'>
+Done
+</file '%s/observer_generator_%d.php'>
diff --git a/ext/zend_test/tests/observer_generator_03.phpt b/ext/zend_test/tests/observer_generator_03.phpt
new file mode 100644 (file)
index 0000000..459bdfb
--- /dev/null
@@ -0,0 +1,68 @@
+--TEST--
+Observer: Generator with 'yield from'
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+zend_test.observer.show_return_value=1
+--FILE--
+<?php
+function barResults() {
+    for ($i = 10; $i < 13; $i++) {
+        yield $i;
+    }
+}
+
+function fooResults() {
+    yield 0;
+    yield 1;
+    yield from barResults();
+    yield 42;
+}
+
+function doSomething() {
+    $generator = fooResults();
+    foreach ($generator as $value) {
+        echo $value . PHP_EOL;
+    }
+
+    return 'Done';
+}
+
+echo doSomething() . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_generator_%d.php' -->
+<file '%s/observer_generator_%d.php'>
+  <!-- init doSomething() -->
+  <doSomething>
+    <!-- init fooResults() -->
+    <fooResults>
+    </fooResults:0>
+0
+    <fooResults>
+    </fooResults:1>
+1
+    <fooResults>
+    </fooResults:1>
+    <!-- init barResults() -->
+    <barResults>
+    </barResults:10>
+10
+    <barResults>
+    </barResults:11>
+11
+    <barResults>
+    </barResults:12>
+12
+    <barResults>
+    </barResults:NULL>
+    <fooResults>
+    </fooResults:42>
+42
+    <fooResults>
+    </fooResults:NULL>
+  </doSomething:'Done'>
+Done
+</file '%s/observer_generator_%d.php'>
diff --git a/ext/zend_test/tests/observer_generator_04.phpt b/ext/zend_test/tests/observer_generator_04.phpt
new file mode 100644 (file)
index 0000000..6c2f182
--- /dev/null
@@ -0,0 +1,64 @@
+--TEST--
+Observer: Generator with manual traversal
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+zend_test.observer.show_return_value=1
+--FILE--
+<?php
+function fooResults() {
+    echo 'Starting generator' . PHP_EOL;
+    $i = 0;
+    while (true) {
+        if (yield $i++) break;
+    }
+}
+
+function doSomething() {
+    $generator = fooResults();
+    
+    while($generator->current() !== NULL) {
+        echo $generator->current() . PHP_EOL;
+        if ($generator->current() === 5) {
+            $generator->send('Boop');
+        }
+        $generator->next();
+    }
+
+    return 'Done';
+}
+
+echo doSomething() . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_generator_%d.php' -->
+<file '%s/observer_generator_%d.php'>
+  <!-- init doSomething() -->
+  <doSomething>
+    <!-- init fooResults() -->
+    <fooResults>
+Starting generator
+    </fooResults:0>
+0
+    <fooResults>
+    </fooResults:1>
+1
+    <fooResults>
+    </fooResults:2>
+2
+    <fooResults>
+    </fooResults:3>
+3
+    <fooResults>
+    </fooResults:4>
+4
+    <fooResults>
+    </fooResults:5>
+5
+    <fooResults>
+    </fooResults:NULL>
+  </doSomething:'Done'>
+Done
+</file '%s/observer_generator_%d.php'>
diff --git a/ext/zend_test/tests/observer_jit_01.phpt b/ext/zend_test/tests/observer_jit_01.phpt
new file mode 100644 (file)
index 0000000..f489986
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Observer: JIT is disabled when observer extension is present
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+<?php if (!extension_loaded('Zend OPcache')) die('skip: OPcache extension required'); ?>
+<?php if (!isset(opcache_get_status()['jit'])) die('skip: Build with JIT required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+opcache.enable=1
+opcache.enable_cli=1
+opcache.jit=1
+opcache.jit_buffer_size=1M
+--FILE--
+<?php
+$status = opcache_get_status();
+echo 'JIT enabled: ' . ($status['jit']['enabled'] ? 'yes' : 'no') . PHP_EOL;
+echo 'JIT on: ' . ($status['jit']['on'] ? 'yes' : 'no') . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_jit_%d.php' -->
+<file '%s/observer_jit_%d.php'>
+JIT enabled: no
+JIT on: no
+</file '%s/observer_jit_%d.php'>
diff --git a/ext/zend_test/tests/observer_magic_01.phpt b/ext/zend_test/tests/observer_magic_01.phpt
new file mode 100644 (file)
index 0000000..920f934
--- /dev/null
@@ -0,0 +1,45 @@
+--TEST--
+Observer: Basic magic method observability
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+<?php
+class MagicTest
+{
+    public function __call($name, $args)
+    {
+        echo '__call()' . PHP_EOL;
+        $this->foo($name);
+    }
+
+    public function foo($name)
+    {
+        echo $name . PHP_EOL;
+    }
+}
+
+$test = new MagicTest();
+$test->foo('test');
+$test->bar();
+
+echo 'DONE' . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_magic_01.php' -->
+<file '%s/observer_magic_01.php'>
+  <!-- init MagicTest::foo() -->
+  <MagicTest::foo>
+test
+  </MagicTest::foo>
+  <!-- init MagicTest::__call() -->
+  <MagicTest::__call>
+__call()
+    <MagicTest::foo>
+bar
+    </MagicTest::foo>
+  </MagicTest::__call>
+DONE
+</file '%s/observer_magic_01.php'>
diff --git a/ext/zend_test/tests/observer_zend_call_function_01.phpt b/ext/zend_test/tests/observer_zend_call_function_01.phpt
new file mode 100644 (file)
index 0000000..03d7287
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Observer: Calls that go through zend_call_function are observed
+--SKIPIF--
+<?php if (!extension_loaded('zend-test')) die('skip: zend-test extension required'); ?>
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.observe_all=1
+--FILE--
+<?php
+function sum($carry, $item) {
+    $carry += $item;
+    return $carry;
+}
+
+$a = [1, 2, 3, 4, 5];
+// array_reduce() calls zend_call_function() under the hood
+var_dump(array_reduce($a, 'sum'));
+echo 'Done' . PHP_EOL;
+?>
+--EXPECTF--
+<!-- init '%s/observer_zend_call_function_%d.php' -->
+<file '%s/observer_zend_call_function_%d.php'>
+  <!-- init sum() -->
+  <sum>
+  </sum>
+  <sum>
+  </sum>
+  <sum>
+  </sum>
+  <sum>
+  </sum>
+  <sum>
+  </sum>
+int(15)
+Done
+</file '%s/observer_zend_call_function_%d.php'>
index 9a92447f4196ee2459019fd4b7763358d3d6d138..9eb610fe644099ec24c6ff5ce7e24eb5deadc885 100644 (file)
@@ -71,6 +71,7 @@
 #include "zend_extensions.h"
 #include "zend_ini.h"
 #include "zend_dtrace.h"
+#include "zend_observer.h"
 
 #include "php_content_types.h"
 #include "php_ticks.h"
@@ -2199,6 +2200,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
        php_startup_auto_globals();
        zend_set_utility_values(&zuv);
        php_startup_sapi_content_types();
+       zend_observer_startup();
 
        /* startup extensions statically compiled in */
        if (php_register_internal_extensions_func() == FAILURE) {
@@ -2416,6 +2418,8 @@ void php_module_shutdown(void)
                _set_invalid_parameter_handler(old_invalid_parameter_handler);
        }
 #endif
+
+       zend_observer_shutdown();
 }
 /* }}} */
 
index 9b5e44c37d760481df32ae65ea0dd707ceea6197..94e4cbe1c5fbf42800d900eb9ff549505b7de067 100644 (file)
@@ -237,7 +237,7 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \
        zend_object_handlers.c zend_objects_API.c \
        zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c zend_weakrefs.c \
        zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c zend_ast.c \
-       zend_inheritance.c zend_smart_str.c zend_cpuinfo.c");
+       zend_inheritance.c zend_smart_str.c zend_cpuinfo.c zend_observer.c");
 
 ADD_FLAG("CFLAGS_BD_ZEND", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
 if (VS_TOOLSET && VCVERS >= 1914) {