diff options
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r-- | Zend/zend_vm_execute.h | 147 |
1 files changed, 102 insertions, 45 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 805244e4a6..80a31331e5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -6094,6 +6094,25 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ +#if IS_CONST != IS_UNUSED + USE_OPLINE +#endif + SAVE_OPLINE(); + if (IS_CONST == IS_UNUSED) { + zend_verify_missing_return_type(EX(func)); + } else { + zval *retval_ptr; + + + retval_ptr = EX_CONSTANT(opline->op1); + zend_verify_return_type(EX(func), retval_ptr); + } + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -10093,6 +10112,25 @@ static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_O ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ +#if IS_TMP_VAR != IS_UNUSED + USE_OPLINE +#endif + SAVE_OPLINE(); + if (IS_TMP_VAR == IS_UNUSED) { + zend_verify_missing_return_type(EX(func)); + } else { + zval *retval_ptr; + zend_free_op free_op1; + + retval_ptr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + zend_verify_return_type(EX(func), retval_ptr); + } + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -11535,6 +11573,7 @@ static int ZEND_FASTCALL ZEND_SEND_USER_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR if (Z_OBJ(EX(call)->This)) { OBJ_RELEASE(Z_OBJ(EX(call)->This)); } + ZVAL_UNDEF(param); EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; Z_OBJ(EX(call)->This) = NULL; @@ -14199,10 +14238,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL HANDLE_EXCEPTION(); } return ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!(free_op2 != NULL)) { - PZVAL_LOCK(value_ptr); - } } variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -14221,12 +14256,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL zend_assign_to_variable_reference(variable_ptr, value_ptr); } - if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!(free_op2 != NULL)) { - Z_DELREF_P(variable_ptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } @@ -14924,6 +14953,25 @@ static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(Z ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ +#if IS_VAR != IS_UNUSED + USE_OPLINE +#endif + SAVE_OPLINE(); + if (IS_VAR == IS_UNUSED) { + zend_verify_missing_return_type(EX(func)); + } else { + zval *retval_ptr; + zend_free_op free_op1; + + retval_ptr = _get_zval_ptr_var_deref(opline->op1.var, execute_data, &free_op1); + zend_verify_return_type(EX(func), retval_ptr); + } + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -16209,10 +16257,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE HANDLE_EXCEPTION(); } return ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!0) { - PZVAL_LOCK(value_ptr); - } } variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -16231,12 +16275,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE zend_assign_to_variable_reference(variable_ptr, value_ptr); } - if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!0) { - Z_DELREF_P(variable_ptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } @@ -20178,6 +20216,25 @@ static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPC #endif } +static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ +#if IS_UNUSED != IS_UNUSED + USE_OPLINE +#endif + SAVE_OPLINE(); + if (IS_UNUSED == IS_UNUSED) { + zend_verify_missing_return_type(EX(func)); + } else { + zval *retval_ptr; + + + retval_ptr = NULL; + zend_verify_return_type(EX(func), retval_ptr); + } + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { zval *array; @@ -23662,6 +23719,7 @@ static int ZEND_FASTCALL ZEND_SEND_USER_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG if (Z_OBJ(EX(call)->This)) { OBJ_RELEASE(Z_OBJ(EX(call)->This)); } + ZVAL_UNDEF(param); EX(call)->func = (zend_function*)&zend_pass_function; EX(call)->called_scope = NULL; Z_OBJ(EX(call)->This) = NULL; @@ -27364,10 +27422,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE HANDLE_EXCEPTION(); } return ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!(free_op2 != NULL)) { - PZVAL_LOCK(value_ptr); - } } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); @@ -27386,12 +27440,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE zend_assign_to_variable_reference(variable_ptr, value_ptr); } - if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!(free_op2 != NULL)) { - Z_DELREF_P(variable_ptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } @@ -28352,6 +28400,25 @@ try_assign_dim_array: ZEND_VM_NEXT_OPCODE(); } +static int ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ +#if IS_CV != IS_UNUSED + USE_OPLINE +#endif + SAVE_OPLINE(); + if (IS_CV == IS_UNUSED) { + zend_verify_missing_return_type(EX(func)); + } else { + zval *retval_ptr; + + + retval_ptr = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op1.var); + zend_verify_return_type(EX(func), retval_ptr); + } + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -30130,10 +30197,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER HANDLE_EXCEPTION(); } return ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!0) { - PZVAL_LOCK(value_ptr); - } } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); @@ -30152,12 +30215,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER zend_assign_to_variable_reference(variable_ptr, value_ptr); } - if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!0) { - Z_DELREF_P(variable_ptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } @@ -39421,27 +39478,27 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_VERIFY_RETURN_TYPE_SPEC_CONST_UNUSED_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_VERIFY_RETURN_TYPE_SPEC_TMP_UNUSED_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_VERIFY_RETURN_TYPE_SPEC_VAR_UNUSED_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_VERIFY_RETURN_TYPE_SPEC_UNUSED_UNUSED_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, + ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, |