diff options
-rw-r--r-- | Zend/tests/self_and.phpt | 25 | ||||
-rw-r--r-- | Zend/tests/self_mod.phpt | 25 | ||||
-rw-r--r-- | Zend/tests/self_or.phpt | 25 | ||||
-rw-r--r-- | Zend/tests/self_xor.phpt | 25 | ||||
-rw-r--r-- | Zend/zend_operators.c | 18 |
5 files changed, 118 insertions, 0 deletions
diff --git a/Zend/tests/self_and.phpt b/Zend/tests/self_and.phpt new file mode 100644 index 0000000000..cdcde77992 --- /dev/null +++ b/Zend/tests/self_and.phpt @@ -0,0 +1,25 @@ +--TEST-- +ANDing strings +--FILE-- +<?php + +$s = "123"; +$s1 = "test"; +$s2 = "45345some"; + +$s &= 22; +var_dump($s); + +$s1 &= 11; +var_dump($s1); + +$s2 &= 33; +var_dump($s2); + +echo "Done\n"; +?> +--EXPECTF-- +int(18) +int(0) +int(33) +Done diff --git a/Zend/tests/self_mod.phpt b/Zend/tests/self_mod.phpt new file mode 100644 index 0000000000..19e45d88fc --- /dev/null +++ b/Zend/tests/self_mod.phpt @@ -0,0 +1,25 @@ +--TEST-- +Moduloing strings +--FILE-- +<?php + +$s = "123"; +$s1 = "test"; +$s2 = "45345some"; + +$s %= 22; +var_dump($s); + +$s1 %= 11; +var_dump($s1); + +$s2 %= 33; +var_dump($s2); + +echo "Done\n"; +?> +--EXPECTF-- +int(13) +int(0) +int(3) +Done diff --git a/Zend/tests/self_or.phpt b/Zend/tests/self_or.phpt new file mode 100644 index 0000000000..ae667bff16 --- /dev/null +++ b/Zend/tests/self_or.phpt @@ -0,0 +1,25 @@ +--TEST-- +ORing strings +--FILE-- +<?php + +$s = "123"; +$s1 = "test"; +$s2 = "45345some"; + +$s |= 22; +var_dump($s); + +$s1 |= 11; +var_dump($s1); + +$s2 |= 33; +var_dump($s2); + +echo "Done\n"; +?> +--EXPECTF-- +int(127) +int(11) +int(45345) +Done diff --git a/Zend/tests/self_xor.phpt b/Zend/tests/self_xor.phpt new file mode 100644 index 0000000000..a7e43f539d --- /dev/null +++ b/Zend/tests/self_xor.phpt @@ -0,0 +1,25 @@ +--TEST-- +XORing strings +--FILE-- +<?php + +$s = "123"; +$s1 = "test"; +$s2 = "45345some"; + +$s ^= 22; +var_dump($s); + +$s1 ^= 11; +var_dump($s1); + +$s2 ^= 33; +var_dump($s2); + +echo "Done\n"; +?> +--EXPECTF-- +int(109) +int(11) +int(45312) +Done diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index bdb4ea8861..b43c672526 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1162,6 +1162,9 @@ ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ * return SUCCESS; } + if (op1 == result) { + zval_dtor(result); + } ZVAL_LONG(result, op1_lval % op2_lval); return SUCCESS; } @@ -1324,6 +1327,9 @@ ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) / op2_lval = Z_LVAL_P(op2); } + if (op1 == result) { + zval_dtor(result); + } ZVAL_LONG(result, op1_lval | op2_lval); return SUCCESS; } @@ -1379,6 +1385,9 @@ ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) op2_lval = Z_LVAL_P(op2); } + if (op1 == result) { + zval_dtor(result); + } ZVAL_LONG(result, op1_lval & op2_lval); return SUCCESS; } @@ -1434,6 +1443,9 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) op2_lval = Z_LVAL_P(op2); } + if (op1 == result) { + zval_dtor(result); + } ZVAL_LONG(result, op1_lval ^ op2_lval); return SUCCESS; } @@ -1486,6 +1498,9 @@ ZEND_API int shift_left_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) / } } + if (op1 == result) { + zval_dtor(result); + } ZVAL_LONG(result, op1_lval << op2_lval); return SUCCESS; } @@ -1538,6 +1553,9 @@ ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) } } + if (op1 == result) { + zval_dtor(result); + } ZVAL_LONG(result, op1_lval >> op2_lval); return SUCCESS; } |