diff options
author | Anatol Belski <ab@php.net> | 2014-10-17 10:13:08 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2014-10-17 10:13:08 +0200 |
commit | 2942a4aa451452c354b2eb2e14f583978388a61a (patch) | |
tree | 4afe9f92c6e54a0349417cf6dce9171d9a8535d5 | |
parent | aac7b1db7c9df59ffb0860de7692c653719cf4d0 (diff) | |
parent | 1f6bd981433cdfc90238a95aa7339d72e7f2bc01 (diff) | |
download | php-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.h | 1 | ||||
-rw-r--r-- | Zend/zend_hash.c | 18 | ||||
-rw-r--r-- | Zend/zend_hash.h | 1 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 62 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 862 | ||||
-rw-r--r-- | ext/curl/interface.c | 6 | ||||
-rw-r--r-- | ext/fileinfo/fileinfo.c | 2 | ||||
-rw-r--r-- | ext/fileinfo/tests/precedural_finfo_in_method.phpt | 18 | ||||
-rw-r--r-- | ext/mysqlnd/config.w32 | 7 | ||||
-rw-r--r-- | ext/standard/array.c | 2 | ||||
-rw-r--r-- | ext/standard/tests/array/array_keys_on_GLOBALS.phpt | 12 | ||||
-rw-r--r-- | ext/standard/tests/file/realpath_cache_win32.phpt | 2 |
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"]=> |