diff options
Diffstat (limited to 'Zend/zend_vm_execute.h')
| -rw-r--r-- | Zend/zend_vm_execute.h | 125 | 
1 files changed, 79 insertions, 46 deletions
| diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 1c0a3d3553..f1e02ce02a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -47046,14 +47046,39 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUS  	ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();  } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS)  {  	USE_OPLINE  	zval *value;  	int result;  	value = EX_VAR(opline->op1.var); -	if (opline->extended_value & ZEND_ISSET) { +	if (0) { +		result = +			Z_TYPE_P(value) > IS_NULL && +		    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); +	} else { +		SAVE_OPLINE(); +		result = !i_zend_is_true(value); +		if (UNEXPECTED(EG(exception))) { +			ZVAL_UNDEF(EX_VAR(opline->result.var)); +			HANDLE_EXCEPTION(); +		} +	} +	ZEND_VM_SMART_BRANCH(result, 0); +	ZVAL_BOOL(EX_VAR(opline->result.var), result); +	ZEND_VM_SET_NEXT_OPCODE(opline + 1); +	ZEND_VM_CONTINUE(); +} + +static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ +	USE_OPLINE +	zval *value; +	int result; + +	value = EX_VAR(opline->op1.var); +	if (1) {  		result =  			Z_TYPE_P(value) > IS_NULL &&  		    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL); @@ -53957,7 +53982,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)  			(void*)&&ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_LABEL,  			(void*)&&ZEND_NULL_LABEL,  			(void*)&&ZEND_UNSET_CV_SPEC_CV_UNUSED_LABEL, -			(void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_LABEL, +			(void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_LABEL, +			(void*)&&ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_LABEL,  			(void*)&&ZEND_NULL_LABEL,  			(void*)&&ZEND_NULL_LABEL,  			(void*)&&ZEND_NULL_LABEL, @@ -59638,9 +59664,13 @@ ZEND_API void execute_ex(zend_execute_data *ex)  				VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED)  				ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);  				HYBRID_BREAK(); -			HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED): -				VM_TRACE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED) -				ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +			HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY): +				VM_TRACE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY) +				ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); +				HYBRID_BREAK(); +			HYBRID_CASE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET): +				VM_TRACE(ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET) +				ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);  				HYBRID_BREAK();  			HYBRID_CASE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED):  				VM_TRACE(ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED) @@ -63132,7 +63162,8 @@ void zend_vm_init(void)  		ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUSED_HANDLER,  		ZEND_NULL_HANDLER,  		ZEND_UNSET_CV_SPEC_CV_UNUSED_HANDLER, -		ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_HANDLER, +		ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_EMPTY_HANDLER, +		ZEND_ISSET_ISEMPTY_CV_SPEC_CV_UNUSED_SET_HANDLER,  		ZEND_NULL_HANDLER,  		ZEND_NULL_HANDLER,  		ZEND_NULL_HANDLER, @@ -64249,9 +64280,9 @@ void zend_vm_init(void)  		3013,  		3014 | SPEC_RULE_OP1,  		3019, -		3020, -		3021 | SPEC_RULE_OP1 | SPEC_RULE_OP2, -		3937 +		3020 | SPEC_RULE_ISSET, +		3022 | SPEC_RULE_OP1 | SPEC_RULE_OP2, +		3938  	};  #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)  	zend_opcode_handler_funcs = labels; @@ -64372,6 +64403,7 @@ static const void *zend_vm_get_opcode_handler_ex(uint32_t spec, const zend_op* o  				offset += 2;  			}  		} +		else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISSET);  	}  	return zend_opcode_handlers[(spec & SPEC_START_MASK) + offset];  } @@ -64421,6 +64453,7 @@ static const void *zend_vm_get_opcode_handler_func(zend_uchar opcode, const zend  				offset += 2;  			}  		} +		else if (spec & SPEC_RULE_ISSET) offset = offset * 2 + (op->extended_value & ZEND_ISSET);  	}  	return zend_opcode_handler_funcs[(spec & SPEC_START_MASK) + offset];  } @@ -64450,7 +64483,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3047 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; +				spec = 3048 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;  				if (op->op1_type < op->op2_type) {  					zend_swap_operands(op);  				} @@ -64458,7 +64491,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3072 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; +				spec = 3073 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;  				if (op->op1_type < op->op2_type) {  					zend_swap_operands(op);  				} @@ -64466,7 +64499,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3097 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; +				spec = 3098 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;  				if (op->op1_type < op->op2_type) {  					zend_swap_operands(op);  				} @@ -64477,17 +64510,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3122 | SPEC_RULE_OP1 | SPEC_RULE_OP2; +				spec = 3123 | SPEC_RULE_OP1 | SPEC_RULE_OP2;  			} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3147 | SPEC_RULE_OP1 | SPEC_RULE_OP2; +				spec = 3148 | SPEC_RULE_OP1 | SPEC_RULE_OP2;  			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3172 | SPEC_RULE_OP1 | SPEC_RULE_OP2; +				spec = 3173 | SPEC_RULE_OP1 | SPEC_RULE_OP2;  			}  			break;  		case ZEND_MUL: @@ -64498,17 +64531,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3197 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; +				spec = 3198 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;  			} else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3222 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; +				spec = 3223 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;  			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3247 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; +				spec = 3248 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE;  			}  			break;  		case ZEND_IS_EQUAL: @@ -64519,12 +64552,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3272 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; +				spec = 3273 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;  			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3347 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; +				spec = 3348 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;  			}  			break;  		case ZEND_IS_NOT_EQUAL: @@ -64535,12 +64568,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3422 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; +				spec = 3423 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;  			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3497 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; +				spec = 3498 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE;  			}  			break;  		case ZEND_IS_SMALLER: @@ -64548,12 +64581,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3572 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; +				spec = 3573 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;  			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3647 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; +				spec = 3648 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;  			}  			break;  		case ZEND_IS_SMALLER_OR_EQUAL: @@ -64561,80 +64594,80 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3722 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; +				spec = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;  			} else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {  				if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {  					break;  				} -				spec = 3797 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; +				spec = 3798 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;  			}  			break;  		case ZEND_QM_ASSIGN:  			if (op1_info == MAY_BE_DOUBLE) { -				spec = 3890 | SPEC_RULE_OP1; +				spec = 3891 | SPEC_RULE_OP1;  			} else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) { -				spec = 3895 | SPEC_RULE_OP1; +				spec = 3896 | SPEC_RULE_OP1;  			}  			break;  		case ZEND_PRE_INC:  			if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { -				spec = 3872 | SPEC_RULE_RETVAL; +				spec = 3873 | SPEC_RULE_RETVAL;  			} else if (op1_info == MAY_BE_LONG) { -				spec = 3874 | SPEC_RULE_RETVAL; +				spec = 3875 | SPEC_RULE_RETVAL;  			} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { -				spec = 3876 | SPEC_RULE_RETVAL; +				spec = 3877 | SPEC_RULE_RETVAL;  			}  			break;  		case ZEND_PRE_DEC:  			if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { -				spec = 3878 | SPEC_RULE_RETVAL; +				spec = 3879 | SPEC_RULE_RETVAL;  			} else if (op1_info == MAY_BE_LONG) { -				spec = 3880 | SPEC_RULE_RETVAL; +				spec = 3881 | SPEC_RULE_RETVAL;  			} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { -				spec = 3882 | SPEC_RULE_RETVAL; +				spec = 3883 | SPEC_RULE_RETVAL;  			}  			break;  		case ZEND_POST_INC:  			if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { -				spec = 3884; -			} else if (op1_info == MAY_BE_LONG) {  				spec = 3885; -			} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { +			} else if (op1_info == MAY_BE_LONG) {  				spec = 3886; +			} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { +				spec = 3887;  			}  			break;  		case ZEND_POST_DEC:  			if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { -				spec = 3887; -			} else if (op1_info == MAY_BE_LONG) {  				spec = 3888; -			} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { +			} else if (op1_info == MAY_BE_LONG) {  				spec = 3889; +			} else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { +				spec = 3890;  			}  			break;  		case ZEND_JMP:  			if (OP_JMP_ADDR(op, op->op1) > op) { -				spec = 3046; +				spec = 3047;  			}  			break;  		case ZEND_SEND_VAR_EX:  			if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { -				spec = 3930 | SPEC_RULE_OP1; +				spec = 3931 | SPEC_RULE_OP1;  			}  			break;  		case ZEND_FE_FETCH_R:  			if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { -				spec = 3935 | SPEC_RULE_RETVAL; +				spec = 3936 | SPEC_RULE_RETVAL;  			}  			break;  		case ZEND_FETCH_DIM_R:  			if (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) { -				spec = 3900 | SPEC_RULE_OP1 | SPEC_RULE_OP2; +				spec = 3901 | SPEC_RULE_OP1 | SPEC_RULE_OP2;  			}  			break;  		case ZEND_SEND_VAR:  			if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { -				spec = 3925 | SPEC_RULE_OP1; +				spec = 3926 | SPEC_RULE_OP1;  			}  			break;  		case ZEND_BW_OR: | 
