From: Dmitry Stogov Date: Tue, 1 Apr 2014 12:31:03 +0000 (+0400) Subject: STR_DUP() doesn't duplicate interned strings anymore. In case new string is required... X-Git-Tag: POST_PHPNG_MERGE~412^2~185 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a25a1ba0ef263e9e1d65b8eaebd3e764878c55c7;p=php STR_DUP() doesn't duplicate interned strings anymore. In case new string is required STR_INIT() or STR_ALLOC() should be used. --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 344b21bc4f..e2de52c777 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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) { diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 543f0615c4..fe2f7186c4 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -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) { diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index f7285bf86c..877eb78b66 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -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) { 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)); } diff --git a/Zend/zend_string.h b/Zend/zend_string.h index 8c93ef48ac..3a94ba03e8 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -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) diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 4a7fb4f74a..e9a0db8654 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -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: { diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 20d3eb0e73..869a68d45c 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -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); } diff --git a/ext/standard/array.c b/ext/standard/array.c index 5e5fa73cd7..864802ea53 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -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 { diff --git a/ext/standard/url.c b/ext/standard/url.c index d280717d84..26587dc8f8 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -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);