diff options
Diffstat (limited to 'Zend/zend_vm_def.h')
-rw-r--r-- | Zend/zend_vm_def.h | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 84cbe98304..484ee44bd8 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1818,10 +1818,6 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV) HANDLE_EXCEPTION(); } ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN); - } else if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!OP2_FREE) { - PZVAL_LOCK(value_ptr); - } } variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); @@ -1840,12 +1836,6 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV) zend_assign_to_variable_reference(variable_ptr, value_ptr); } - if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) { - if (!OP2_FREE) { - Z_DELREF_P(variable_ptr); - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } @@ -2953,6 +2943,25 @@ ZEND_VM_C_LABEL(fcall_end): ZEND_VM_NEXT_OPCODE(); } +ZEND_VM_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV, UNUSED) +{ +#if OP1_TYPE != IS_UNUSED + USE_OPLINE +#endif + SAVE_OPLINE(); + if (OP1_TYPE == IS_UNUSED) { + zend_verify_missing_return_type(EX(func)); + } else { + zval *retval_ptr; + zend_free_op free_op1; + + retval_ptr = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R); + zend_verify_return_type(EX(func), retval_ptr); + } + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY) { USE_OPLINE @@ -3631,6 +3640,7 @@ ZEND_VM_HANDLER(120, ZEND_SEND_USER, VAR|CV, ANY) 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; |