]> granicus.if.org Git - php/commitdiff
Merge zend_execute_data->called_scope into zend_execute_data->This.
authorDmitry Stogov <dmitry@zend.com>
Fri, 1 Apr 2016 13:17:49 +0000 (16:17 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 1 Apr 2016 13:17:49 +0000 (16:17 +0300)
"called_scope" made sense only for static method calls, for dynamic calls it was always equal to the class of $this.
Now EG(This) may store IS_OBJECT + $this or IS_UNUSED + "called_scope" (of course, "called_scope" may be NULL).
Some code might need to be adopted to support this change.
Checks (Z_OBJ(EX(This))) might need to be converted into (Z_TYPE(EX(This)) == IS_OBJECT).

Zend/zend_API.h
Zend/zend_builtin_functions.c
Zend/zend_compile.h
Zend/zend_exceptions.c
Zend/zend_execute.c
Zend/zend_execute.h
Zend/zend_execute_API.c
Zend/zend_generators.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/reflection/php_reflection.c

index 40c814f71dc89a1998b130ccbbedf368db00bba1..07b48365f33b41e30c1772d3727f3884548a95e7 100644 (file)
@@ -358,7 +358,7 @@ ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *na
 
 ZEND_API char *zend_get_type_by_const(int type);
 
-#define getThis()                                                      (Z_OBJ(EX(This)) ? &EX(This) : NULL)
+#define getThis()                                                      ((Z_TYPE(EX(This)) == IS_OBJECT) ? &EX(This) : NULL)
 #define ZEND_IS_METHOD_CALL()                          (EX(func)->common.scope != NULL)
 
 #define WRONG_PARAM_COUNT                                      ZEND_WRONG_PARAM_COUNT()
index a35c519c032311637189f0200059de7fab88851b..0cbafc7818ad34cade14f964be3898aa13624155 100644 (file)
@@ -2433,7 +2433,7 @@ ZEND_FUNCTION(debug_print_backtrace)
                }
 
                /* $this may be passed into regular internal functions */
-               object = Z_OBJ(call->This);
+               object = (Z_TYPE(call->This) == IS_OBJECT) ? Z_OBJ(call->This) : NULL;
 
                if (call->func) {
                        func = call->func;
@@ -2652,7 +2652,7 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
                }
 
                /* $this may be passed into regular internal functions */
-               object = call ? Z_OBJ(call->This) : NULL;
+               object = (call && (Z_TYPE(call->This) == IS_OBJECT)) ? Z_OBJ(call->This) : NULL;
 
                if (call && call->func) {
                        func = call->func;
index 90c5c8b613b7e0a72602556d87dd36db9c061ebb..833aeab2972ed46d433d7186209f4abc2bec22bb 100644 (file)
@@ -451,7 +451,6 @@ struct _zend_execute_data {
        zval                *return_value;
        zend_function       *func;             /* executed funcrion              */
        zval                 This;             /* this + call_info + num_args    */
-       zend_class_entry    *called_scope;
        zend_execute_data   *prev_execute_data;
        zend_array          *symbol_table;
 #if ZEND_EX_USE_RUN_TIME_CACHE
@@ -482,8 +481,8 @@ struct _zend_execute_data {
 #define ZEND_CALL_KIND(call) \
        ZEND_CALL_KIND_EX(ZEND_CALL_INFO(call))
 
-#define ZEND_SET_CALL_INFO(call, info) do { \
-               Z_TYPE_INFO((call)->This) = IS_OBJECT_EX | ((info) << 24); \
+#define ZEND_SET_CALL_INFO(call, object, info) do { \
+               Z_TYPE_INFO((call)->This) = ((object) ? IS_OBJECT_EX : IS_UNDEF) | ((info) << 24); \
        } while (0)
 
 #define ZEND_ADD_CALL_FLAG_EX(call_info, flag) do { \
index 21dfdc5146720bbc536e73323e13bb5941ab7a5c..6d396e7854bc85383bbabbf33a4ef9dbc7d385a7 100644 (file)
@@ -268,8 +268,10 @@ ZEND_METHOD(exception, __construct)
        if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "|SlO!", &message, &code, &previous, zend_ce_throwable) == FAILURE) {
                zend_class_entry *ce;
 
-               if (execute_data->called_scope) {
-                       ce = execute_data->called_scope;
+               if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                       ce = Z_OBJCE(EX(This));
+               } else if (Z_CE(EX(This))) {
+                       ce = Z_CE(EX(This));
                } else {
                        ce = base_ce;
                }
@@ -330,8 +332,10 @@ ZEND_METHOD(error_exception, __construct)
        if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "|sllslO!", &message, &message_len, &code, &severity, &filename, &filename_len, &lineno, &previous, zend_ce_throwable) == FAILURE) {
                zend_class_entry *ce;
 
-               if (execute_data->called_scope) {
-                       ce = execute_data->called_scope;
+               if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                       ce = Z_OBJCE(EX(This));
+               } else if (Z_CE(EX(This))) {
+                       ce = Z_CE(EX(This));
                } else {
                        ce = zend_ce_error_exception;
                }
index 9aa2d7762f39c2110d05266c46dcbbc074233837..b143211726f4f1064cda2db209376a1b1596d210 100644 (file)
@@ -2149,7 +2149,7 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu
                } while (var != end);
        }
 
-       if (check_this && op_array->this_var != (uint32_t)-1 && EXPECTED(Z_OBJ(EX(This)))) {
+       if (check_this && op_array->this_var != (uint32_t)-1 && EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
                ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This)));
                GC_REFCOUNT(Z_OBJ(EX(This)))++;
        }
@@ -2174,7 +2174,7 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu
        EX(call) = NULL;
        EX(return_value) = return_value;
 
-       if (UNEXPECTED(op_array->this_var != (uint32_t)-1) && EXPECTED(Z_OBJ(EX(This)))) {
+       if (UNEXPECTED(op_array->this_var != (uint32_t)-1) && EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
                GC_REFCOUNT(Z_OBJ(EX(This)))++;
                if (!zend_hash_str_add(EX(symbol_table), "this", sizeof("this")-1, &EX(This))) {
                        GC_REFCOUNT(Z_OBJ(EX(This)))--;
@@ -2204,7 +2204,7 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da
        EX(return_value) = return_value;
 
        if (UNEXPECTED(EX(symbol_table) != NULL)) {
-               if (UNEXPECTED(op_array->this_var != (uint32_t)-1) && EXPECTED(Z_OBJ(EX(This)))) {
+               if (UNEXPECTED(op_array->this_var != (uint32_t)-1) && EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
                        GC_REFCOUNT(Z_OBJ(EX(This)))++;
                        if (!zend_hash_str_add(EX(symbol_table), "this", sizeof("this")-1, &EX(This))) {
                                GC_REFCOUNT(Z_OBJ(EX(This)))--;
@@ -2264,7 +2264,7 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da
                        } while (var != end);
                }
 
-               if (op_array->this_var != (uint32_t)-1 && EXPECTED(Z_OBJ(EX(This)))) {
+               if (op_array->this_var != (uint32_t)-1 && EXPECTED(Z_TYPE(EX(This)) == IS_OBJECT)) {
                        ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This)));
                        GC_REFCOUNT(Z_OBJ(EX(This)))++;
                }
@@ -2315,8 +2315,8 @@ ZEND_API zend_execute_data *zend_create_generator_execute_data(zend_execute_data
                call_info,
                (zend_function*)op_array,
                num_args,
-               call->called_scope,
-               Z_OBJ(call->This));
+               Z_TYPE(call->This) != IS_OBJECT ? Z_CE(call->This) : NULL,
+               Z_TYPE(call->This) == IS_OBJECT ? Z_OBJ(call->This) : NULL);
        EX(prev_execute_data) = NULL;
        EX_NUM_ARGS() = num_args;
 
@@ -2367,7 +2367,7 @@ static zend_execute_data *zend_vm_stack_copy_call_frame(zend_execute_data *call,
        /* copy call frame into new stack segment */
        new_call = zend_vm_stack_extend(used_stack * sizeof(zval));
        *new_call = *call;
-       ZEND_SET_CALL_INFO(new_call, ZEND_CALL_INFO(new_call) | ZEND_CALL_ALLOCATED);
+       ZEND_ADD_CALL_FLAG(new_call, ZEND_CALL_ALLOCATED);
 
        if (passed_args) {
                zval *src = ZEND_CALL_ARG(call, 1);
index 00c651fdfe90a87f6ae4710dca264442d49571d3..5a344a63cee49976fb9e0eb31c206b68f9fccc2e 100644 (file)
@@ -167,6 +167,19 @@ ZEND_API void zend_vm_stack_init(void);
 ZEND_API void zend_vm_stack_destroy(void);
 ZEND_API void* zend_vm_stack_extend(size_t size);
 
+static zend_always_inline void zend_vm_init_call_frame(zend_execute_data *call, uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object)
+{
+       call->func = func;
+       if (object) {
+               Z_OBJ(call->This) = object;
+               ZEND_SET_CALL_INFO(call, 1, call_info);
+       } else {
+               Z_CE(call->This) = called_scope;
+               ZEND_SET_CALL_INFO(call, 0, call_info);
+       }
+       ZEND_CALL_NUM_ARGS(call) = num_args;
+}
+
 static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(uint32_t used_stack, uint32_t call_info, zend_function *func, uint32_t num_args, zend_class_entry *called_scope, zend_object *object)
 {
        zend_execute_data *call = (zend_execute_data*)EG(vm_stack_top);
@@ -175,19 +188,14 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(ui
 
        if (UNEXPECTED(used_stack > (size_t)(((char*)EG(vm_stack_end)) - (char*)call))) {
                call = (zend_execute_data*)zend_vm_stack_extend(used_stack);
-               ZEND_SET_CALL_INFO(call, call_info | ZEND_CALL_ALLOCATED);
+               ZEND_ASSERT_VM_STACK_GLOBAL;
+               zend_vm_init_call_frame(call, call_info | ZEND_CALL_ALLOCATED, func, num_args, called_scope, object);
+               return call;
        } else {
                EG(vm_stack_top) = (zval*)((char*)call + used_stack);
-               ZEND_SET_CALL_INFO(call, call_info);
+               zend_vm_init_call_frame(call, call_info, func, num_args, called_scope, object);
+               return call;
        }
-
-       ZEND_ASSERT_VM_STACK_GLOBAL;
-
-       call->func = func;
-       Z_OBJ(call->This) = object;
-       ZEND_CALL_NUM_ARGS(call) = num_args;
-       call->called_scope = called_scope;
-       return call;
 }
 
 static zend_always_inline uint32_t zend_vm_calc_used_stack(uint32_t num_args, zend_function *func)
index c83761cf89ff1acaf199f55406ff125bcf5a75f7..d88e199937128dcbb54c19fbbbb7c4f1872808d2 100644 (file)
@@ -769,10 +769,12 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
        }
 
        func = fci_cache->function_handler;
-       call = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_FUNCTION,
-               func, fci->param_count, fci_cache->called_scope, fci_cache->object);
        calling_scope = fci_cache->calling_scope;
-       fci->object = fci_cache->object;
+       fci->object = (func->common.fn_flags & ZEND_ACC_STATIC) ?
+               NULL : fci_cache->object;
+
+       call = zend_vm_stack_push_call_frame(ZEND_CALL_TOP_FUNCTION,
+               func, fci->param_count, fci_cache->called_scope, fci->object);
        if (fci->object &&
            (!EG(objects_store).object_buckets ||
             !IS_OBJ_VALID(EG(objects_store).object_buckets[fci->object->handle]))) {
@@ -839,10 +841,6 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) /
        }
 
        EG(scope) = calling_scope;
-       if (func->common.fn_flags & ZEND_ACC_STATIC) {
-               fci->object = NULL;
-       }
-       Z_OBJ(call->This) = fci->object;
 
        if (UNEXPECTED(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
                ZEND_ASSERT(GC_TYPE((zend_object*)func->op_array.prototype) == IS_OBJECT);
@@ -1064,11 +1062,13 @@ ZEND_API zend_class_entry *zend_lookup_class(zend_string *name) /* {{{ */
 ZEND_API zend_class_entry *zend_get_called_scope(zend_execute_data *ex) /* {{{ */
 {
        while (ex) {
-               if (ex->called_scope) {
-                       return ex->called_scope;
+               if (Z_TYPE(ex->This) == IS_OBJECT) {
+                       return Z_OBJCE(ex->This);
+               } else if (Z_CE(ex->This)) {
+                       return Z_CE(ex->This);
                } else if (ex->func) {
                        if (ex->func->type != ZEND_INTERNAL_FUNCTION || ex->func->common.scope) {
-                               return ex->called_scope;
+                               return NULL;
                        }
                }
                ex = ex->prev_execute_data;
@@ -1080,11 +1080,11 @@ ZEND_API zend_class_entry *zend_get_called_scope(zend_execute_data *ex) /* {{{ *
 ZEND_API zend_object *zend_get_this_object(zend_execute_data *ex) /* {{{ */
 {
        while (ex) {
-               if (Z_OBJ(ex->This)) {
+               if (Z_TYPE(ex->This) == IS_OBJECT) {
                        return Z_OBJ(ex->This);
                } else if (ex->func) {
                        if (ex->func->type != ZEND_INTERNAL_FUNCTION || ex->func->common.scope) {
-                               return Z_OBJ(ex->This);
+                               return NULL;
                        }
                }
                ex = ex->prev_execute_data;
index 4e65c92313608f82a3f09b003158379847bbe3b4..8dfa2a975456239e8d5ab4403ff5ffd9147c98d3 100644 (file)
@@ -211,7 +211,7 @@ static uint32_t calc_gc_buffer_size(zend_generator *generator) /* {{{ */
                if (EX_CALL_INFO() & ZEND_CALL_FREE_EXTRA_ARGS) {
                        size += EX_NUM_ARGS() - op_array->num_args;
                }
-               size += Z_OBJ(execute_data->This) != NULL; /* $this */
+               size += Z_TYPE(execute_data->This) == IS_OBJECT; /* $this */
                size += (EX_CALL_INFO() & ZEND_CALL_CLOSURE) != 0; /* Closure object */
 
                /* Yield from root references */
@@ -273,7 +273,7 @@ static HashTable *zend_generator_get_gc(zval *object, zval **table, int *n) /* {
                }
        }
 
-       if (Z_OBJ(execute_data->This)) {
+       if (Z_TYPE(execute_data->This) == IS_OBJECT) {
                ZVAL_OBJ(gc_buffer++, Z_OBJ(execute_data->This));
        }
        if (EX_CALL_INFO() & ZEND_CALL_CLOSURE) {
@@ -351,7 +351,7 @@ ZEND_API void zend_generator_create_zval(zend_execute_data *call, zend_op_array
        execute_data->return_value = (zval*)generator;
 
        memset(&generator->execute_fake, 0, sizeof(zend_execute_data));
-       Z_OBJ(generator->execute_fake.This) = (zend_object *) generator;
+       ZVAL_OBJ(&generator->execute_fake.This, (zend_object *) generator);
 }
 /* }}} */
 
@@ -365,7 +365,7 @@ static ZEND_COLD zend_function *zend_generator_get_constructor(zend_object *obje
 
 ZEND_API zend_execute_data *zend_generator_check_placeholder_frame(zend_execute_data *ptr)
 {
-       if (!ptr->func && Z_OBJ(ptr->This)) {
+       if (!ptr->func && Z_TYPE(ptr->This) == IS_OBJECT) {
                if (Z_OBJCE(ptr->This) == zend_ce_generator) {
                        zend_generator *generator = (zend_generator *) Z_OBJ(ptr->This);
                        zend_generator *root = (generator->node.children < 1 ? generator : generator->node.ptr.leaf)->node.ptr.root;
index ec147ece3b24f0c669684071b27b9a9a00156ddd..ba6c950e9507bdbe53aa7675500bf2d201d7a414 100644 (file)
@@ -711,7 +711,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
        SAVE_OPLINE();
        object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                FREE_UNFETCHED_OP2();
@@ -771,7 +771,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMPVAR|UNU
 
        SAVE_OPLINE();
        container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                FREE_UNFETCHED_OP2();
@@ -1101,7 +1101,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
        SAVE_OPLINE();
        object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -1180,7 +1180,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
        SAVE_OPLINE();
        object = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -1813,7 +1813,7 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR
        SAVE_OPLINE();
        container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -1886,7 +1886,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
        property = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
        container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_OP2();
                HANDLE_EXCEPTION();
@@ -1912,7 +1912,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
        property = GET_OP2_ZVAL_PTR(BP_VAR_R);
        container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_OP2();
                HANDLE_EXCEPTION();
@@ -1937,7 +1937,7 @@ ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR
        SAVE_OPLINE();
        container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -2013,7 +2013,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST
                property = GET_OP2_ZVAL_PTR(BP_VAR_R);
                container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
 
-               if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        FREE_OP2();
                        HANDLE_EXCEPTION();
@@ -2045,7 +2045,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
        SAVE_OPLINE();
        container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -2166,7 +2166,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC(
        SAVE_OPLINE();
        object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -3095,7 +3095,7 @@ ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, CONST|TMPVAR|UNUSED|THIS|CV, CONST|T
 
        object = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_OP2();
                HANDLE_EXCEPTION();
@@ -3275,7 +3275,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -3284,7 +3284,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -3313,7 +3313,11 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, UNUSED|CLASS_FETCH|CONST|VAR,
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT || 
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -3989,8 +3993,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
        } else { /* ZEND_OVERLOADED_FUNCTION */
                zval retval;
                /* Not sure what should be done here if it's a static method */
-               object = Z_OBJ(call->This);
-               if (UNEXPECTED(object == NULL)) {
+               if (UNEXPECTED(Z_TYPE(call->This) != IS_OBJECT)) {
                        zend_vm_stack_free_args(call);
                        if (fbc->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
                                zend_string_release(fbc->common.function_name);
@@ -4002,6 +4005,7 @@ ZEND_VM_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
                        HANDLE_EXCEPTION();
                }
 
+               object = Z_OBJ(call->This);
                EG(scope) = fbc->common.scope;
 
                ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval;
@@ -4737,12 +4741,12 @@ ZEND_VM_HANDLER(119, ZEND_SEND_ARRAY, ANY, ANY)
                if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
                        OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
                }
-               if (Z_OBJ(EX(call)->This)) {
+               if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
                        OBJ_RELEASE(Z_OBJ(EX(call)->This));
                }
                EX(call)->func = (zend_function*)&zend_pass_function;
-               EX(call)->called_scope = NULL;
                Z_OBJ(EX(call)->This) = NULL;
+               ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)));
        } else {
                uint32_t arg_num;
                HashTable *ht;
@@ -4784,12 +4788,12 @@ ZEND_VM_C_LABEL(send_array):
                                                if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
                                                        OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
                                                }
-                                               if (Z_OBJ(EX(call)->This)) {
+                                               if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
                                                        OBJ_RELEASE(Z_OBJ(EX(call)->This));
                                                }
                                                EX(call)->func = (zend_function*)&zend_pass_function;
-                                               EX(call)->called_scope = NULL;
                                                Z_OBJ(EX(call)->This) = NULL;
+                                               ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)));
 
                                                break;
                                        }
@@ -4841,13 +4845,13 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, NUM)
                                if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
                                        OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
                                }
-                               if (Z_OBJ(EX(call)->This)) {
+                               if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
                                        OBJ_RELEASE(Z_OBJ(EX(call)->This));
                                }
                                ZVAL_UNDEF(param);
                                EX(call)->func = (zend_function*)&zend_pass_function;
-                               EX(call)->called_scope = NULL;
                                Z_OBJ(EX(call)->This) = NULL;
+                               ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)));
 
                                FREE_OP1();
                                ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5144,7 +5148,7 @@ ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMPVAR|UNUSED|THIS|CV, ANY)
        SAVE_OPLINE();
        obj = GET_OP1_OBJ_ZVAL_PTR_UNDEF(BP_VAR_R);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                HANDLE_EXCEPTION();
        }
@@ -5658,7 +5662,9 @@ ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMPVAR|CV, ANY, EVAL)
                new_op_array->scope = EG(scope);
 
                call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
-                       (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)));
+                       (zend_function*)new_op_array, 0,
+                       Z_TYPE(EX(This)) != IS_OBJECT ? Z_CE(EX(This)) : NULL,
+                       Z_TYPE(EX(This)) == IS_OBJECT ? Z_OBJ(EX(This)) : NULL);
 
                if (EX(symbol_table)) {
                        call->symbol_table = EX(symbol_table);
@@ -5814,7 +5820,7 @@ ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
 
        SAVE_OPLINE();
        container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -5906,7 +5912,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV)
 
        SAVE_OPLINE();
        container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -6730,7 +6736,7 @@ ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, CO
        SAVE_OPLINE();
        container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -6869,7 +6875,7 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, C
        SAVE_OPLINE();
        container = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_IS);
 
-       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP2();
                HANDLE_EXCEPTION();
@@ -7509,20 +7515,28 @@ ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, UNUSED)
 {
        USE_OPLINE
        zval *zfunc;
+       zval *object;
+       zend_class_entry *called_scope;
 
        SAVE_OPLINE();
 
        zfunc = zend_hash_find(EG(function_table), Z_STR_P(EX_CONSTANT(opline->op1)));
        ZEND_ASSERT(zfunc != NULL && Z_FUNC_P(zfunc)->type == ZEND_USER_FUNCTION);
 
-       if (UNEXPECTED((Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC) ||
+       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+               called_scope = Z_OBJCE(EX(This));
+               if (UNEXPECTED((Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC) ||
                                (EX(func)->common.fn_flags & ZEND_ACC_STATIC))) {
-               zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
-                       EG(scope), EX(called_scope), NULL);
+                       object = NULL;
+               } else {
+                       object = &EX(This);
+               }
        } else {
-               zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
-                       EG(scope), EX(called_scope), Z_OBJ(EX(This)) ? &EX(This) : NULL);
+               called_scope = Z_CE(EX(This));
+               object = NULL;
        }
+       zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
+               EG(scope), called_scope, object);
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
@@ -8057,6 +8071,7 @@ ZEND_VM_HANDLER(151, ZEND_ASSERT_CHECK, ANY, JMP_ADDR)
 ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, ANY, ANY, CLASS_FETCH)
 {
        uint32_t fetch_type;
+       zend_class_entry *called_scope;
        USE_OPLINE
 
        SAVE_OPLINE();
@@ -8082,7 +8097,12 @@ ZEND_VM_HANDLER(157, ZEND_FETCH_CLASS_NAME, ANY, ANY, CLASS_FETCH)
                        ZVAL_STR_COPY(EX_VAR(opline->result.var), EG(scope)->parent->name);
                        break;
                case ZEND_FETCH_CLASS_STATIC:
-                       ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(called_scope)->name);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               called_scope = Z_OBJCE(EX(This));
+                       } else {
+                               called_scope = Z_CE(EX(This));
+                       }
+                       ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
                        break;
                EMPTY_SWITCH_DEFAULT_CASE()
        }
index 7c3efd49385ff238b0439555da22f16322101b5c..9122529a1a3b08fa8bf8c16ac267417eb748088b 100644 (file)
@@ -1051,8 +1051,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HA
        } else { /* ZEND_OVERLOADED_FUNCTION */
                zval retval;
                /* Not sure what should be done here if it's a static method */
-               object = Z_OBJ(call->This);
-               if (UNEXPECTED(object == NULL)) {
+               if (UNEXPECTED(Z_TYPE(call->This) != IS_OBJECT)) {
                        zend_vm_stack_free_args(call);
                        if (fbc->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
                                zend_string_release(fbc->common.function_name);
@@ -1064,6 +1063,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_UNUSED_HA
                        HANDLE_EXCEPTION();
                }
 
+               object = Z_OBJ(call->This);
                EG(scope) = fbc->common.scope;
 
                ret = 0 ? EX_VAR(opline->result.var) : &retval;
@@ -1246,8 +1246,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_USED_HAND
        } else { /* ZEND_OVERLOADED_FUNCTION */
                zval retval;
                /* Not sure what should be done here if it's a static method */
-               object = Z_OBJ(call->This);
-               if (UNEXPECTED(object == NULL)) {
+               if (UNEXPECTED(Z_TYPE(call->This) != IS_OBJECT)) {
                        zend_vm_stack_free_args(call);
                        if (fbc->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
                                zend_string_release(fbc->common.function_name);
@@ -1259,6 +1258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_FCALL_SPEC_RETVAL_USED_HAND
                        HANDLE_EXCEPTION();
                }
 
+               object = Z_OBJ(call->This);
                EG(scope) = fbc->common.scope;
 
                ret = 1 ? EX_VAR(opline->result.var) : &retval;
@@ -1496,12 +1496,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_ARRAY_SPEC_HANDLER(ZEND_O
                if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
                        OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
                }
-               if (Z_OBJ(EX(call)->This)) {
+               if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
                        OBJ_RELEASE(Z_OBJ(EX(call)->This));
                }
                EX(call)->func = (zend_function*)&zend_pass_function;
-               EX(call)->called_scope = NULL;
                Z_OBJ(EX(call)->This) = NULL;
+               ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)));
        } else {
                uint32_t arg_num;
                HashTable *ht;
@@ -1543,12 +1543,12 @@ send_array:
                                                if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
                                                        OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
                                                }
-                                               if (Z_OBJ(EX(call)->This)) {
+                                               if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
                                                        OBJ_RELEASE(Z_OBJ(EX(call)->This));
                                                }
                                                EX(call)->func = (zend_function*)&zend_pass_function;
-                                               EX(call)->called_scope = NULL;
                                                Z_OBJ(EX(call)->This) = NULL;
+                                               ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)));
 
                                                break;
                                        }
@@ -2025,6 +2025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSERT_CHECK_SPEC_HANDLER(ZEND
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        uint32_t fetch_type;
+       zend_class_entry *called_scope;
        USE_OPLINE
 
        SAVE_OPLINE();
@@ -2050,7 +2051,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_HANDLER(
                        ZVAL_STR_COPY(EX_VAR(opline->result.var), EG(scope)->parent->name);
                        break;
                case ZEND_FETCH_CLASS_STATIC:
-                       ZVAL_STR_COPY(EX_VAR(opline->result.var), EX(called_scope)->name);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               called_scope = Z_OBJCE(EX(This));
+                       } else {
+                               called_scope = Z_CE(EX(This));
+                       }
+                       ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
                        break;
                EMPTY_SWITCH_DEFAULT_CASE()
        }
@@ -3822,7 +3828,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_
        SAVE_OPLINE();
        obj = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                HANDLE_EXCEPTION();
        }
@@ -4082,7 +4088,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN
                new_op_array->scope = EG(scope);
 
                call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
-                       (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)));
+                       (zend_function*)new_op_array, 0,
+                       Z_TYPE(EX(This)) != IS_OBJECT ? Z_CE(EX(This)) : NULL,
+                       Z_TYPE(EX(This)) == IS_OBJECT ? Z_OBJ(EX(This)) : NULL);
 
                if (EX(symbol_table)) {
                        call->symbol_table = EX(symbol_table);
@@ -5581,7 +5589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -5653,7 +5661,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -5728,7 +5736,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_
                property = EX_CONSTANT(opline->op2);
                container = NULL;
 
-               if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -5952,7 +5960,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CO
 
        object = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -6130,7 +6138,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -6139,7 +6147,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -6168,7 +6176,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -6671,7 +6683,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -6810,7 +6822,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -8035,7 +8047,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -8044,7 +8056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -8073,7 +8085,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -8522,20 +8538,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_C
 {
        USE_OPLINE
        zval *zfunc;
+       zval *object;
+       zend_class_entry *called_scope;
 
        SAVE_OPLINE();
 
        zfunc = zend_hash_find(EG(function_table), Z_STR_P(EX_CONSTANT(opline->op1)));
        ZEND_ASSERT(zfunc != NULL && Z_FUNC_P(zfunc)->type == ZEND_USER_FUNCTION);
 
-       if (UNEXPECTED((Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC) ||
+       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+               called_scope = Z_OBJCE(EX(This));
+               if (UNEXPECTED((Z_FUNC_P(zfunc)->common.fn_flags & ZEND_ACC_STATIC) ||
                                (EX(func)->common.fn_flags & ZEND_ACC_STATIC))) {
-               zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
-                       EG(scope), EX(called_scope), NULL);
+                       object = NULL;
+               } else {
+                       object = &EX(This);
+               }
        } else {
-               zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
-                       EG(scope), EX(called_scope), Z_OBJ(EX(This)) ? &EX(This) : NULL);
+               called_scope = Z_CE(EX(This));
+               object = NULL;
        }
+       zend_create_closure(EX_VAR(opline->result.var), Z_FUNC_P(zfunc),
+               EG(scope), called_scope, object);
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
@@ -9388,7 +9412,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -9460,7 +9484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HAN
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -9535,7 +9559,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_
                property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
                container = NULL;
 
-               if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -9759,7 +9783,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_CV
 
        object = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -9937,7 +9961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -9946,7 +9970,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -9975,7 +9999,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -10305,7 +10333,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -10444,7 +10472,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -11291,7 +11319,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -11364,7 +11392,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -11440,7 +11468,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_
                property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
                container = NULL;
 
-               if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
                        HANDLE_EXCEPTION();
@@ -11664,7 +11692,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CONST_TM
 
        object = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -11843,7 +11871,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -11852,7 +11880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -11881,7 +11909,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_C
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -12162,7 +12194,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CON
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -12301,7 +12333,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
        SAVE_OPLINE();
        container = EX_CONSTANT(opline->op1);
 
-       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CONST == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -13754,7 +13786,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN
        SAVE_OPLINE();
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -13829,7 +13861,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO
                property = EX_CONSTANT(opline->op2);
                container = NULL;
 
-               if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -14976,7 +15008,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE
        SAVE_OPLINE();
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -15051,7 +15083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV
                property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
                container = NULL;
 
-               if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -15499,7 +15531,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA
        SAVE_OPLINE();
        container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -15575,7 +15607,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM
                property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
                container = NULL;
 
-               if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_TMP_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
                        HANDLE_EXCEPTION();
@@ -16453,13 +16485,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEN
                                if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
                                        OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
                                }
-                               if (Z_OBJ(EX(call)->This)) {
+                               if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
                                        OBJ_RELEASE(Z_OBJ(EX(call)->This));
                                }
                                ZVAL_UNDEF(param);
                                EX(call)->func = (zend_function*)&zend_pass_function;
-                               EX(call)->called_scope = NULL;
                                Z_OBJ(EX(call)->This) = NULL;
+                               ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)));
 
                                zval_ptr_dtor_nogc(free_op1);
                                ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -17577,7 +17609,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -17637,7 +17669,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -17965,7 +17997,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18043,7 +18075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18207,7 +18239,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18279,7 +18311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN
        property = EX_CONSTANT(opline->op2);
 
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18305,7 +18337,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA
        property = EX_CONSTANT(opline->op2);
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18333,7 +18365,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO
                property = EX_CONSTANT(opline->op2);
                container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-               if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -18365,7 +18397,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18391,7 +18423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18566,7 +18598,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18741,7 +18773,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -18916,7 +18948,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -19620,7 +19652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -19629,7 +19661,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -19658,7 +19690,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -19888,7 +19924,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDL
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -19979,7 +20015,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -20665,7 +20701,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -21507,7 +21543,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -21516,7 +21552,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -21545,7 +21581,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -21938,7 +21978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -21998,7 +22038,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -22326,7 +22366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -22404,7 +22444,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -22568,7 +22608,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -22640,7 +22680,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE
        property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -22666,7 +22706,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL
        property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -22694,7 +22734,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV
                property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
                container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-               if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -22726,7 +22766,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -22752,7 +22792,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -22927,7 +22967,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -23102,7 +23142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -23277,7 +23317,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -24036,7 +24076,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -24045,7 +24085,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -24074,7 +24114,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -24222,7 +24266,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -24313,7 +24357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -24490,7 +24534,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -24550,7 +24594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -24880,7 +24924,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -24959,7 +25003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -25124,7 +25168,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -25197,7 +25241,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA
        property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -25223,7 +25267,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H
        property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -25251,7 +25295,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM
                property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
                container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-               if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
                        HANDLE_EXCEPTION();
@@ -25283,7 +25327,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -25309,7 +25353,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -25484,7 +25528,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -25659,7 +25703,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -25834,7 +25878,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
        SAVE_OPLINE();
        object = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -26482,7 +26526,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -26491,7 +26535,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -26520,7 +26564,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_V
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -26668,7 +26716,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HAND
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -26760,7 +26808,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND
 
        SAVE_OPLINE();
        container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
-       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -26863,7 +26911,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND
        SAVE_OPLINE();
        obj = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                HANDLE_EXCEPTION();
        }
@@ -26967,7 +27015,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -27027,7 +27075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -27325,7 +27373,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -27403,7 +27451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -27476,7 +27524,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -27548,7 +27596,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_
        property = EX_CONSTANT(opline->op2);
 
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -27574,7 +27622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST
        property = EX_CONSTANT(opline->op2);
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -27599,7 +27647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -27674,7 +27722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED
                property = EX_CONSTANT(opline->op2);
                container = _get_obj_zval_ptr_unused(execute_data);
 
-               if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -27706,7 +27754,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -27732,7 +27780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -27907,7 +27955,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -28082,7 +28130,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -28257,7 +28305,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -28495,7 +28543,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
 
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -28673,7 +28721,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -28682,7 +28730,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -28711,7 +28759,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -28891,7 +28943,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HA
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -28982,7 +29034,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -29023,7 +29075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNU
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -29162,7 +29214,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -29611,7 +29663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -29996,7 +30048,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -30005,7 +30057,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -30034,7 +30086,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -30279,7 +30335,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -30339,7 +30395,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -30637,7 +30693,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -30715,7 +30771,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -30788,7 +30844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -30860,7 +30916,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN
        property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -30886,7 +30942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA
        property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -30911,7 +30967,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -30986,7 +31042,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED
                property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
                container = _get_obj_zval_ptr_unused(execute_data);
 
-               if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -31018,7 +31074,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -31044,7 +31100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -31219,7 +31275,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -31394,7 +31450,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -31569,7 +31625,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -31807,7 +31863,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_C
 
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -31985,7 +32041,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -31994,7 +32050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -32023,7 +32079,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -32077,7 +32137,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDL
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -32168,7 +32228,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -32209,7 +32269,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNU
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -32348,7 +32408,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -32530,7 +32590,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -32590,7 +32650,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -32889,7 +32949,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -32968,7 +33028,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -33042,7 +33102,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -33115,7 +33175,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR
        property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -33141,7 +33201,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA
        property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -33166,7 +33226,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -33242,7 +33302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED
                property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
                container = _get_obj_zval_ptr_unused(execute_data);
 
-               if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
                        HANDLE_EXCEPTION();
@@ -33274,7 +33334,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -33300,7 +33360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -33475,7 +33535,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -33650,7 +33710,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -33825,7 +33885,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
        SAVE_OPLINE();
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -34063,7 +34123,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_T
 
        object = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -34242,7 +34302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                        zend_throw_error(NULL, "Cannot call constructor");
                        HANDLE_EXCEPTION();
                }
-               if (Z_OBJ(EX(This)) && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
                        zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
                        HANDLE_EXCEPTION();
                }
@@ -34251,7 +34311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
 
        object = NULL;
        if (!(fbc->common.fn_flags & ZEND_ACC_STATIC)) {
-               if (Z_OBJ(EX(This)) && instanceof_function(Z_OBJCE(EX(This)), ce)) {
+               if (Z_TYPE(EX(This)) == IS_OBJECT && instanceof_function(Z_OBJCE(EX(This)), ce)) {
                        object = Z_OBJ(EX(This));
                        ce = object->ce;
                } else {
@@ -34280,7 +34340,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_U
                /* previous opcode is ZEND_FETCH_CLASS */
                if ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
                    (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
-                       ce = EX(called_scope);
+                       if (Z_TYPE(EX(This)) == IS_OBJECT) {
+                               ce = Z_OBJCE(EX(This));
+                       } else {
+                               ce = Z_CE(EX(This));
+                       }
                }
        }
 
@@ -34334,7 +34398,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_TMPVAR_H
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -34426,7 +34490,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H
 
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -34468,7 +34532,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNU
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -34607,7 +34671,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        SAVE_OPLINE();
        container = _get_obj_zval_ptr_unused(execute_data);
 
-       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -35497,13 +35561,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND
                                if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
                                        OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
                                }
-                               if (Z_OBJ(EX(call)->This)) {
+                               if (Z_TYPE(EX(call)->This) == IS_OBJECT) {
                                        OBJ_RELEASE(Z_OBJ(EX(call)->This));
                                }
                                ZVAL_UNDEF(param);
                                EX(call)->func = (zend_function*)&zend_pass_function;
-                               EX(call)->called_scope = NULL;
                                Z_OBJ(EX(call)->This) = NULL;
+                               ZEND_SET_CALL_INFO(EX(call), 0, ZEND_CALL_INFO(EX(call)));
 
                                ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                        }
@@ -35563,7 +35627,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPC
        SAVE_OPLINE();
        obj = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                HANDLE_EXCEPTION();
        }
@@ -35823,7 +35887,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLE
                new_op_array->scope = EG(scope);
 
                call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
-                       (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)));
+                       (zend_function*)new_op_array, 0,
+                       Z_TYPE(EX(This)) != IS_OBJECT ? Z_CE(EX(This)) : NULL,
+                       Z_TYPE(EX(This)) == IS_OBJECT ? Z_OBJ(EX(This)) : NULL);
 
                if (EX(symbol_table)) {
                        call->symbol_table = EX(symbol_table);
@@ -37078,7 +37144,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -37138,7 +37204,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -37466,7 +37532,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -37544,7 +37610,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -37875,7 +37941,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -37947,7 +38013,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND
        property = EX_CONSTANT(opline->op2);
 
        container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -37973,7 +38039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN
        property = EX_CONSTANT(opline->op2);
        container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -37998,7 +38064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -38073,7 +38139,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON
                property = EX_CONSTANT(opline->op2);
                container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-               if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -38105,7 +38171,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -38226,7 +38292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -38401,7 +38467,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -38576,7 +38642,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -38751,7 +38817,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -39463,7 +39529,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST
 
        object = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -39811,7 +39877,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLE
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -39902,7 +39968,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -40026,7 +40092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -40165,7 +40231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -41377,7 +41443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -43651,7 +43717,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -43711,7 +43777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
 
@@ -44039,7 +44105,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -44117,7 +44183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -44309,7 +44375,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -44381,7 +44447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER
        property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
        container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -44407,7 +44473,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE
        property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
        container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -44432,7 +44498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -44507,7 +44573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_
                property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
                container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-               if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
 
                        HANDLE_EXCEPTION();
@@ -44539,7 +44605,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -44660,7 +44726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -44835,7 +44901,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -45010,7 +45076,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -45185,7 +45251,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -45951,7 +46017,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HA
 
        object = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -46241,7 +46307,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(Z
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -46332,7 +46398,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -46373,7 +46439,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -46512,7 +46578,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -47295,7 +47361,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -47355,7 +47421,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var);
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
@@ -47685,7 +47751,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -47764,7 +47830,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -47957,7 +48023,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -48030,7 +48096,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN
        property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
        container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -48056,7 +48122,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA
        property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
        container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -48081,7 +48147,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -48157,7 +48223,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP
                property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
                container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-               if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+               if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                        zend_throw_error(NULL, "Using $this when not in object context");
                        zval_ptr_dtor_nogc(free_op2);
                        HANDLE_EXCEPTION();
@@ -48189,7 +48255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -48310,7 +48376,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -48485,7 +48551,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -48660,7 +48726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -48835,7 +48901,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -49491,7 +49557,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMPVA
 
        object = _get_zval_ptr_cv_undef(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -49782,7 +49848,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMPVAR_HANDL
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -49874,7 +49940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL
 
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var);
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -49916,7 +49982,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -50055,7 +50121,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        SAVE_OPLINE();
        container = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var);
 
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -50407,7 +50473,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_TMPVAR_HANDLER(ZEND
        SAVE_OPLINE();
        obj = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(obj) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(obj) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                HANDLE_EXCEPTION();
        }
@@ -50568,7 +50634,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMPVAR_HA
                new_op_array->scope = EG(scope);
 
                call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE,
-                       (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This)));
+                       (zend_function*)new_op_array, 0,
+                       Z_TYPE(EX(This)) != IS_OBJECT ? Z_CE(EX(This)) : NULL,
+                       Z_TYPE(EX(This)) == IS_OBJECT ? Z_OBJ(EX(This)) : NULL);
 
                if (EX(symbol_table)) {
                        call->symbol_table = EX(symbol_table);
@@ -51453,7 +51521,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -51715,7 +51783,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
 
        object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -52024,7 +52092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -52163,7 +52231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -53793,7 +53861,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -54055,7 +54123,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_C
 
        object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -54222,7 +54290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -54361,7 +54429,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
 
                HANDLE_EXCEPTION();
@@ -55036,7 +55104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -55299,7 +55367,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMPVAR_T
 
        object = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(object) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(free_op2);
                HANDLE_EXCEPTION();
@@ -55467,7 +55535,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
@@ -55606,7 +55674,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        SAVE_OPLINE();
        container = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
 
-       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_OBJ_P(container) == NULL)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) {
                zend_throw_error(NULL, "Using $this when not in object context");
                zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
                HANDLE_EXCEPTION();
index 68aa136d90de4ffd6ecf65d18ec1488afd64a617..dd3bd6e94d9e56fc038f7acacc957f7ae08ff550 100644 (file)
@@ -88,7 +88,7 @@ ZEND_DECLARE_MODULE_GLOBALS(reflection)
 /* Method macros */
 
 #define METHOD_NOTSTATIC(ce)                                                                                \
-       if (!Z_OBJ(EX(This)) || !instanceof_function(Z_OBJCE(EX(This)), ce)) {           \
+       if ((Z_TYPE(EX(This)) != IS_OBJECT) || !instanceof_function(Z_OBJCE(EX(This)), ce)) {           \
                php_error_docref(NULL, E_ERROR, "%s() cannot be called statically", get_active_function_name());        \
                return;                                                                                             \
        }                                                                                                       \
@@ -2316,7 +2316,7 @@ ZEND_METHOD(reflection_generator, getThis)
 
        REFLECTION_CHECK_VALID_GENERATOR(ex)
 
-       if (Z_OBJ(ex->This)) {
+       if (Z_TYPE(ex->This) == IS_OBJECT) {
                ZVAL_COPY(return_value, &ex->This);
        } else {
                ZVAL_NULL(return_value);