mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
STR_DUP() doesn't duplicate interned strings anymore. In case new string is required STR_INIT() or STR_ALLOC() should be used.
This commit is contained in:
parent
7eff369ba9
commit
a25a1ba0ef
9 changed files with 25 additions and 24 deletions
|
@ -741,7 +741,7 @@ static inline int zend_assign_to_string_offset(zval *str_offset, zval *value, in
|
|||
memset(Z_STRVAL_P(str) + old_len, ' ', offset - old_len);
|
||||
Z_STRVAL_P(str)[offset+1] = 0;
|
||||
} else 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);
|
||||
}
|
||||
|
||||
if (Z_TYPE_P(value) != IS_STRING) {
|
||||
|
|
|
@ -4178,7 +4178,7 @@ yy318:
|
|||
filename = STR_EMPTY_ALLOC();
|
||||
}
|
||||
|
||||
dirname = STR_DUP(filename, 0);
|
||||
dirname = STR_INIT(filename->val, filename->len, 0);
|
||||
zend_dirname(dirname->val, dirname->len);
|
||||
|
||||
if (strcmp(dirname->val, ".") == 0) {
|
||||
|
|
|
@ -1669,7 +1669,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
|
|||
filename = STR_EMPTY_ALLOC();
|
||||
}
|
||||
|
||||
dirname = STR_DUP(filename, 0);
|
||||
dirname = STR_INIT(filename->val, filename->len, 0);
|
||||
zend_dirname(dirname->val, dirname->len);
|
||||
|
||||
if (strcmp(dirname->val, ".") == 0) {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -125,11 +125,11 @@ static zend_always_inline zend_string *zend_str_copy(zend_string *s)
|
|||
|
||||
static zend_always_inline zend_string *zend_str_dup(zend_string *s, int persistent)
|
||||
{
|
||||
//??? if (IS_INTERNED(s)) {
|
||||
//??? return s;
|
||||
//??? } else {
|
||||
if (IS_INTERNED(s)) {
|
||||
return s;
|
||||
} else {
|
||||
return STR_INIT(s->val, s->len, persistent);
|
||||
//??? }
|
||||
}
|
||||
}
|
||||
|
||||
static zend_always_inline zend_string *zend_str_realloc(zend_string *s, int len, int persistent)
|
||||
|
|
|
@ -237,9 +237,7 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC)
|
|||
case IS_CONSTANT:
|
||||
case IS_STRING:
|
||||
CHECK_ZVAL_STRING_REL(zvalue);
|
||||
if (!IS_INTERNED(Z_STR_P(zvalue))) {
|
||||
Z_STR_P(zvalue) = STR_DUP(Z_STR_P(zvalue), 0);
|
||||
}
|
||||
Z_STR_P(zvalue) = STR_DUP(Z_STR_P(zvalue), 0);
|
||||
break;
|
||||
case IS_ARRAY:
|
||||
case IS_CONSTANT_ARRAY: {
|
||||
|
|
|
@ -575,14 +575,13 @@ static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *in
|
|||
zend_string *prop_name;
|
||||
ulong index;
|
||||
|
||||
if (zend_hash_get_current_key_ex(properties, &prop_name, &index, 1, &pos) == HASH_KEY_IS_STRING) {
|
||||
if (zend_hash_get_current_key_ex(properties, &prop_name, &index, 0, &pos) == HASH_KEY_IS_STRING) {
|
||||
if (prop_name->len && prop_name->val[0]) { /* skip all private and protected properties */
|
||||
if (!zend_hash_exists(&ce->properties_info, prop_name)) {
|
||||
count++;
|
||||
_property_string(&dyn, NULL, prop_name->val, sub_indent.buf->val TSRMLS_CC);
|
||||
}
|
||||
}
|
||||
efree(prop_name);
|
||||
}
|
||||
zend_hash_move_forward_ex(properties, &pos);
|
||||
}
|
||||
|
|
|
@ -2865,7 +2865,7 @@ PHP_FUNCTION(array_change_key_case)
|
|||
zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry);
|
||||
break;
|
||||
case HASH_KEY_IS_STRING:
|
||||
new_key = STR_DUP(string_key, 0);
|
||||
new_key = STR_INIT(string_key->val, string_key->len, 0);
|
||||
if (change_to_upper) {
|
||||
php_strtoupper(new_key->val, new_key->len);
|
||||
} else {
|
||||
|
|
|
@ -555,7 +555,7 @@ PHP_FUNCTION(urldecode)
|
|||
return;
|
||||
}
|
||||
|
||||
out_str = STR_DUP(in_str, 0);
|
||||
out_str = STR_INIT(in_str->val, in_str->len, 0);
|
||||
out_str->len = php_url_decode(out_str->val, out_str->len);
|
||||
|
||||
RETURN_STR(out_str);
|
||||
|
@ -650,7 +650,7 @@ PHP_FUNCTION(rawurldecode)
|
|||
return;
|
||||
}
|
||||
|
||||
out_str = STR_DUP(in_str, 0);
|
||||
out_str = STR_INIT(in_str->val, in_str->len, 0);
|
||||
out_str->len = php_raw_url_decode(out_str->val, out_str->len);
|
||||
|
||||
RETURN_STR(out_str);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue