diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-03-11 14:33:07 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-03-11 14:33:07 +0100 |
commit | 92291ab72692949b63cc019d824bfe17aa5ec720 (patch) | |
tree | 0bf5e92d17469eaa5e5a8531dfa85cea4df79fa5 /Zend/zend_API.c | |
parent | e279c80247bf9f029d0a0b34fff8e0a90ebbf3ac (diff) | |
parent | ac79d42ba6ed05c5dcb611b66cdad07f3bcbba58 (diff) | |
download | php-git-92291ab72692949b63cc019d824bfe17aa5ec720.tar.gz |
Merge branch 'PHP-7.4'
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r-- | Zend/zend_API.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 4a31914e1a..ad15a38cf6 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2792,6 +2792,16 @@ static int zend_is_callable_check_class(zend_string *name, zend_class_entry *sco } /* }}} */ +static void free_fcc(zend_fcall_info_cache *fcc) { + if (fcc->function_handler && + (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) { + if (fcc->function_handler->common.function_name) { + zend_string_release_ex(fcc->function_handler->common.function_name, 0); + } + zend_free_trampoline(fcc->function_handler); + } +} + static zend_always_inline int zend_is_callable_check_func(int check_flags, zval *callable, zend_fcall_info_cache *fcc, int strict_class, char **error) /* {{{ */ { zend_class_entry *ce_org = fcc->calling_scope; @@ -3131,13 +3141,8 @@ again: check_func: ret = zend_is_callable_check_func(check_flags, callable, fcc, strict_class, error); - if (fcc == &fcc_local && - fcc->function_handler && - (fcc->function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) { - if (fcc->function_handler->common.function_name) { - zend_string_release_ex(fcc->function_handler->common.function_name, 0); - } - zend_free_trampoline(fcc->function_handler); + if (fcc == &fcc_local) { + free_fcc(fcc); } return ret; @@ -3205,6 +3210,9 @@ check_func: case IS_OBJECT: if (Z_OBJ_HANDLER_P(callable, get_closure) && Z_OBJ_HANDLER_P(callable, get_closure)(Z_OBJ_P(callable), &fcc->calling_scope, &fcc->function_handler, &fcc->object) == SUCCESS) { fcc->called_scope = fcc->calling_scope; + if (fcc == &fcc_local) { + free_fcc(fcc); + } return 1; } if (error) *error = estrdup("no array or string given"); @@ -3245,11 +3253,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_nam add_next_index_str(callable, zend_string_copy(fcc.calling_scope->name)); add_next_index_str(callable, zend_string_copy(fcc.function_handler->common.function_name)); } - if (fcc.function_handler && - (fcc.function_handler->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) { - zend_string_release_ex(fcc.function_handler->common.function_name, 0); - zend_free_trampoline(fcc.function_handler); - } + free_fcc(&fcc); return 1; } return 0; |