summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-01-30 22:06:05 +0300
committerDmitry Stogov <dmitry@zend.com>2018-01-30 22:06:05 +0300
commit7141631cc886fbb9c58af2deb2d324346de2980d (patch)
tree7dfef243dcca1bef25d6af086d721c249fa89b26
parentacbd348969ea9f9a334c74dcc309da62e9bdc24e (diff)
downloadphp-git-7141631cc886fbb9c58af2deb2d324346de2980d.tar.gz
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
-rw-r--r--Zend/zend_compile.c2
-rw-r--r--Zend/zend_compile.h12
-rw-r--r--Zend/zend_execute.c5
-rw-r--r--Zend/zend_vm_def.h10
-rw-r--r--Zend/zend_vm_execute.h50
-rw-r--r--ext/opcache/Optimizer/sccp.c3
-rw-r--r--ext/opcache/Optimizer/zend_cfg.c10
-rw-r--r--ext/opcache/Optimizer/zend_dump.c2
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)");
}
}