summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-10-17 10:13:08 +0200
committerAnatol Belski <ab@php.net>2014-10-17 10:13:08 +0200
commit2942a4aa451452c354b2eb2e14f583978388a61a (patch)
tree4afe9f92c6e54a0349417cf6dce9171d9a8535d5
parentaac7b1db7c9df59ffb0860de7692c653719cf4d0 (diff)
parent1f6bd981433cdfc90238a95aa7339d72e7f2bc01 (diff)
downloadphp-git-2942a4aa451452c354b2eb2e14f583978388a61a.tar.gz
Merge remote-tracking branch 'origin/master' into native-tls
* origin/master: check for zlib headers as well as lib for mysqlnd a realpath cache key can be int or float, catching this TLS 1.0, 1.1 and 1.2 Curl constants - bug #68247 Micro optimizations for isset/empty Micro optimization for zend_hash_next_index_insert_new() Fix array_keys() on $GLOBALS Fix procedural finfo calls in methods Conflicts: ext/mysqlnd/config.w32
-rw-r--r--Zend/zend_API.h1
-rw-r--r--Zend/zend_hash.c18
-rw-r--r--Zend/zend_hash.h1
-rw-r--r--Zend/zend_vm_def.h62
-rw-r--r--Zend/zend_vm_execute.h862
-rw-r--r--ext/curl/interface.c6
-rw-r--r--ext/fileinfo/fileinfo.c2
-rw-r--r--ext/fileinfo/tests/precedural_finfo_in_method.phpt18
-rw-r--r--ext/mysqlnd/config.w327
-rw-r--r--ext/standard/array.c2
-rw-r--r--ext/standard/tests/array/array_keys_on_GLOBALS.phpt12
-rw-r--r--ext/standard/tests/file/realpath_cache_win32.phpt2
12 files changed, 464 insertions, 529 deletions
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index b23b5b32f0..b2faf7e253 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -342,6 +342,7 @@ ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *na
ZEND_API char *zend_get_type_by_const(int type);
#define getThis() (Z_OBJ(EX(This)) ? &EX(This) : NULL)
+#define ZEND_IS_METHOD_CALL() (EX(func)->common.scope != NULL)
#define WRONG_PARAM_COUNT ZEND_WRONG_PARAM_COUNT()
#define WRONG_PARAM_COUNT_WITH_RETVAL(ret) ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index 6304737f04..dfd63aa7e1 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -444,11 +444,15 @@ static zend_always_inline zval *_zend_hash_index_add_or_update_i(HashTable *ht,
HANDLE_BLOCK_INTERRUPTIONS();
/* incremental initialization of empty Buckets */
- if (h >= ht->nNumUsed) {
- Bucket *q = ht->arData + ht->nNumUsed;
- while (q != p) {
- ZVAL_UNDEF(&q->val);
- q++;
+ if ((flag & (HASH_ADD_NEW|HASH_ADD_NEXT)) == (HASH_ADD_NEW|HASH_ADD_NEXT)) {
+ ht->nNumUsed = h + 1;
+ } else if (h >= ht->nNumUsed) {
+ if (h > ht->nNumUsed) {
+ Bucket *q = ht->arData + ht->nNumUsed;
+ while (q != p) {
+ ZVAL_UNDEF(&q->val);
+ q++;
+ }
}
ht->nNumUsed = h + 1;
}
@@ -537,12 +541,12 @@ ZEND_API zval *_zend_hash_index_update(HashTable *ht, zend_ulong h, zval *pData
ZEND_API zval *_zend_hash_next_index_insert(HashTable *ht, zval *pData ZEND_FILE_LINE_DC)
{
- return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEXT ZEND_FILE_LINE_RELAY_CC);
}
ZEND_API zval *_zend_hash_next_index_insert_new(HashTable *ht, zval *pData ZEND_FILE_LINE_DC)
{
- return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW ZEND_FILE_LINE_RELAY_CC);
+ return _zend_hash_index_add_or_update_i(ht, ht->nNextFreeElement, pData, HASH_ADD | HASH_ADD_NEW | HASH_ADD_NEXT ZEND_FILE_LINE_RELAY_CC);
}
static void zend_hash_do_resize(HashTable *ht)
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 5a36ddf28f..2b9beca0fc 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -32,6 +32,7 @@
#define HASH_ADD (1<<1)
#define HASH_UPDATE_INDIRECT (1<<2)
#define HASH_ADD_NEW (1<<3)
+#define HASH_ADD_NEXT (1<<4)
#define INVALID_IDX ((uint32_t) -1)
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index ae2f0e7161..fad4d5b99c 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -4848,18 +4848,22 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (OP1_TYPE == IS_CV &&
OP2_TYPE == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zend_free_op free_op1;
zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
@@ -4887,40 +4891,28 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR)
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((OP1_TYPE == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (OP1_TYPE != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
FREE_OP1();
- }
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
@@ -4936,7 +4928,7 @@ ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, CONST|TMP|VAR|UNUSED|CV, CONST|
container = GET_OP1_OBJ_ZVAL_PTR_DEREF(BP_VAR_IS);
offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
- if (OP1_TYPE != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (OP1_TYPE != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -4989,8 +4981,8 @@ ZEND_VM_C_LABEL(num_index_prop):
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (OP1_TYPE == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (OP1_TYPE == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -4999,7 +4991,7 @@ ZEND_VM_C_LABEL(num_index_prop):
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -5015,7 +5007,7 @@ ZEND_VM_C_LABEL(num_index_prop):
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -5049,8 +5041,8 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMP|VAR|UNUSED|CV, CONST
container = GET_OP1_OBJ_ZVAL_PTR_DEREF(BP_VAR_IS);
offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
- if (OP1_TYPE == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (OP1_TYPE == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((OP2_TYPE == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 5d448c34d4..4b58d95618 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4565,18 +4565,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_CONST == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zval tmp, *varname = opline->op1.zv;
@@ -4604,40 +4608,27 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_CONST != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- }
-
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -4653,7 +4644,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CONST_HANDLER(ZE
container = opline->op1.zv;
offset = opline->op2.zv;
- if (IS_CONST != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -4706,8 +4697,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -4716,7 +4707,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -4732,7 +4723,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -4765,8 +4756,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CONST_HANDLER(Z
container = opline->op1.zv;
offset = opline->op2.zv;
- if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -5727,7 +5718,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_TMP_HANDLER(ZEND
container = opline->op1.zv;
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CONST != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -5780,8 +5771,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -5790,7 +5781,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -5806,7 +5797,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -5840,8 +5831,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_TMP_HANDLER(ZEN
container = opline->op1.zv;
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -6987,18 +6978,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_CONST == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zval tmp, *varname = opline->op1.zv;
@@ -7026,40 +7021,27 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_CONST != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- }
-
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -7075,7 +7057,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_VAR_HANDLER(ZEND
container = opline->op1.zv;
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CONST != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -7128,8 +7110,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -7138,7 +7120,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -7154,7 +7136,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -7188,8 +7170,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_VAR_HANDLER(ZEN
container = opline->op1.zv;
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -7862,18 +7844,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_CONST == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zval tmp, *varname = opline->op1.zv;
@@ -7901,40 +7887,27 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_CONST != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- }
-
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -8905,7 +8878,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CONST_CV_HANDLER(ZEND_
container = opline->op1.zv;
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_CONST != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_CONST != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -8958,8 +8931,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -8968,7 +8941,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -8984,7 +8957,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -9017,8 +8990,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CONST_CV_HANDLER(ZEND
container = opline->op1.zv;
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_CONST == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_CONST == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -11266,18 +11239,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_TMP_VAR == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zend_free_op free_op1;
zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -11305,40 +11282,28 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
- }
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -11354,7 +11319,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CONST_HANDLER(ZEND
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = opline->op2.zv;
- if (IS_TMP_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_TMP_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -11407,8 +11372,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -11417,7 +11382,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -11433,7 +11398,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -11466,8 +11431,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_CONST_HANDLER(ZEN
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = opline->op2.zv;
- if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -12368,7 +12333,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_TMP_HANDLER(ZEND_O
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_TMP_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_TMP_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -12421,8 +12386,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -12431,7 +12396,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -12447,7 +12412,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -12481,8 +12446,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_TMP_HANDLER(ZEND_
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -13601,18 +13566,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_TMP_VAR == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zend_free_op free_op1;
zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -13640,40 +13609,28 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
- }
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -13689,7 +13646,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_VAR_HANDLER(ZEND_O
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_TMP_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_TMP_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -13742,8 +13699,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -13752,7 +13709,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -13768,7 +13725,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -13802,8 +13759,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_VAR_HANDLER(ZEND_
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -14352,18 +14309,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_TMP_VAR == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zend_free_op free_op1;
zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -14391,40 +14352,28 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
- }
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -15289,7 +15238,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_TMP_CV_HANDLER(ZEND_OP
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_TMP_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_TMP_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -15342,8 +15291,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -15352,7 +15301,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -15368,7 +15317,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -15401,8 +15350,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMP_CV_HANDLER(ZEND_O
container = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_TMP_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_TMP_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -19307,18 +19256,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_VAR == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zend_free_op free_op1;
zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -19346,40 +19299,28 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
- }
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -19395,7 +19336,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER(ZEND
container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = opline->op2.zv;
- if (IS_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -19448,8 +19389,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -19458,7 +19399,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -19474,7 +19415,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -19507,8 +19448,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CONST_HANDLER(ZEN
container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = opline->op2.zv;
- if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -21405,7 +21346,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_O
container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -21458,8 +21399,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -21468,7 +21409,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -21484,7 +21425,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -21518,8 +21459,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_
container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -23698,18 +23639,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_VAR == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zend_free_op free_op1;
zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -23737,40 +23682,28 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
- }
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -23786,7 +23719,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_O
container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -23839,8 +23772,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -23849,7 +23782,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -23865,7 +23798,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -23899,8 +23832,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_
container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -25040,18 +24973,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_VAR == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zend_free_op free_op1;
zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -25079,40 +25016,28 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_VAR != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
- }
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -27051,7 +26976,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OP
container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_VAR != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_VAR != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -27104,8 +27029,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -27114,7 +27039,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -27130,7 +27055,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -27163,8 +27088,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CV_HANDLER(ZEND_O
container = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_VAR == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_VAR == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -28537,7 +28462,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CONST_HANDLER(Z
container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = opline->op2.zv;
- if (IS_UNUSED != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -28590,8 +28515,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -28600,7 +28525,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -28616,7 +28541,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -28649,8 +28574,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER(
container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = opline->op2.zv;
- if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -29843,7 +29768,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEN
container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -29896,8 +29821,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -29906,7 +29831,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -29922,7 +29847,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -29956,8 +29881,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMP_HANDLER(ZE
container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -31151,7 +31076,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEN
container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -31204,8 +31129,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -31214,7 +31139,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -31230,7 +31155,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -31264,8 +31189,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_VAR_HANDLER(ZE
container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -32971,7 +32896,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND
container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_UNUSED != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_UNUSED != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -33024,8 +32949,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -33034,7 +32959,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -33050,7 +32975,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -33083,8 +33008,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER(ZEN
container = _get_obj_zval_ptr_unused(execute_data TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_UNUSED == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_UNUSED == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -36482,18 +36407,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_CV == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
@@ -36521,40 +36450,27 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_CV != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- }
-
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -36570,7 +36486,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER(ZEND_
container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
offset = opline->op2.zv;
- if (IS_CV != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -36623,8 +36539,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -36633,7 +36549,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -36649,7 +36565,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -36682,8 +36598,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST_HANDLER(ZEND
container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
offset = opline->op2.zv;
- if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CONST == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -38509,7 +38425,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OP
container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -38562,8 +38478,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -38572,7 +38488,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -38588,7 +38504,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -38622,8 +38538,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMP_HANDLER(ZEND_O
container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_TMP_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -40673,18 +40589,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_CV == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
@@ -40712,40 +40632,27 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_CV != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- }
-
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -40761,7 +40668,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OP
container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -40814,8 +40721,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -40824,7 +40731,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -40840,7 +40747,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -40874,8 +40781,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_VAR_HANDLER(ZEND_O
container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_VAR == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
@@ -41889,18 +41796,22 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
{
USE_OPLINE
zval *value;
- zend_bool isset = 1;
SAVE_OPLINE();
if (IS_CV == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- if (Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_UNDEF) {
- value = EX_VAR(opline->op1.var);
- ZVAL_DEREF(value);
- } else {
- isset = 0;
+ value = EX_VAR(opline->op1.var);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !i_zend_is_true(value TSRMLS_CC));
+ CHECK_EXCEPTION();
}
+ ZEND_VM_NEXT_OPCODE();
} else {
zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
@@ -41928,40 +41839,27 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
ce = Z_CE_P(EX_VAR(opline->op2.var));
}
value = zend_std_get_static_property(ce, Z_STR_P(varname), 1, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(varname)) : NULL) TSRMLS_CC);
- if (!value) {
- isset = 0;
- }
} else {
HashTable *target_symbol_table = zend_get_target_symbol_table(execute_data, opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
- if (!value || Z_ISUNDEF_P(value)) {
- isset = 0;
- }
}
if (IS_CV != IS_CONST && varname == &tmp) {
zval_dtor(&tmp);
}
- }
-
- if (opline->extended_value & ZEND_ISSET) {
- if (isset && Z_TYPE_P(value) != IS_NULL &&
- (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
- }
- } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
- if (!isset || !i_zend_is_true(value TSRMLS_CC)) {
- ZVAL_BOOL(EX_VAR(opline->result.var), 1);
- } else {
- ZVAL_BOOL(EX_VAR(opline->result.var), 0);
+ if (opline->extended_value & ZEND_ISSET) {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ 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) */ {
+ ZVAL_BOOL(EX_VAR(opline->result.var),
+ !value || !i_zend_is_true(value TSRMLS_CC));
}
- }
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
+ }
}
static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -43753,7 +43651,7 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPC
container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_CV != IS_UNUSED && Z_TYPE_P(container) == IS_ARRAY) {
+ if (IS_CV != IS_UNUSED && EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) {
HashTable *ht = Z_ARRVAL_P(container);
zval *value;
zend_string *str;
@@ -43806,8 +43704,8 @@ num_index_prop:
} else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
result = (value == NULL || !i_zend_is_true(value TSRMLS_CC));
}
- } else if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_dimension) {
+ } else if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_dimension)) {
result = Z_OBJ_HT_P(container)->has_dimension(container, offset, (opline->extended_value & ZEND_ISSET) == 0 TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check element of non-array");
@@ -43816,7 +43714,7 @@ num_index_prop:
if ((opline->extended_value & ZEND_ISSET) == 0) {
result = !result;
}
- } else if (Z_TYPE_P(container) == IS_STRING) { /* string offsets */
+ } else if (EXPECTED(Z_TYPE_P(container) == IS_STRING)) { /* string offsets */
zval tmp;
result = 0;
@@ -43832,7 +43730,7 @@ num_index_prop:
offset = &tmp;
}
}
- if (Z_TYPE_P(offset) == IS_LONG) {
+ if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
if (offset->value.lval >= 0 && (size_t)offset->value.lval < Z_STRLEN_P(container)) {
if ((opline->extended_value & ZEND_ISSET) ||
Z_STRVAL_P(container)[offset->value.lval] != '0') {
@@ -43865,8 +43763,8 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER(ZEND_OP
container = _get_zval_ptr_cv_deref_BP_VAR_IS(execute_data, opline->op1.var TSRMLS_CC);
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_CV == IS_UNUSED || Z_TYPE_P(container) == IS_OBJECT) {
- if (Z_OBJ_HT_P(container)->has_property) {
+ if (IS_CV == IS_UNUSED || EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) {
+ if (EXPECTED(Z_OBJ_HT_P(container)->has_property)) {
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((IS_CV == IS_CONST) ? (EX(run_time_cache) + Z_CACHE_SLOT_P(offset)) : NULL) TSRMLS_CC);
} else {
zend_error(E_NOTICE, "Trying to check property of non-object");
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index affcd02d39..af1ccdd4cf 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -1201,6 +1201,12 @@ PHP_MINIT_FUNCTION(curl)
REGISTER_CURL_CONSTANT(CURLSSLOPT_ALLOW_BEAST);
#endif
+#if LIBCURL_VERSION_NUM >= 0x072200 /* Available since 7.34.0 */
+ REGISTER_CURL_CONSTANT(CURL_SSLVERSION_TLSv1_0);
+ REGISTER_CURL_CONSTANT(CURL_SSLVERSION_TLSv1_1);
+ REGISTER_CURL_CONSTANT(CURL_SSLVERSION_TLSv1_2);
+#endif
+
#if CURLOPT_FTPASCII != 0
REGISTER_CURL_CONSTANT(CURLOPT_FTPASCII);
#endif
diff --git a/ext/fileinfo/fileinfo.c b/ext/fileinfo/fileinfo.c
index f365b38573..6879926eca 100644
--- a/ext/fileinfo/fileinfo.c
+++ b/ext/fileinfo/fileinfo.c
@@ -57,7 +57,7 @@ typedef struct _finfo_object {
} finfo_object;
#define FILEINFO_DECLARE_INIT_OBJECT(object) \
- zval *object = getThis();
+ zval *object = ZEND_IS_METHOD_CALL() ? getThis() : NULL;
static inline finfo_object *php_finfo_fetch_object(zend_object *obj) {
return (finfo_object *)((char*)(obj) - XtOffsetOf(finfo_object, zo));
diff --git a/ext/fileinfo/tests/precedural_finfo_in_method.phpt b/ext/fileinfo/tests/precedural_finfo_in_method.phpt
new file mode 100644
index 0000000000..8c30b8a197
--- /dev/null
+++ b/ext/fileinfo/tests/precedural_finfo_in_method.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Using procedural finfo API in a method
+--FILE--
+<?php
+
+class Test {
+ public function method() {
+ $finfo = finfo_open(FILEINFO_MIME);
+ var_dump(finfo_file($finfo, __FILE__));
+ }
+}
+
+$test = new Test;
+$test->method();
+
+?>
+--EXPECT--
+string(28) "text/plain; charset=us-ascii"
diff --git a/ext/mysqlnd/config.w32 b/ext/mysqlnd/config.w32
index 477ce424ce..ff102310dd 100644
--- a/ext/mysqlnd/config.w32
+++ b/ext/mysqlnd/config.w32
@@ -26,8 +26,11 @@ if (PHP_MYSQLND != "no") {
"mysqlnd_wireprotocol.c " +
"php_mysqlnd.c ";
EXTENSION("mysqlnd", mysqlnd_source, false, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1");
- if (((PHP_ZLIB=="no") && (CHECK_LIB("zlib_a.lib;zlib.lib", "mysqlnd", PHP_MYSQLND))) ||
- (PHP_ZLIB_SHARED && CHECK_LIB("zlib.lib", "mysqlnd", PHP_MYSQLND)) || (PHP_ZLIB == "yes" && (!PHP_ZLIB_SHARED)))
+ if ((((PHP_ZLIB=="no") && (CHECK_LIB("zlib_a.lib;zlib.lib", "mysqlnd", PHP_MYSQLND))) ||
+ (PHP_ZLIB_SHARED && CHECK_LIB("zlib.lib", "mysqlnd", PHP_MYSQLND)) ||
+ (PHP_ZLIB == "yes" && (!PHP_ZLIB_SHARED))) &&
+ CHECK_HEADER_ADD_INCLUDE("zlib.h", "CFLAGS", "..\\zlib;" + php_usual_include_suspects)
+ )
{
AC_DEFINE("MYSQLND_COMPRESSION_ENABLED", 1, "Compression support");
AC_DEFINE("MYSQLND_SSL_SUPPORTED", 1, "SSL support");
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 7b49b2fd13..7d8e4d0efe 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -2597,7 +2597,7 @@ PHP_FUNCTION(array_keys)
add_key = 1;
/* Go through input array and add keys to the return array */
- ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(input), num_idx, str_idx, entry) {
+ ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(input), num_idx, str_idx, entry) {
if (search_value != NULL) {
is_equal_func(&res, search_value, entry TSRMLS_CC);
add_key = zval_is_true(&res);
diff --git a/ext/standard/tests/array/array_keys_on_GLOBALS.phpt b/ext/standard/tests/array/array_keys_on_GLOBALS.phpt
new file mode 100644
index 0000000000..1d14ff4d53
--- /dev/null
+++ b/ext/standard/tests/array/array_keys_on_GLOBALS.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Using array_keys() on $GLOBALS
+--FILE--
+<?php
+
+$foo = 'bar';
+unset($foo);
+var_dump(in_array('foo', array_keys($GLOBALS)));
+
+?>
+--EXPECT--
+bool(false)
diff --git a/ext/standard/tests/file/realpath_cache_win32.phpt b/ext/standard/tests/file/realpath_cache_win32.phpt
index a4c663f6d1..e74a6565a7 100644
--- a/ext/standard/tests/file/realpath_cache_win32.phpt
+++ b/ext/standard/tests/file/realpath_cache_win32.phpt
@@ -19,7 +19,7 @@ echo "Done\n";
int(%d)
array(8) {
["key"]=>
- %s(%d)
+ %s(%d%s)
["is_dir"]=>
bool(true)
["realpath"]=>