summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
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.c
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.c')
-rw-r--r--Zend/zend_operators.c141
1 files changed, 69 insertions, 72 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index b0a0e7519e..03e913c31d 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -924,7 +924,7 @@ ZEND_API int add_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
} else if (Z_ISREF_P(op2)) {
op2 = Z_REFVAL_P(op2);
} else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD, add_function);
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
@@ -977,7 +977,7 @@ ZEND_API int sub_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
} else if (Z_ISREF_P(op2)) {
op2 = Z_REFVAL_P(op2);
} else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB, sub_function);
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
@@ -1024,7 +1024,7 @@ ZEND_API int mul_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
} else if (Z_ISREF_P(op2)) {
op2 = Z_REFVAL_P(op2);
} else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL, mul_function);
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
@@ -1102,7 +1102,7 @@ ZEND_API int pow_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
} else if (Z_ISREF_P(op2)) {
op2 = Z_REFVAL_P(op2);
} else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW, pow_function);
if (Z_TYPE_P(op1) == IS_ARRAY) {
ZVAL_LONG(result, 0);
@@ -1183,7 +1183,7 @@ ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
} else if (Z_ISREF_P(op2)) {
op2 = Z_REFVAL_P(op2);
} else if (!converted) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV);
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV, div_function);
zendi_convert_scalar_to_number(op1, op1_copy, result);
zendi_convert_scalar_to_number(op2, op2_copy, result);
@@ -1202,14 +1202,14 @@ ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
zval op1_copy, op2_copy;
zend_long op1_lval;
- if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MOD);
-
+ if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_MOD, mod_function);
zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
+ }
+ op1_lval = Z_LVAL_P(op1);
+ if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_MOD);
zendi_convert_to_long(op2, op2_copy, result);
- } else {
- op1_lval = Z_LVAL_P(op1);
}
if (Z_LVAL_P(op2) == 0) {
@@ -1234,15 +1234,14 @@ ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
zval op1_copy, op2_copy;
zend_long op1_lval;
- if ((Z_TYPE_P(op1) != IS_FALSE && Z_TYPE_P(op1) != IS_TRUE) ||
- (Z_TYPE_P(op2) != IS_FALSE && Z_TYPE_P(op2) != IS_TRUE)) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BOOL_XOR);
-
+ if (UNEXPECTED(Z_TYPE_P(op1) != IS_FALSE && Z_TYPE_P(op1) != IS_TRUE)) {
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BOOL_XOR, boolean_xor_function);
zendi_convert_to_boolean(op1, op1_copy, result);
- op1_lval = Z_TYPE_P(op1) == IS_TRUE;
+ }
+ op1_lval = Z_TYPE_P(op1) == IS_TRUE;
+ if (UNEXPECTED(Z_TYPE_P(op2) != IS_FALSE && Z_TYPE_P(op2) != IS_TRUE)) {
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BOOL_XOR);
zendi_convert_to_boolean(op2, op2_copy, result);
- } else {
- op1_lval = Z_TYPE_P(op1) == IS_TRUE;
}
ZVAL_BOOL(result, op1_lval ^ (Z_TYPE_P(op2) == IS_TRUE));
@@ -1281,11 +1280,10 @@ ZEND_API int bitwise_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */
return SUCCESS;
case IS_STRING: {
size_t i;
- zval op1_copy = *op1;
- ZVAL_NEW_STR(result, zend_string_alloc(Z_STRLEN(op1_copy), 0));
- for (i = 0; i < Z_STRLEN(op1_copy); i++) {
- Z_STRVAL_P(result)[i] = ~Z_STRVAL(op1_copy)[i];
+ ZVAL_NEW_STR(result, zend_string_alloc(Z_STRLEN_P(op1), 0));
+ for (i = 0; i < Z_STRLEN_P(op1); i++) {
+ Z_STRVAL_P(result)[i] = ~Z_STRVAL_P(op1)[i];
}
Z_STRVAL_P(result)[i] = 0;
return SUCCESS;
@@ -1329,14 +1327,14 @@ ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /
return SUCCESS;
}
- if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_OR);
-
+ if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_OR, bitwise_or_function);
zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
+ }
+ op1_lval = Z_LVAL_P(op1);
+ if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_OR);
zendi_convert_to_long(op2, op2_copy, result);
- } else {
- op1_lval = Z_LVAL_P(op1);
}
ZVAL_LONG(result, op1_lval | Z_LVAL_P(op2));
@@ -1374,14 +1372,14 @@ ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
return SUCCESS;
}
- if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_AND);
-
+ if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_AND, bitwise_and_function);
zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
+ }
+ op1_lval = Z_LVAL_P(op1);
+ if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_AND);
zendi_convert_to_long(op2, op2_copy, result);
- } else {
- op1_lval = Z_LVAL_P(op1);
}
ZVAL_LONG(result, op1_lval & Z_LVAL_P(op2));
@@ -1419,14 +1417,14 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
return SUCCESS;
}
- if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_XOR);
-
+ if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_XOR, bitwise_xor_function);
zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
+ }
+ op1_lval = Z_LVAL_P(op1);
+ if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_XOR);
zendi_convert_to_long(op2, op2_copy, result);
- } else {
- op1_lval = Z_LVAL_P(op1);
}
ZVAL_LONG(result, op1_lval ^ Z_LVAL_P(op2));
@@ -1439,14 +1437,14 @@ ZEND_API int shift_left_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /
zval op1_copy, op2_copy;
zend_long op1_lval;
- if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SL);
-
+ if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_SL, shift_left_function);
zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
+ }
+ op1_lval = Z_LVAL_P(op1);
+ if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_SL);
zendi_convert_to_long(op2, op2_copy, result);
- } else {
- op1_lval = Z_LVAL_P(op1);
}
/* prevent wrapping quirkiness on some processors where << 64 + x == << x */
@@ -1471,14 +1469,14 @@ ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
zval op1_copy, op2_copy;
zend_long op1_lval;
- if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SR);
-
+ if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_SR, shift_right_function);
zendi_convert_to_long(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
+ }
+ op1_lval = Z_LVAL_P(op1);
+ if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_SR);
zendi_convert_to_long(op2, op2_copy, result);
- } else {
- op1_lval = Z_LVAL_P(op1);
}
/* prevent wrapping quirkiness on some processors where >> 64 + x == >> x */
@@ -1530,29 +1528,28 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{
zval op1_copy, op2_copy;
int use_copy1 = 0, use_copy2 = 0;
- if (UNEXPECTED(Z_TYPE_P(op1) != IS_STRING) ||
- UNEXPECTED(Z_TYPE_P(op2) != IS_STRING)) {
- ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT);
-
- if (Z_TYPE_P(op1) != IS_STRING) {
- use_copy1 = zend_make_printable_zval(op1, &op1_copy TSRMLS_CC);
- }
- if (Z_TYPE_P(op2) != IS_STRING) {
- use_copy2 = zend_make_printable_zval(op2, &op2_copy TSRMLS_CC);
+ if (UNEXPECTED(Z_TYPE_P(op1) != IS_STRING)) {
+ ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT, concat_function);
+ use_copy1 = zend_make_printable_zval(op1, &op1_copy TSRMLS_CC);
+ if (use_copy1) {
+ /* We have created a converted copy of op1. Therefore, op1 won't become the result so
+ * we have to free it.
+ */
+ if (result == op1) {
+ zval_dtor(op1);
+ if (UNEXPECTED(op1 == op2)) {
+ op2 = &op1_copy;
+ }
+ }
+ op1 = &op1_copy;
}
}
-
- if (use_copy1) {
- /* We have created a converted copy of op1. Therefore, op1 won't become the result so
- * we have to free it.
- */
- if (result == op1) {
- zval_dtor(op1);
+ if (UNEXPECTED(Z_TYPE_P(op2) != IS_STRING)) {
+ ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_CONCAT);
+ use_copy2 = zend_make_printable_zval(op2, &op2_copy TSRMLS_CC);
+ if (use_copy2) {
+ op2 = &op2_copy;
}
- op1 = &op1_copy;
- }
- if (use_copy2) {
- op2 = &op2_copy;
}
{