]> granicus.if.org Git - php/commitdiff
STR_DUP() doesn't duplicate interned strings anymore. In case new string is required...
authorDmitry Stogov <dmitry@zend.com>
Tue, 1 Apr 2014 12:31:03 +0000 (16:31 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 1 Apr 2014 12:31:03 +0000 (16:31 +0400)
Zend/zend_execute.c
Zend/zend_language_scanner.c
Zend/zend_language_scanner.l
Zend/zend_operators.c
Zend/zend_string.h
Zend/zend_variables.c
ext/reflection/php_reflection.c
ext/standard/array.c
ext/standard/url.c

index 344b21bc4f75b0f9fbc012d032e32775aafe23f3..e2de52c7777a6f06f84ac45ed495075752e478ea 100644 (file)
@@ -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) {
index 543f0615c4fbb2accaa586187b1092bd7ec044f6..fe2f7186c48ca94bd0fb69c405d95be8da064fef 100644 (file)
@@ -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) {
index f7285bf86c3a5dafea9ef83f5d949366410c8f51..877eb78b6601ce1dddbf8dc8c483de675623005c 100644 (file)
@@ -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) {
index 82732ce49fe67f763f032baed476707d9dd1d181..7a463b549478e900826e07d11e7d42af9fe8588e 100644 (file)
@@ -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));
        }
index 8c93ef48ac69864f6d02f925db3444b17e5a0504..3a94ba03e8983a2827d09400aead3d9983e79117 100644 (file)
@@ -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)
index 4a7fb4f74a80a629ac77c71bcb7e50befc6e78a2..e9a0db865483dae6412952efaa576c20108b9927 100644 (file)
@@ -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: {
index 20d3eb0e73e99b6d74b7b8571abf1d4401e4bc79..869a68d45cfbfce9475e8a88ec8d32ce956dff12 100644 (file)
@@ -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);
                        }
index 5e5fa73cd7d4c72ef9fdc7010dcaaf569764d82b..864802ea53912d51f70b95dc178ef12b2e4e2397 100644 (file)
@@ -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 {
index d280717d8451e1575979800ad9f826667dd94cbd..26587dc8f8a6b2163310d4c06ad9b5102534f925 100644 (file)
@@ -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);