From: Dmitry Stogov Date: Thu, 16 Oct 2014 20:17:13 +0000 (+0400) Subject: Micro optimizations for isset/empty X-Git-Tag: PRE_NATIVE_TLS_MERGE~104^2~10^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=176b8d7ca3aef3a172d8e429627c98e0328d02d8;p=php Micro optimizations for isset/empty --- 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");