summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-09-25 13:42:46 +0400
committerDmitry Stogov <dmitry@zend.com>2014-09-25 13:42:46 +0400
commit8b034ec69a434f179275f21b2e29492df1d74669 (patch)
treee5bfe814cc38c5d8822e24620a21342a774536be /Zend/zend_operators.c
parent6a09bdff6a9ec30f744fa12aeb2875a764fc34c5 (diff)
downloadphp-git-8b034ec69a434f179275f21b2e29492df1d74669.tar.gz
Optimized (PRE|POST)_(INC|DEC) handlers. Moved proxy object handling into helper function.
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r--Zend/zend_operators.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index f3e0680f9e..446e4f9138 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -2159,7 +2159,16 @@ try_again:
}
break;
case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ if (Z_OBJ_HANDLER_P(op1, get)
+ && Z_OBJ_HANDLER_P(op1, set)) {
+ /* proxy object */
+ zval rv;
+ zval *val = Z_OBJ_HANDLER_P(op1, get)(op1, &rv TSRMLS_CC);
+ Z_ADDREF_P(val);
+ fast_increment_function(val);
+ Z_OBJ_HANDLER_P(op1, set)(op1, val TSRMLS_CC);
+ zval_ptr_dtor(val);
+ } else if (Z_OBJ_HANDLER_P(op1, do_operation)) {
zval op2;
int res;
TSRMLS_FETCH();
@@ -2222,7 +2231,16 @@ try_again:
}
break;
case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ if (Z_OBJ_HANDLER_P(op1, get)
+ && Z_OBJ_HANDLER_P(op1, set)) {
+ /* proxy object */
+ zval rv;
+ zval *val = Z_OBJ_HANDLER_P(op1, get)(op1, &rv TSRMLS_CC);
+ Z_ADDREF_P(val);
+ fast_decrement_function(val);
+ Z_OBJ_HANDLER_P(op1, set)(op1, val TSRMLS_CC);
+ zval_ptr_dtor(val);
+ } else if (Z_OBJ_HANDLER_P(op1, do_operation)) {
zval op2;
int res;
TSRMLS_FETCH();