summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.h
diff options
context:
space:
mode:
authorRasmus Lerdorf <rasmus@php.net>2014-10-26 16:58:45 -0700
committerRasmus Lerdorf <rasmus@php.net>2014-10-26 16:58:45 -0700
commit8d84b1f67adb71bdb2394b62faad04b22f6226f3 (patch)
tree0c1c1ed2aaef8eee971575eb5e336631295f4951 /Zend/zend_operators.h
parentfb85d0322d39d49f37e32df6f68c9769f2cce0e4 (diff)
parent09da8952d0434b53e740ffaca66a8051cd39cf93 (diff)
downloadphp-git-8d84b1f67adb71bdb2394b62faad04b22f6226f3.tar.gz
Merge branch 'master' of git.php.net:php-src
* 'master' of git.php.net:php-src: (240 commits) Do not execute anything after quit or clean command Fix last commit, and do not output unnecessary information Stabilize execution, always run destructors and extended file breakpoints Fix nullptr dereference in clean without exec context remove dodgy param parser, bring userland breakpoint api inline with PHP7 disable output buffering by default Add question to reset execution in run/exec/clean - Updated to version 2014.9 (2014i) actually remove this disable output buffering, better breakpoint api for userland, remove hand parsing of params Fix phpdbg output when outputting via php with active output handlers Fixed Closure::call() NEWS/UPGRADING Set engine back to initial state after fatal-ed ev command Fix eventual stack overflow after clean cmd Fix listing of files with no absolute path updated libmagic.patch in master updated libmagic.patch in 5.6 updated libmagic.patch in 5.5 NEWS NEWS ...
Diffstat (limited to 'Zend/zend_operators.h')
-rw-r--r--Zend/zend_operators.h49
1 files changed, 35 insertions, 14 deletions
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index 8075edf939..f95e856e68 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -887,22 +887,43 @@ static zend_always_inline void fast_is_not_identical_function(zval *result, zval
ZVAL_BOOL(result, Z_TYPE_P(result) != IS_TRUE);
}
-#define ZEND_TRY_BINARY_OBJECT_OPERATION(opcode) \
- if (Z_TYPE_P(op1) == IS_OBJECT && Z_OBJ_HANDLER_P(op1, do_operation)) { \
- if (SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, op2 TSRMLS_CC)) { \
- return SUCCESS; \
- } \
- } else if (Z_TYPE_P(op2) == IS_OBJECT && Z_OBJ_HANDLER_P(op2, do_operation)) { \
- if (SUCCESS == Z_OBJ_HANDLER_P(op2, do_operation)(opcode, result, op1, op2 TSRMLS_CC)) { \
- return SUCCESS; \
- } \
+#define ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode, binary_op) \
+ if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
+ && op1 == result \
+ && UNEXPECTED(Z_OBJ_HANDLER_P(op1, get)) \
+ && EXPECTED(Z_OBJ_HANDLER_P(op1, set))) { \
+ int ret; \
+ zval rv; \
+ zval *objval = Z_OBJ_HANDLER_P(op1, get)(op1, &rv TSRMLS_CC); \
+ Z_ADDREF_P(objval); \
+ ret = binary_op(objval, objval, op2 TSRMLS_CC); \
+ Z_OBJ_HANDLER_P(op1, set)(op1, objval TSRMLS_CC); \
+ zval_ptr_dtor(objval); \
+ return ret; \
+ } else if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
+ && UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation))) { \
+ if (EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, op2 TSRMLS_CC))) { \
+ return SUCCESS; \
+ } \
}
-#define ZEND_TRY_UNARY_OBJECT_OPERATION(opcode) \
- if (Z_TYPE_P(op1) == IS_OBJECT && Z_OBJ_HANDLER_P(op1, do_operation) \
- && SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, NULL TSRMLS_CC) \
- ) { \
- return SUCCESS; \
+#define ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(opcode) \
+ if (UNEXPECTED(Z_TYPE_P(op2) == IS_OBJECT) \
+ && UNEXPECTED(Z_OBJ_HANDLER_P(op2, do_operation)) \
+ && EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op2, do_operation)(opcode, result, op1, op2 TSRMLS_CC))) { \
+ return SUCCESS; \
+ }
+
+#define ZEND_TRY_BINARY_OBJECT_OPERATION(opcode, binary_op) \
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode, binary_op) \
+ else \
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(opcode)
+
+#define ZEND_TRY_UNARY_OBJECT_OPERATION(opcode) \
+ if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT) \
+ && UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation)) \
+ && EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, NULL TSRMLS_CC))) { \
+ return SUCCESS; \
}
/* buf points to the END of the buffer */