com php-src: Avoid double zval copying in ZEND_SEND_VAL a nd zend_send_by_var_helper: Zend/zend_vm_def .h Zend/zend_vm_execute.h
| From: | Dmitry Stogov | Date: | Fri, 04 Apr 2014 22:14:17 +0000 |
| Subject: | com php-src: Avoid double zval copying in ZEND_SEND_VAL a nd zend_send_by_var_helper: Zend/zend_vm_def .h Zend/zend_vm_execute.h | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-77486@lists.php.net to get a copy of this message | ||
Commit: a94923d5cb50065feab3192e738bc34e799e0e4e
Author: Dmitry Stogov <dmitry@zend.com> Sat, 5 Apr 2014 02:14:17 +0400
Parents: a80e9458357d4b0f110ad682ef85e9c299d996f1
Branches: phpng
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=a94923d5cb50065feab3192e738bc34e799e0e4e
Log:
Avoid double zval copying in ZEND_SEND_VAL and zend_send_by_var_helper
Changed paths:
M Zend/zend_vm_def.h
M Zend/zend_vm_execute.h
Diff:
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 07bd45a..e039506 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2936,17 +2936,17 @@ ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP, ANY)
}
{
- zval valptr;
+ zval *top;
zval *value;
zend_free_op free_op1;
value = GET_OP1_ZVAL_PTR(BP_VAR_R);
-
- ZVAL_COPY_VALUE(&valptr, value);
+ top = EG(argument_stack)->top;
+ EG(argument_stack)->top++;
+ ZVAL_COPY_VALUE(top, value);
if (!IS_OP1_TMP_FREE()) {
- zval_opt_copy_ctor(&valptr);
+ zval_opt_copy_ctor(top);
}
- zend_vm_stack_push(&valptr TSRMLS_CC);
FREE_OP1_IF_VAR();
}
CHECK_EXCEPTION();
@@ -2956,23 +2956,26 @@ ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP, ANY)
ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY)
{
USE_OPLINE
- zval *varptr, var;
+ zval *varptr, *top;
zend_free_op free_op1;
varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
+ top = EG(argument_stack)->top;
+ EG(argument_stack)->top++;
if (Z_ISREF_P(varptr)) {
//??? if (OP1_TYPE == IS_CV ||
//??? (OP1_TYPE == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
- ZVAL_DUP(&var, Z_REFVAL_P(varptr));
- varptr = &var;
+ ZVAL_DUP(top, Z_REFVAL_P(varptr));
FREE_OP1();
//??? } else {
//??? varptr = Z_REFVAL_P(varptr);
//??? }
- } else if (OP1_TYPE == IS_CV) {
- if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
+ } else {
+ if (OP1_TYPE == IS_CV) {
+ if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
+ }
+ ZVAL_COPY_VALUE(top, varptr);
}
- zend_vm_stack_push(varptr TSRMLS_CC);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index ee1ed71...8a6faab 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute..h
@@ -2665,17 +2665,17 @@ static int ZEND_FASTCALL
ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
}
{
- zval valptr;
+ zval *top;
zval *value;
value = opline->op1.zv;
-
- ZVAL_COPY_VALUE(&valptr, value);
+ top = EG(argument_stack)->top;
+ EG(argument_stack)->top++;
+ ZVAL_COPY_VALUE(top, value);
if (!0) {
- zval_opt_copy_ctor(&valptr);
+ zval_opt_copy_ctor(top);
}
- zend_vm_stack_push(&valptr TSRMLS_CC);
}
CHECK_EXCEPTION();
@@ -7721,17 +7721,17 @@ static int ZEND_FASTCALL
ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
}
{
- zval valptr;
+ zval *top;
zval *value;
zend_free_op free_op1;
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
-
- ZVAL_COPY_VALUE(&valptr, value);
+ top = EG(argument_stack)->top;
+ EG(argument_stack)->top++;
+ ZVAL_COPY_VALUE(top, value);
if (!1) {
- zval_opt_copy_ctor(&valptr);
+ zval_opt_copy_ctor(top);
}
- zend_vm_stack_push(&valptr TSRMLS_CC);
}
CHECK_EXCEPTION();
@@ -12687,23 +12687,26 @@ static int ZEND_FASTCALL
ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *varptr, var;
+ zval *varptr, *top;
zend_free_op free_op1;
varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ top = EG(argument_stack)->top;
+ EG(argument_stack)->top++;
if (Z_ISREF_P(varptr)) {
//??? if (IS_VAR == IS_CV ||
//??? (IS_VAR == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
- ZVAL_DUP(&var, Z_REFVAL_P(varptr));
- varptr = &var;
+ ZVAL_DUP(top, Z_REFVAL_P(varptr));
zval_ptr_dtor_nogc(free_op1.var);
//??? } else {
//??? varptr = Z_REFVAL_P(varptr);
//??? }
- } else if (IS_VAR == IS_CV) {
- if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
+ } else {
+ if (IS_VAR == IS_CV) {
+ if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
+ }
+ ZVAL_COPY_VALUE(top, varptr);
}
- zend_vm_stack_push(varptr TSRMLS_CC);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -29272,23 +29275,26 @@ static int ZEND_FASTCALL
ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zval *varptr, var;
+ zval *varptr, *top;
varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
+ top = EG(argument_stack)->top;
+ EG(argument_stack)->top++;
if (Z_ISREF_P(varptr)) {
//??? if (IS_CV == IS_CV ||
//??? (IS_CV == IS_VAR && Z_REFCOUNT_P(varptr) > 2)) {
- ZVAL_DUP(&var, Z_REFVAL_P(varptr));
- varptr = &var;
+ ZVAL_DUP(top, Z_REFVAL_P(varptr));
//??? } else {
//??? varptr = Z_REFVAL_P(varptr);
//??? }
- } else if (IS_CV == IS_CV) {
- if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
+ } else {
+ if (IS_CV == IS_CV) {
+ if (Z_REFCOUNTED_P(varptr)) Z_ADDREF_P(varptr);
+ }
+ ZVAL_COPY_VALUE(top, varptr);
}
- zend_vm_stack_push(varptr TSRMLS_CC);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();