diff options
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r-- | Zend/zend_execute_API.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index d37c2cd1d8..f79169232d 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -803,7 +803,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) / Z_ADDREF_P(arg); } else { if (Z_ISREF_P(arg) && - (func->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) == 0 ) { + !(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)) { /* don't separate references for __call */ arg = Z_REFVAL_P(arg); } @@ -827,6 +827,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) / } if (func->type == ZEND_USER_FUNCTION) { + int call_via_handler = (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) != 0; EG(scope) = func->common.scope; call->symbol_table = fci->symbol_table; if (UNEXPECTED(func->op_array.fn_flags & ZEND_ACC_CLOSURE)) { @@ -839,8 +840,12 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) / } else { zend_generator_create_zval(call, &func->op_array, fci->retval); } + if (call_via_handler) { + /* We must re-initialize function again */ + fci_cache->initialized = 0; + } } else if (func->type == ZEND_INTERNAL_FUNCTION) { - int call_via_handler = (func->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0; + int call_via_handler = (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) != 0; ZVAL_NULL(fci->retval); if (func->common.scope) { EG(scope) = func->common.scope; |