summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-12-12 09:01:42 +0300
committerDmitry Stogov <dmitry@zend.com>2014-12-12 09:01:42 +0300
commit9ea35a37b9425fc0dc392a754dac7e53791f5521 (patch)
tree5b7a2e6b6dc1e49be998d815738dfad6ce36be7c /ext
parent2ea5f7aea4fe0ab7fe7f931040aebb52d3112999 (diff)
downloadphp-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.c13
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;