diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2014-12-12 09:01:42 +0300 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2014-12-12 09:01:42 +0300 |
| commit | 9ea35a37b9425fc0dc392a754dac7e53791f5521 (patch) | |
| tree | 5b7a2e6b6dc1e49be998d815738dfad6ce36be7c /ext | |
| parent | 2ea5f7aea4fe0ab7fe7f931040aebb52d3112999 (diff) | |
| download | php-git-9ea35a37b9425fc0dc392a754dac7e53791f5521.tar.gz | |
Make ZEND_INIT_FCALL keep predcalculted size of necessary stack space in opline->op1.num to avoid its recalculation on each execution.
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/opcache/Optimizer/optimize_func_calls.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/ext/opcache/Optimizer/optimize_func_calls.c b/ext/opcache/Optimizer/optimize_func_calls.c index 9031a38f56..5c765cef4e 100644 --- a/ext/opcache/Optimizer/optimize_func_calls.c +++ b/ext/opcache/Optimizer/optimize_func_calls.c @@ -80,11 +80,13 @@ void optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx TSRMLS if (fcall->opcode == ZEND_INIT_FCALL_BY_NAME) { fcall->opcode = ZEND_INIT_FCALL; + fcall->op1.num = zend_vm_calc_used_stack(fcall->extended_value, call_stack[call].func); Z_CACHE_SLOT(op_array->literals[fcall->op2.constant + 1]) = Z_CACHE_SLOT(op_array->literals[fcall->op2.constant]); literal_dtor(&ZEND_OP2_LITERAL(fcall)); fcall->op2.constant = fcall->op2.constant + 1; } else if (fcall->opcode == ZEND_INIT_NS_FCALL_BY_NAME) { fcall->opcode = ZEND_INIT_FCALL; + fcall->op1.num = zend_vm_calc_used_stack(fcall->extended_value, call_stack[call].func); Z_CACHE_SLOT(op_array->literals[fcall->op2.constant + 1]) = Z_CACHE_SLOT(op_array->literals[fcall->op2.constant]); literal_dtor(&op_array->literals[fcall->op2.constant]); literal_dtor(&op_array->literals[fcall->op2.constant + 2]); @@ -92,17 +94,6 @@ void optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx TSRMLS } else { ZEND_ASSERT(0); } - } else if (call_stack[call].opline && - call_stack[call].opline->opcode == ZEND_INIT_FCALL_BY_NAME && - call_stack[call].opline->extended_value == 0 && - ZEND_OP2_IS_CONST_STRING(call_stack[call].opline)) { - - zend_op *fcall = call_stack[call].opline; - - fcall->opcode = ZEND_INIT_FCALL; - Z_CACHE_SLOT(op_array->literals[fcall->op2.constant + 1]) = Z_CACHE_SLOT(op_array->literals[fcall->op2.constant]); - literal_dtor(&ZEND_OP2_LITERAL(fcall)); - fcall->op2.constant = fcall->op2.constant + 1; } call_stack[call].func = NULL; call_stack[call].opline = NULL; |
