From 7141631cc886fbb9c58af2deb2d324346de2980d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 30 Jan 2018 22:06:05 +0300 Subject: [PATCH] Change FETCH/ISSET instruction modifiers: - 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 | 2 +- Zend/zend_compile.h | 12 +++----- Zend/zend_execute.c | 5 ++-- Zend/zend_vm_def.h | 10 +++---- Zend/zend_vm_execute.h | 50 +++++++++++++++---------------- ext/opcache/Optimizer/sccp.c | 3 -- ext/opcache/Optimizer/zend_cfg.c | 10 +++---- ext/opcache/Optimizer/zend_dump.c | 2 +- 8 files changed, 42 insertions(+), 52 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index e6a34371a3..226d440300 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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; } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f53cc18c15..44fe1f3074 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -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) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c660988f9c..50d518cefc 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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(); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 52e56a9761..596d0448d8 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ad7f3ba40d..40341937fd 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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; diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 07fdeee708..0e84c1a337 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -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; diff --git a/ext/opcache/Optimizer/zend_cfg.c b/ext/opcache/Optimizer/zend_cfg.c index 570ef56707..77371c97c2 100644 --- a/ext/opcache/Optimizer/zend_cfg.c +++ b/ext/opcache/Optimizer/zend_cfg.c @@ -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; } diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index 78cc3f8d55..1d757aeb9d 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -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)"); } } -- 2.50.1