From: Dmitry Stogov Date: Tue, 6 Aug 2019 13:33:27 +0000 (+0300) Subject: Merge branch 'PHP-7.4' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b912335315a1591c59a0de40e866391b4870b0d3;p=php Merge branch 'PHP-7.4' * PHP-7.4: Inline zend_zval_ptr() in executor explicitely (only on hot paths) --- b912335315a1591c59a0de40e866391b4870b0d3 diff --cc Zend/zend_execute.c index 4c6984e73d,556a8f8493..52ba9ee700 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@@ -141,15 -141,13 +141,12 @@@ ZEND_API const zend_internal_function z {NULL,NULL,NULL,NULL} /* reserved */ }; - #undef zval_ptr_dtor - #define zval_ptr_dtor(zv) i_zval_ptr_dtor(zv) - -#define FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op, result) do { \ - zval *__container_to_free = (free_op); \ - if (UNEXPECTED(__container_to_free) \ - && EXPECTED(Z_REFCOUNTED_P(__container_to_free))) { \ +#define FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_var) do { \ + zval *__container_to_free = EX_VAR(free_var); \ + if (UNEXPECTED(Z_REFCOUNTED_P(__container_to_free))) { \ zend_refcounted *__ref = Z_COUNTED_P(__container_to_free); \ if (UNEXPECTED(!GC_DELREF(__ref))) { \ - zval *__zv = (result); \ + zval *__zv = EX_VAR(opline->result.var); \ if (EXPECTED(Z_TYPE_P(__zv) == IS_INDIRECT)) { \ ZVAL_COPY(__zv, Z_INDIRECT_P(__zv)); \ } \ diff --cc Zend/zend_vm_def.h index d1c2b886a4,c10f9d6169..a0aead301c --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@@ -4220,10 -4204,27 +4220,10 @@@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, zend_vm_stack_free_args(call); if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(ret); + i_zval_ptr_dtor(ret); } - - } else { /* ZEND_OVERLOADED_FUNCTION */ - zval retval; - - ret = RETURN_VALUE_USED(opline) ? EX_VAR(opline->result.var) : &retval; - - call->prev_execute_data = execute_data; - - if (UNEXPECTED(!zend_do_fcall_overloaded(call, ret))) { - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - if (!RETURN_VALUE_USED(opline)) { - zval_ptr_dtor(ret); - } } -ZEND_VM_C_LABEL(fcall_end): if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) { OBJ_RELEASE(Z_OBJ(call->This)); } diff --cc Zend/zend_vm_execute.h index 8cbd2011c2,6ac1d09e8f..29d6d3e778 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@@ -1623,10 -1618,27 +1623,10 @@@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_ zend_vm_stack_free_args(call); if (!0) { - zval_ptr_dtor(ret); + i_zval_ptr_dtor(ret); } - - } else { /* ZEND_OVERLOADED_FUNCTION */ - zval retval; - - ret = 0 ? EX_VAR(opline->result.var) : &retval; - - call->prev_execute_data = execute_data; - - if (UNEXPECTED(!zend_do_fcall_overloaded(call, ret))) { - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - if (!0) { - zval_ptr_dtor(ret); - } } -fcall_end: if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) { OBJ_RELEASE(Z_OBJ(call->This)); } @@@ -1722,10 -1729,27 +1722,10 @@@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_ zend_vm_stack_free_args(call); if (!1) { - zval_ptr_dtor(ret); + i_zval_ptr_dtor(ret); } - - } else { /* ZEND_OVERLOADED_FUNCTION */ - zval retval; - - ret = 1 ? EX_VAR(opline->result.var) : &retval; - - call->prev_execute_data = execute_data; - - if (UNEXPECTED(!zend_do_fcall_overloaded(call, ret))) { - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - if (!1) { - zval_ptr_dtor(ret); - } } -fcall_end: if (UNEXPECTED(ZEND_CALL_INFO(call) & ZEND_CALL_RELEASE_THIS)) { OBJ_RELEASE(Z_OBJ(call->This)); }