]> granicus.if.org Git - php/commitdiff
Fixed ISSET/ISEMPTY bit meaning to simplify run-time checks
authorDmitry Stogov <dmitry@zend.com>
Thu, 31 May 2018 16:02:51 +0000 (19:02 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 31 May 2018 16:02:51 +0000 (19:02 +0300)
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
Zend/zend_vm_gen.php
Zend/zend_vm_handlers.h
ext/opcache/Optimizer/compact_literals.c
ext/opcache/Optimizer/sccp.c
ext/opcache/Optimizer/zend_dump.c
ext/opcache/Optimizer/zend_optimizer.c

index 64f798f31c96918688cd70c114856d6ba7437e83..f78e37acc5926dbded1ff10533d537d9f805ae45 100644 (file)
@@ -7526,8 +7526,8 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */
        }
 
        result->op_type = opline->result_type = IS_TMP_VAR;
-       if (ast->kind == ZEND_AST_ISSET) {
-               opline->extended_value |= ZEND_ISSET;
+       if (!(ast->kind == ZEND_AST_ISSET)) {
+               opline->extended_value |= ZEND_ISEMPTY;
        }
 }
 /* }}} */
index 532534736d0d4d5b8e273b604e743d9079bb040e..6747effb85aa8d66cf259ac3860d8bab6952d778 100644 (file)
@@ -875,7 +875,7 @@ void zend_assert_valid_class_name(const zend_string *const_name);
 
 #define ZEND_FETCH_TYPE_MASK   0xe
 
-#define ZEND_ISSET                             (1<<0)
+#define ZEND_ISEMPTY                   (1<<0)
 
 #define ZEND_LAST_CATCH                        (1<<0)
 
index f18eb68c1c3b5d9b00f688e0701dd37e2c26b0cb..fc6c547750563faa120f7b1ff659180c1e70d820 100644 (file)
@@ -6125,7 +6125,7 @@ ZEND_VM_HOT_HANDLER(197, ZEND_ISSET_ISEMPTY_CV, CV, UNUSED, ISSET, SPEC(ISSET))
        int result;
 
        value = EX_VAR(opline->op1.var);
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result =
                        Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -6162,18 +6162,27 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
-       value = zend_hash_find_ex_ind(target_symbol_table, name, OP1_TYPE == IS_CONST);
+       value = zend_hash_find_ex(target_symbol_table, name, OP1_TYPE == IS_CONST);
 
        if (OP1_TYPE != IS_CONST) {
                zend_tmp_string_release(tmp_name);
        }
        FREE_OP1();
 
-       if (opline->extended_value & ZEND_ISSET) {
-               result = value && Z_TYPE_P(value) > IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+       if (!value) {
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
-               result = !value || !i_zend_is_true(value);
+               if (Z_TYPE_P(value) == IS_INDIRECT) {
+                       value = Z_INDIRECT_P(value);
+               }
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
+                       if (Z_ISREF_P(value)) {
+                               value = Z_REFVAL_P(value);
+                       }
+                       result = Z_TYPE_P(value) > IS_NULL;
+               } else {
+                       result = !i_zend_is_true(value);
+               }
        }
 
        ZEND_VM_SMART_BRANCH(result, 1);
@@ -6193,10 +6202,10 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
 
        SAVE_OPLINE();
        if (OP2_TYPE == IS_CONST) {
-               if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        ZEND_VM_C_GOTO(is_static_prop_return);
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -6204,7 +6213,7 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
                                HANDLE_EXCEPTION();
                        }
                        if (OP1_TYPE != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -6220,9 +6229,9 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if (OP1_TYPE == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        ZEND_VM_C_GOTO(is_static_prop_return);
                }
        }
@@ -6237,7 +6246,7 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
        value = zend_std_get_static_property(ce, name, 1);
 
        if (OP1_TYPE == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if (OP1_TYPE != IS_CONST) {
@@ -6246,7 +6255,7 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
        FREE_OP1();
 
 ZEND_VM_C_LABEL(is_static_prop_return):
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -6298,7 +6307,7 @@ ZEND_VM_C_LABEL(num_index_prop):
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -6313,7 +6322,7 @@ ZEND_VM_C_LABEL(num_index_prop):
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -6358,11 +6367,11 @@ ZEND_VM_COLD_CONST_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 ZEND_VM_C_LABEL(isset_no_object):
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
        FREE_OP2();
@@ -7876,9 +7885,8 @@ ZEND_VM_HANDLER(186, ZEND_ISSET_ISEMPTY_THIS, UNUSED, UNUSED)
        USE_OPLINE
 
        ZVAL_BOOL(EX_VAR(opline->result.var),
-               (opline->extended_value & ZEND_ISSET) ?
-                        (Z_TYPE(EX(This)) == IS_OBJECT) :
-                        (Z_TYPE(EX(This)) != IS_OBJECT));
+               (opline->extended_value & ZEND_ISEMPTY) ^
+                (Z_TYPE(EX(This)) == IS_OBJECT));
        ZEND_VM_NEXT_OPCODE();
 }
 
index c16b54b0d06c8d3b5b060c563bf38d6dda4a538a..e19f1159a3b0cb80cf63f1467c5b5e6f2c3582e3 100644 (file)
@@ -5657,10 +5657,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_CONST == IS_CONST) {
-               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -5668,7 +5668,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if (IS_CONST != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -5684,9 +5684,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if (IS_CONST == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -5701,7 +5701,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CONST == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if (IS_CONST != IS_CONST) {
@@ -5709,7 +5709,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        }
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -5761,7 +5761,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -5776,7 +5776,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -5821,11 +5821,11 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PRO
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
 
@@ -7649,7 +7649,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -7664,7 +7664,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -7709,11 +7709,11 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PRO
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
        zval_ptr_dtor_nogc(free_op2);
@@ -8051,10 +8051,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_VAR == IS_CONST) {
-               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -8062,7 +8062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if (IS_CONST != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -8078,9 +8078,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if (IS_CONST == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -8095,7 +8095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CONST == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if (IS_CONST != IS_CONST) {
@@ -8103,7 +8103,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        }
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -8994,17 +8994,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
-       value = zend_hash_find_ex_ind(target_symbol_table, name, IS_CONST == IS_CONST);
+       value = zend_hash_find_ex(target_symbol_table, name, IS_CONST == IS_CONST);
 
        if (IS_CONST != IS_CONST) {
                zend_tmp_string_release(tmp_name);
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
-               result = value && Z_TYPE_P(value) > IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+       if (!value) {
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
-               result = !value || !i_zend_is_true(value);
+               if (Z_TYPE_P(value) == IS_INDIRECT) {
+                       value = Z_INDIRECT_P(value);
+               }
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
+                       if (Z_ISREF_P(value)) {
+                               value = Z_REFVAL_P(value);
+                       }
+                       result = Z_TYPE_P(value) > IS_NULL;
+               } else {
+                       result = !i_zend_is_true(value);
+               }
        }
 
        ZEND_VM_SMART_BRANCH(result, 1);
@@ -9024,10 +9033,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_UNUSED == IS_CONST) {
-               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -9035,7 +9044,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if (IS_CONST != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -9051,9 +9060,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if (IS_CONST == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -9068,7 +9077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CONST == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if (IS_CONST != IS_CONST) {
@@ -9076,7 +9085,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        }
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -10707,7 +10716,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -10722,7 +10731,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -10767,11 +10776,11 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PRO
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
 
@@ -14096,10 +14105,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_CONST == IS_CONST) {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -14107,7 +14116,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -14123,9 +14132,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -14140,7 +14149,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
@@ -14149,7 +14158,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval_ptr_dtor_nogc(free_op1);
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -14201,7 +14210,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -14216,7 +14225,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -14261,11 +14270,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
        zval_ptr_dtor_nogc(free_op1);
@@ -15657,7 +15666,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -15672,7 +15681,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -15717,11 +15726,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
        zval_ptr_dtor_nogc(free_op2);
@@ -15923,10 +15932,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_VAR == IS_CONST) {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -15934,7 +15943,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -15950,9 +15959,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -15967,7 +15976,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
@@ -15976,7 +15985,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval_ptr_dtor_nogc(free_op1);
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -16389,18 +16398,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
-       value = zend_hash_find_ex_ind(target_symbol_table, name, (IS_TMP_VAR|IS_VAR) == IS_CONST);
+       value = zend_hash_find_ex(target_symbol_table, name, (IS_TMP_VAR|IS_VAR) == IS_CONST);
 
        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
                zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
 
-       if (opline->extended_value & ZEND_ISSET) {
-               result = value && Z_TYPE_P(value) > IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+       if (!value) {
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
-               result = !value || !i_zend_is_true(value);
+               if (Z_TYPE_P(value) == IS_INDIRECT) {
+                       value = Z_INDIRECT_P(value);
+               }
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
+                       if (Z_ISREF_P(value)) {
+                               value = Z_REFVAL_P(value);
+                       }
+                       result = Z_TYPE_P(value) > IS_NULL;
+               } else {
+                       result = !i_zend_is_true(value);
+               }
        }
 
        ZEND_VM_SMART_BRANCH(result, 1);
@@ -16420,10 +16438,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_UNUSED == IS_CONST) {
-               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -16431,7 +16449,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -16447,9 +16465,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -16464,7 +16482,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
@@ -16473,7 +16491,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval_ptr_dtor_nogc(free_op1);
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -17507,7 +17525,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -17522,7 +17540,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -17567,11 +17585,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
        zval_ptr_dtor_nogc(free_op1);
@@ -31912,11 +31930,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
 
@@ -33546,11 +33564,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
        zval_ptr_dtor_nogc(free_op2);
@@ -34295,9 +34313,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_THIS_SPEC_UNUSED
        USE_OPLINE
 
        ZVAL_BOOL(EX_VAR(opline->result.var),
-               (opline->extended_value & ZEND_ISSET) ?
-                        (Z_TYPE(EX(This)) == IS_OBJECT) :
-                        (Z_TYPE(EX(This)) != IS_OBJECT));
+               (opline->extended_value & ZEND_ISEMPTY) ^
+                (Z_TYPE(EX(This)) == IS_OBJECT));
        ZEND_VM_NEXT_OPCODE();
 }
 
@@ -35909,11 +35926,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
 
@@ -40938,10 +40955,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_CONST == IS_CONST) {
-               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -40949,7 +40966,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if (IS_CV != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -40965,9 +40982,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if (IS_CV == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -40982,7 +40999,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CV == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if (IS_CV != IS_CONST) {
@@ -40990,7 +41007,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        }
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -41042,7 +41059,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -41057,7 +41074,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -41102,11 +41119,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
 
@@ -44582,7 +44599,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -44597,7 +44614,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -44642,11 +44659,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
        zval_ptr_dtor_nogc(free_op2);
@@ -45219,10 +45236,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_VAR == IS_CONST) {
-               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -45230,7 +45247,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if (IS_CV != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -45246,9 +45263,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if (IS_CV == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -45263,7 +45280,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CV == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if (IS_CV != IS_CONST) {
@@ -45271,7 +45288,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        }
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -46557,14 +46574,14 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zval *value;
        int result;
 
        value = EX_VAR(opline->op1.var);
-       if (0) {
+       if (!(0)) {
                result =
                        Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -46582,14 +46599,14 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_S
        ZEND_VM_CONTINUE();
 }
 
-static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
        zval *value;
        int result;
 
        value = EX_VAR(opline->op1.var);
-       if (1) {
+       if (!(1)) {
                result =
                        Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -46626,17 +46643,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUS
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value EXECUTE_DATA_CC);
-       value = zend_hash_find_ex_ind(target_symbol_table, name, IS_CV == IS_CONST);
+       value = zend_hash_find_ex(target_symbol_table, name, IS_CV == IS_CONST);
 
        if (IS_CV != IS_CONST) {
                zend_tmp_string_release(tmp_name);
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
-               result = value && Z_TYPE_P(value) > IS_NULL &&
-                   (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
+       if (!value) {
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
-               result = !value || !i_zend_is_true(value);
+               if (Z_TYPE_P(value) == IS_INDIRECT) {
+                       value = Z_INDIRECT_P(value);
+               }
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
+                       if (Z_ISREF_P(value)) {
+                               value = Z_REFVAL_P(value);
+                       }
+                       result = Z_TYPE_P(value) > IS_NULL;
+               } else {
+                       result = !i_zend_is_true(value);
+               }
        }
 
        ZEND_VM_SMART_BRANCH(result, 1);
@@ -46656,10 +46682,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 
        SAVE_OPLINE();
        if (IS_UNUSED == IS_CONST) {
-               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) != NULL)) {
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+               if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) != NULL)) {
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
-               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISSET)) == NULL)) {
+               } else if (UNEXPECTED((ce = CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY)) == NULL)) {
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
@@ -46667,7 +46693,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                                HANDLE_EXCEPTION();
                        }
                        if (IS_CV != IS_CONST) {
-                               CACHE_PTR(opline->extended_value & ~ZEND_ISSET, ce);
+                               CACHE_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce);
                        }
                }
        } else {
@@ -46683,9 +46709,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = Z_CE_P(EX_VAR(opline->op2.var));
                }
                if (IS_CV == IS_CONST &&
-                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISSET) == ce)) {
+                   EXPECTED(CACHED_PTR(opline->extended_value & ~ZEND_ISEMPTY) == ce)) {
 
-                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISSET) + sizeof(void*));
+                       value = CACHED_PTR((opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*));
                        goto is_static_prop_return;
                }
        }
@@ -46700,7 +46726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CV == IS_CONST && value) {
-               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISSET, ce, value);
+               CACHE_POLYMORPHIC_PTR(opline->extended_value & ~ZEND_ISEMPTY, ce, value);
        }
 
        if (IS_CV != IS_CONST) {
@@ -46708,7 +46734,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        }
 
 is_static_prop_return:
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = value && Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
        } else {
@@ -50187,7 +50213,7 @@ num_index_prop:
                        value = zend_find_array_dim_slow(ht, offset EXECUTE_DATA_CC);
                }
 
-               if (opline->extended_value & ZEND_ISSET) {
+               if (!(opline->extended_value & ZEND_ISEMPTY)) {
                        /* > IS_NULL means not IS_UNDEF and not IS_NULL */
                        result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
                            (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
@@ -50202,7 +50228,7 @@ num_index_prop:
                }
        }
 
-       if (opline->extended_value & ZEND_ISSET) {
+       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                result = zend_isset_dim_slow(container, offset EXECUTE_DATA_CC);
        } else {
                result = zend_isempty_dim_slow(container, offset EXECUTE_DATA_CC);
@@ -50247,11 +50273,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
        if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) {
                zend_wrong_property_check(offset);
 isset_no_object:
-               result = ((opline->extended_value & ZEND_ISSET) == 0);
+               result = (opline->extended_value & ZEND_ISEMPTY);
        } else {
                result =
-                       ((opline->extended_value & ZEND_ISSET) == 0) ^
-                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISSET) : NULL));
+                       (opline->extended_value & ZEND_ISEMPTY) ^
+                       Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISEMPTY), ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_ISEMPTY) : NULL));
        }
 
 
@@ -53443,8 +53469,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                        (void*)&&ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_UNSET_CV_SPEC_CV_UNUSED_LABEL,
-                       (void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_LABEL,
                        (void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_LABEL,
+                       (void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
                        (void*)&&ZEND_NULL_LABEL,
@@ -59113,14 +59139,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
                                VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED)
                                ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
-                       HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY):
-                               VM_TRACE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY)
-                               ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
-                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET):
                                VM_TRACE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET)
                                ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                HYBRID_BREAK();
+                       HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY):
+                               VM_TRACE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY)
+                               ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+                               HYBRID_BREAK();
                        HYBRID_CASE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED):
                                VM_TRACE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED)
                                ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -62607,8 +62633,8 @@ void zend_vm_init(void)
                ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_UNSET_CV_SPEC_CV_UNUSED_HANDLER,
-               ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER,
                ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER,
+               ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_NULL_HANDLER,
                ZEND_NULL_HANDLER,
@@ -63848,7 +63874,7 @@ static const void* ZEND_FASTCALL zend_vm_get_opcode_handler_ex(uint32_t spec, co
                                offset += 2;
                        }
                }
-               else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISSET);
+               else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);
        }
        return zend_opcode_handlers[(spec & SPEC_START_MASK) + offset];
 }
@@ -63898,7 +63924,7 @@ static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend
                                offset += 2;
                        }
                }
-               else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISSET);
+               else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);
        }
        return zend_opcode_handler_funcs[(spec & SPEC_START_MASK) + offset];
 }
index 48540627a46c1c058367096fdb221633a68b3269..a3db82acdf9094a009b8d4220a3f23e18b7c2850 100644 (file)
@@ -792,8 +792,8 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp
                        "/opline->extended_value\s*==\s*0/",
                        "/opline->extended_value\s*==\s*ZEND_ASSIGN_DIM/",
                        "/opline->extended_value\s*==\s*ZEND_ASSIGN_OBJ/",
-                       "/opline->extended_value\s*&\s*ZEND_ISSET/",
-                       "/opline->extended_value\s*&\s*~\s*ZEND_ISSET/",
+                       "/opline->extended_value\s*&\s*ZEND_ISEMPTY/",
+                       "/opline->extended_value\s*&\s*~\s*ZEND_ISEMPTY/",
                ),
                array(
                        $op1_type[$op1],
@@ -864,7 +864,7 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp
                                ($extra_spec['ISSET'] == 0 ? "0" : "1")
                                : "\\0",
                        isset($extra_spec['ISSET']) ?
-                               ($extra_spec['ISSET'] == 0 ? "opline->extended_value" : "\\0")
+                               ($extra_spec['ISSET'] == 0 ? "\\0" : "opline->extended_value")
                                : "\\0",
                ),
                $code);
@@ -1518,9 +1518,9 @@ function extra_spec_name($extra_spec) {
        }
        if (isset($extra_spec["ISSET"])) {
                if ($extra_spec["ISSET"] == 0) {
-                       $s .= "_EMPTY";
-               } else {
                        $s .= "_SET";
+               } else {
+                       $s .= "_EMPTY";
                }
        }
        return $s;
@@ -2659,7 +2659,7 @@ function gen_vm($def, $skel) {
                                $else = "else ";
                        }
                        if (isset($used_extra_spec["ISSET"])) {
-                               out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISSET);\n");
+                               out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);\n");
                                $else = "else ";
                        }
                        out($f, "\t}\n");
@@ -2747,7 +2747,7 @@ function gen_vm($def, $skel) {
                                        $else = "else ";
                                }
                                if (isset($used_extra_spec["ISSET"])) {
-                                       out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISSET);\n");
+                                       out($f, "\t\t{$else}if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISEMPTY);\n");
                                        $else = "else ";
                                }
                                out($f, "\t}\n");
index 46a4787ae5784d2ea1ebe1d58fe1c6de562bc9f8..6f0aaae320cc93e7701eac0a165e7f53d07985b6 100644 (file)
        _(3014, ZEND_FUNC_GET_ARGS_SPEC_CONST_UNUSED) \
        _(3017, ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED) \
        _(3019, ZEND_UNSET_CV_SPEC_CV_UNUSED) \
-       _(3020, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \
-       _(3021, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \
+       _(3020, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) \
+       _(3021, ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) \
        _(3032, ZEND_FETCH_LIST_W_SPEC_VAR_CONST) \
        _(3033, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
        _(3034, ZEND_FETCH_LIST_W_SPEC_VAR_TMPVAR) \
index d9e5f919e9dfd10dbbe3212a55fe5d2304cb9b16..ecdbbd5574d5c5c1b780066e97414a394e591864 100644 (file)
@@ -536,12 +536,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
                                                // op2 property
                                                if (opline->op1_type == IS_UNUSED &&
                                                    property_slot[opline->op2.constant] >= 0) {
-                                                       opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_ISSET);
+                                                       opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_ISEMPTY);
                                                } else {
-                                                       opline->extended_value = cache_size | (opline->extended_value & ZEND_ISSET);
+                                                       opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY);
                                                        cache_size += 2 * sizeof(void *);
                                                        if (opline->op1_type == IS_UNUSED) {
-                                                               property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_ISSET;
+                                                               property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_ISEMPTY;
                                                        }
                                                }
                                        }
@@ -668,19 +668,19 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx
                                                                opline->op2.constant,
                                                                opline->op1.constant,
                                                                LITERAL_STATIC_PROPERTY,
-                                                               &cache_size) | (opline->extended_value & ZEND_ISSET);
+                                                               &cache_size) | (opline->extended_value & ZEND_ISEMPTY);
                                                } else {
-                                                       opline->extended_value = cache_size | (opline->extended_value & ZEND_ISSET);
+                                                       opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY);
                                                        cache_size += 2 * sizeof(void *);
                                                }
                                        } else if (opline->op2_type == IS_CONST) {
                                                // op2 class
                                                if (class_slot[opline->op2.constant] >= 0) {
-                                                       opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & ZEND_ISSET);
+                                                       opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & ZEND_ISEMPTY);
                                                } else {
-                                                       opline->extended_value = cache_size | (opline->extended_value & ZEND_ISSET);
+                                                       opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY);
                                                        cache_size += sizeof(void *);
-                                                       class_slot[opline->op2.constant] = opline->extended_value & ~ZEND_ISSET;
+                                                       class_slot[opline->op2.constant] = opline->extended_value & ~ZEND_ISEMPTY;
                                                }
                                        }
                                        break;
index 23c5d5ac534032803c84062a04e45aa95b770b96..5511313fae76851af824055243ad6134a6413e73 100644 (file)
@@ -428,7 +428,7 @@ static inline int ct_eval_isset_dim(zval *result, uint32_t extended_value, zval
                if (IS_PARTIAL_ARRAY(op1) && (!value || IS_BOT(value))) {
                        return FAILURE;
                }
-               if (extended_value & ZEND_ISSET) {
+               if (!(extended_value & ZEND_ISEMPTY)) {
                        ZVAL_BOOL(result, value && Z_TYPE_P(value) != IS_NULL);
                } else {
                        ZVAL_BOOL(result, !value || !zend_is_true(value));
@@ -438,7 +438,7 @@ static inline int ct_eval_isset_dim(zval *result, uint32_t extended_value, zval
                // TODO
                return FAILURE;
        } else {
-               ZVAL_BOOL(result, !(extended_value & ZEND_ISSET));
+               ZVAL_BOOL(result, (extended_value & ZEND_ISEMPTY));
                return SUCCESS;
        }
 }
@@ -585,14 +585,14 @@ static inline int ct_eval_isset_obj(zval *result, uint32_t extended_value, zval
                if (!value || IS_BOT(value)) {
                        return FAILURE;
                }
-               if (extended_value & ZEND_ISSET) {
+               if (!(extended_value & ZEND_ISEMPTY)) {
                        ZVAL_BOOL(result, value && Z_TYPE_P(value) != IS_NULL);
                } else {
                        ZVAL_BOOL(result, !value || !zend_is_true(value));
                }
                return SUCCESS;
        } else {
-               ZVAL_BOOL(result, !(extended_value & ZEND_ISSET));
+               ZVAL_BOOL(result, (extended_value & ZEND_ISEMPTY));
                return SUCCESS;
        }
 }
@@ -651,7 +651,7 @@ static inline int ct_eval_incdec(zval *result, zend_uchar opcode, zval *op1) {
 }
 
 static inline int ct_eval_isset_isempty(zval *result, uint32_t extended_value, zval *op1) {
-       if (extended_value & ZEND_ISSET) {
+       if (!(extended_value & ZEND_ISEMPTY)) {
                ZVAL_BOOL(result, Z_TYPE_P(op1) != IS_NULL);
        } else {
                ZVAL_BOOL(result, !zend_is_true(op1));
index e4516b59ccb6e0a3dc863c55b216cef5ce33f779..fea4595963b10df656e7ddea751935b7d263c823 100644 (file)
@@ -568,7 +568,7 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *
                        }
                }
                if (ZEND_VM_EXT_ISSET & flags) {
-                       if (opline->extended_value & ZEND_ISSET) {
+                       if (!(opline->extended_value & ZEND_ISEMPTY)) {
                                fprintf(stderr, " (isset)");
                        } else {
                                fprintf(stderr, " (empty)");
index ffc04854e27ef31bddc849771ff7825b0b624936..89f57a029ec0f570efcd31a6fc7503fc9fd54ee4 100644 (file)
@@ -328,10 +328,10 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array,
                case ZEND_ISSET_ISEMPTY_STATIC_PROP:
                        TO_STRING_NOWARN(val);
                        opline->op1.constant = zend_optimizer_add_literal(op_array, val);
-                       if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_ISSET) + sizeof(void*) == op_array->cache_size) {
+                       if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*) == op_array->cache_size) {
                                op_array->cache_size += sizeof(void *);
                        } else {
-                               opline->extended_value = alloc_cache_slots(op_array, 2) | (opline->extended_value & ZEND_ISSET);
+                               opline->extended_value = alloc_cache_slots(op_array, 2) | (opline->extended_value & ZEND_ISEMPTY);
                        }
                        break;
                case ZEND_SEND_VAR:
@@ -426,7 +426,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array,
                        opline->op2.constant = zend_optimizer_add_literal(op_array, val);
                        zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val)));
                        if (opline->op1_type != IS_CONST) {
-                               opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & ZEND_ISSET);
+                               opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & ZEND_ISEMPTY);
                        }
                        break;
                case ZEND_INIT_FCALL:
@@ -495,7 +495,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array,
                case ZEND_ISSET_ISEMPTY_PROP_OBJ:
                        TO_STRING_NOWARN(val);
                        opline->op2.constant = zend_optimizer_add_literal(op_array, val);
-                       opline->extended_value = alloc_cache_slots(op_array, 2) | (opline->extended_value & ZEND_ISSET);
+                       opline->extended_value = alloc_cache_slots(op_array, 2) | (opline->extended_value & ZEND_ISEMPTY);
                        break;
                case ZEND_ASSIGN_ADD:
                case ZEND_ASSIGN_SUB: