]> granicus.if.org Git - php/commitdiff
Change FETCH/ISSET instruction modifiers:
authorDmitry Stogov <dmitry@zend.com>
Tue, 30 Jan 2018 19:06:05 +0000 (22:06 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 30 Jan 2018 19:06:05 +0000 (22:06 +0300)
- Get rid of ZEND_ISEMPTY and ZEND_ISSET_ISEMPTY_MASK. Use just single ZEND_ISSET bit to make distinct between isset() and empty()
- Use ZEND_FETCH_GLOBAL, ZEND_FETCH_LOCAL and ZEND_FETCH_GLOBAL_LOCK as bitmask
- Removed unused ZEND_FETCH_STANDARD
- Extended ZEND_FETCH_ARG_MASK

Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/opcache/Optimizer/sccp.c
ext/opcache/Optimizer/zend_cfg.c
ext/opcache/Optimizer/zend_dump.c

index e6a34371a3a3311788ed9a3029e8d10f92a5a142..226d44030069da77c2af19a44e600db8320a688c 100644 (file)
@@ -7571,7 +7571,7 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */
        }
 
        result->op_type = opline->result_type = IS_TMP_VAR;
-       opline->extended_value |= ast->kind == ZEND_AST_ISSET ? ZEND_ISSET : ZEND_ISEMPTY;
+       opline->extended_value |= ast->kind == ZEND_AST_ISSET ? ZEND_ISSET : 0;
 }
 /* }}} */
 
index f53cc18c15b9a1d3c2f43d0fd13d9b00fbe5d2d2..44fe1f30740005c2a395f23526ea9b6a1f336943 100644 (file)
@@ -867,19 +867,15 @@ void zend_assert_valid_class_name(const zend_string *const_name);
 #define ZEND_RT (1<<1)
 
 /* global/local fetches */
-#define ZEND_FETCH_GLOBAL                      0x00000000
-#define ZEND_FETCH_LOCAL                       0x10000000
+#define ZEND_FETCH_GLOBAL                      0x10000000
+#define ZEND_FETCH_LOCAL                       0x20000000
 #define ZEND_FETCH_GLOBAL_LOCK         0x40000000
 
 #define ZEND_FETCH_TYPE_MASK           0x70000000
 
-#define ZEND_FETCH_STANDARD                0x00000000
+#define ZEND_ISSET                                 0x00000001
 
-#define ZEND_ISSET                                 0x02000000
-#define ZEND_ISEMPTY                       0x01000000
-#define ZEND_ISSET_ISEMPTY_MASK            (ZEND_ISSET | ZEND_ISEMPTY)
-
-#define ZEND_FETCH_ARG_MASK         0x000fffff
+#define ZEND_FETCH_ARG_MASK         0x0fffffff
 
 #define ZEND_FREE_ON_RETURN     (1<<0)
 
index c660988f9cad56e8472734fe4cb3c0104b2f202b..50d518cefccb05171fa6b8d597ba9056c74db594 100644 (file)
@@ -1519,11 +1519,10 @@ static zend_always_inline HashTable *zend_get_target_symbol_table(int fetch_type
 {
        HashTable *ht;
 
-       if (EXPECTED(fetch_type == ZEND_FETCH_GLOBAL_LOCK) ||
-           EXPECTED(fetch_type == ZEND_FETCH_GLOBAL)) {
+       if (EXPECTED(fetch_type & (ZEND_FETCH_GLOBAL_LOCK | ZEND_FETCH_GLOBAL))) {
                ht = &EG(symbol_table);
        } else {
-               ZEND_ASSERT(fetch_type == ZEND_FETCH_LOCAL);
+               ZEND_ASSERT(fetch_type & ZEND_FETCH_LOCAL);
                if (!(EX_CALL_INFO() & ZEND_CALL_HAS_SYMBOL_TABLE)) {
                        zend_rebuild_symbol_table();
                }
index 52e56a9761e2d27ce500795d5437184851caf3b4..596d0448d8133812b14b34df7794d316e8d12977 100644 (file)
@@ -1450,7 +1450,7 @@ ZEND_VM_C_LABEL(fetch_this):
                }
        }
 
-       if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) {
+       if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
                FREE_OP1();
        }
 
@@ -6197,7 +6197,7 @@ ZEND_VM_HANDLER(197, ZEND_ISSET_ISEMPTY_CV, CV, UNUSED, ISSET)
                result =
                        Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                SAVE_OPLINE();
                result = !i_zend_is_true(value);
                if (UNEXPECTED(EG(exception))) {
@@ -6240,7 +6240,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -6330,7 +6330,7 @@ ZEND_VM_C_LABEL(is_static_prop_return):
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -6404,7 +6404,7 @@ ZEND_VM_C_LABEL(num_index_prop):
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                ZEND_VM_C_GOTO(isset_dim_obj_exit);
index ad7f3ba40d65ddb62f984450faad7509ee81e439..40341937fdffc5cf9282e79f14ab09635ba20111 100644 (file)
@@ -5967,7 +5967,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -6041,7 +6041,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
@@ -8027,7 +8027,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
@@ -8535,7 +8535,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -8794,7 +8794,7 @@ fetch_this:
                }
        }
 
-       if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) {
+       if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
 
        }
 
@@ -9383,7 +9383,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -9472,7 +9472,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -11217,7 +11217,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
@@ -14710,7 +14710,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -14784,7 +14784,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
@@ -16247,7 +16247,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
@@ -16617,7 +16617,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -16784,7 +16784,7 @@ fetch_this:
                }
        }
 
-       if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) {
+       if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
                zval_ptr_dtor_nogc(free_op1);
        }
 
@@ -17029,7 +17029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -17119,7 +17119,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -18171,7 +18171,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
@@ -42947,7 +42947,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -43021,7 +43021,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
@@ -46708,7 +46708,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
@@ -47457,7 +47457,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -47932,7 +47932,7 @@ fetch_this:
                }
        }
 
-       if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_GLOBAL_LOCK) {
+       if (!(opline->extended_value & ZEND_FETCH_GLOBAL_LOCK)) {
 
        }
 
@@ -48771,7 +48771,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSE
                result =
                        Z_TYPE_P(value) > IS_NULL &&
                    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                SAVE_OPLINE();
                result = !i_zend_is_true(value);
                if (UNEXPECTED(EG(exception))) {
@@ -48813,7 +48813,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUS
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -48902,7 +48902,7 @@ is_static_prop_return:
        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);
-       } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+       } else {
                result = !value || !i_zend_is_true(value);
        }
 
@@ -52545,7 +52545,7 @@ num_index_prop:
                        /* > 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);
-               } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
+               } else {
                        result = (value == NULL || !i_zend_is_true(value));
                }
                goto isset_dim_obj_exit;
index 07fdeee7089b0ac6d4eb9eab61798c814c00b5a3..0e84c1a337a3939a3942255d414ad337f6366414 100644 (file)
@@ -430,7 +430,6 @@ static inline int ct_eval_isset_dim(zval *result, uint32_t extended_value, zval
                if (extended_value & ZEND_ISSET) {
                        ZVAL_BOOL(result, value && Z_TYPE_P(value) != IS_NULL);
                } else {
-                       ZEND_ASSERT(extended_value & ZEND_ISEMPTY);
                        ZVAL_BOOL(result, !value || !zend_is_true(value));
                }
                return SUCCESS;
@@ -588,7 +587,6 @@ static inline int ct_eval_isset_obj(zval *result, uint32_t extended_value, zval
                if (extended_value & ZEND_ISSET) {
                        ZVAL_BOOL(result, value && Z_TYPE_P(value) != IS_NULL);
                } else {
-                       ZEND_ASSERT(extended_value & ZEND_ISEMPTY);
                        ZVAL_BOOL(result, !value || !zend_is_true(value));
                }
                return SUCCESS;
@@ -655,7 +653,6 @@ static inline int ct_eval_isset_isempty(zval *result, uint32_t extended_value, z
        if (extended_value & ZEND_ISSET) {
                ZVAL_BOOL(result, Z_TYPE_P(op1) != IS_NULL);
        } else {
-               ZEND_ASSERT(extended_value & ZEND_ISEMPTY);
                ZVAL_BOOL(result, !zend_is_true(op1));
        }
        return SUCCESS;
index 570ef5670733945cba67d9d0b6f3a22a4a731745..77371c97c2373483253c57af5fce237a28062d40 100644 (file)
@@ -416,10 +416,9 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                        }
                        case ZEND_UNSET_VAR:
                        case ZEND_ISSET_ISEMPTY_VAR:
-                               if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_LOCAL) {
+                               if (opline->extended_value & ZEND_FETCH_LOCAL) {
                                        flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
-                               } else if (((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_GLOBAL ||
-                                           (opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_GLOBAL_LOCK) &&
+                               } else if ((opline->extended_value & (ZEND_FETCH_GLOBAL | ZEND_FETCH_GLOBAL_LOCK)) &&
                                           !op_array->function_name) {
                                        flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
                                }
@@ -430,10 +429,9 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                        case ZEND_FETCH_FUNC_ARG:
                        case ZEND_FETCH_IS:
                        case ZEND_FETCH_UNSET:
-                               if ((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_LOCAL) {
+                               if (opline->extended_value & ZEND_FETCH_LOCAL) {
                                        flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
-                               } else if (((opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_GLOBAL ||
-                                           (opline->extended_value & ZEND_FETCH_TYPE_MASK) == ZEND_FETCH_GLOBAL_LOCK) &&
+                               } else if ((opline->extended_value & (ZEND_FETCH_GLOBAL | ZEND_FETCH_GLOBAL_LOCK)) &&
                                           !op_array->function_name) {
                                        flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
                                }
index 78cc3f8d5503f14482bef39cc2d3848a09f6d5c4..1d757aeb9df2a43d07467b1accddc139c7c704bf 100644 (file)
@@ -580,7 +580,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) {
                                fprintf(stderr, " (isset)");
-                       } else if (opline->extended_value & ZEND_ISEMPTY) {
+                       } else {
                                fprintf(stderr, " (empty)");
                        }
                }