summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-04-01 16:31:03 +0400
committerDmitry Stogov <dmitry@zend.com>2014-04-01 16:31:03 +0400
commita25a1ba0ef263e9e1d65b8eaebd3e764878c55c7 (patch)
tree978ef72e0c909146687f463f5066e3d9672eb5ce /Zend/zend_operators.c
parent7eff369ba94f244604669f4b0e9737dc06265f43 (diff)
downloadphp-git-a25a1ba0ef263e9e1d65b8eaebd3e764878c55c7.tar.gz
STR_DUP() doesn't duplicate interned strings anymore. In case new string is required STR_INIT() or STR_ALLOC() should be used.
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r--Zend/zend_operators.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 82732ce49f..7a463b5494 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1154,10 +1154,11 @@ ZEND_API int bitwise_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */
zval op1_copy = *op1;
Z_TYPE_P(result) = IS_STRING;
- Z_STR_P(result) = STR_DUP(Z_STR(op1_copy), 0);
+ Z_STR_P(result) = STR_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];
}
+ Z_STRVAL_P(result)[i] = 0;
return SUCCESS;
}
default:
@@ -1187,10 +1188,11 @@ ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /
shorter = op1;
}
- str = STR_DUP(Z_STR_P(longer), 0);
+ str = STR_ALLOC(Z_STRLEN_P(longer), 0);
for (i = 0; i < Z_STRLEN_P(shorter); i++) {
- str->val[i] |= Z_STRVAL_P(shorter)[i];
+ str->val[i] = Z_STRVAL_P(longer)[i] | Z_STRVAL_P(shorter)[i];
}
+ memcpy(str->val + i, Z_STRVAL_P(longer) + i, Z_STRLEN_P(longer) - i + 1);
if (result==op1) {
STR_RELEASE(Z_STR_P(result));
}
@@ -1231,10 +1233,11 @@ ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
shorter = op1;
}
- str = STR_DUP(Z_STR_P(shorter), 0);
+ str = STR_ALLOC(Z_STRLEN_P(shorter), 0);
for (i = 0; i < Z_STRLEN_P(shorter); i++) {
- str->val[i] &= Z_STRVAL_P(longer)[i];
+ str->val[i] = Z_STRVAL_P(shorter)[i] & Z_STRVAL_P(longer)[i];
}
+ str->val[i] = 0;
if (result==op1) {
STR_RELEASE(Z_STR_P(result));
}
@@ -1275,10 +1278,11 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
shorter = op1;
}
- str = STR_DUP(Z_STR_P(shorter), 0);
+ str = STR_ALLOC(Z_STRLEN_P(shorter), 0);
for (i = 0; i < Z_STRLEN_P(shorter); i++) {
- str->val[i] ^= Z_STRVAL_P(longer)[i];
+ str->val[i] = Z_STRVAL_P(shorter)[i] ^ Z_STRVAL_P(longer)[i];
}
+ str->val[i] = 0;
if (result==op1) {
STR_RELEASE(Z_STR_P(result));
}
@@ -1872,10 +1876,10 @@ static void increment_string(zval *str) /* {{{ */
}
if (IS_INTERNED(Z_STR_P(str))) {
- Z_STR_P(str) = STR_DUP(Z_STR_P(str), 0);
+ Z_STR_P(str) = STR_INIT(Z_STRVAL_P(str), Z_STRLEN_P(str), 0);
} else if (Z_REFCOUNT_P(str) > 1) {
Z_DELREF_P(str);
- Z_STR_P(str) = STR_DUP(Z_STR_P(str), 0);
+ Z_STR_P(str) = STR_INIT(Z_STRVAL_P(str), Z_STRLEN_P(str), 0);
} else {
STR_FORGET_HASH_VAL(Z_STR_P(str));
}