]> granicus.if.org Git - php/commitdiff
Improved empty string handling. Now ZE uses an interned string instead of allocation...
authorDmitry Stogov <dmitry@zend.com>
Thu, 26 Dec 2013 10:47:13 +0000 (14:47 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 26 Dec 2013 10:47:13 +0000 (14:47 +0400)
NEWS
Zend/zend.h
Zend/zend_compile.c
Zend/zend_extensions.h
Zend/zend_globals.h
Zend/zend_modules.h
Zend/zend_string.c
ext/opcache/ZendAccelerator.c
ext/session/mod_user_class.c
ext/session/session.c
ext/spl/spl_iterators.c

diff --git a/NEWS b/NEWS
index 536ab75ada47eb6e47f6d50fe5367f57a44c2073..384faecfba68d2b99a266e0a1c45806ac19ac597 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ PHP                                                                        NEWS
 
 - Core:
   . Improved IS_VAR operands fetching. (Laruence, Dmitry)
+  . Improved empty string handling. Now ZE uses an interned string instead of
+    allocation new empty string each time. (Laruence, Dmitry)
   . Implemented internal operator overloading
     (RFC: https://wiki.php.net/rfc/operator_overloading_gmp). (Nikita)
   . Made calls from incompatible context issue an E_DEPRECATED warning instead
index 3ac559e05ce729ff1389f167b0cd992c8a1e07fa..cb55871342eb13a33f19bda1baf08a50accb637e 100644 (file)
@@ -680,7 +680,11 @@ END_EXTERN_C()
 #define STR_FREE(ptr) if (ptr) { str_efree(ptr); }
 #define STR_FREE_REL(ptr) if (ptr) { str_efree_rel(ptr); }
 
+#ifndef ZTS
+#define STR_EMPTY_ALLOC() CG(interned_empty_string)? CG(interned_empty_string) : estrndup("", sizeof("")-1)
+#else
 #define STR_EMPTY_ALLOC() estrndup("", sizeof("")-1)
+#endif
 
 #define STR_REALLOC(ptr, size) \
                        ptr = (char *) erealloc(ptr, size);
index c61f3a26f6a0eceab9f92e3b2c4b89b669d227a6..a0ea594560242484646d9dceee7146676f3f7fe5 100644 (file)
@@ -2461,14 +2461,14 @@ void zend_do_build_full_name(znode *result, znode *prefix, znode *name, int is_c
 
        if (is_class_member) {
                length = sizeof("::")-1 + Z_STRLEN(result->u.constant) + Z_STRLEN(name->u.constant);
-               Z_STRVAL(result->u.constant) = erealloc(Z_STRVAL(result->u.constant), length+1);
+               Z_STRVAL(result->u.constant) = str_erealloc(Z_STRVAL(result->u.constant), length+1);
                memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant)], "::", sizeof("::")-1);
                memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant) + sizeof("::")-1], Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1);
                str_efree(Z_STRVAL(name->u.constant));
                Z_STRLEN(result->u.constant) = length;
        } else {
                length = sizeof("\\")-1 + Z_STRLEN(result->u.constant) + Z_STRLEN(name->u.constant);
-               Z_STRVAL(result->u.constant) = erealloc(Z_STRVAL(result->u.constant), length+1);
+               Z_STRVAL(result->u.constant) = str_erealloc(Z_STRVAL(result->u.constant), length+1);
                memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant)], "\\", sizeof("\\")-1);
                memcpy(&Z_STRVAL(result->u.constant)[Z_STRLEN(result->u.constant) + sizeof("\\")-1], Z_STRVAL(name->u.constant), Z_STRLEN(name->u.constant)+1);
                str_efree(Z_STRVAL(name->u.constant));
index e59c9ade8bd7ad46098c59afb42b97bca8532629..44e516a37e149751eaa96a014b911146753de82d 100644 (file)
@@ -28,7 +28,7 @@
 /* The first number is the engine version and the rest is the date.
  * This way engine 2/3 API no. is always greater than engine 1 API no..
  */
-#define ZEND_EXTENSION_API_NO  220131107
+#define ZEND_EXTENSION_API_NO  220131226
 
 typedef struct _zend_extension_version_info {
        int zend_extension_api_no;
index 27d471fa069a7daa40e1d869703b545756df5cb3..363f4ee7cbbd635c8c3c23d4fa57799461784226 100644 (file)
@@ -146,6 +146,9 @@ struct _zend_compiler_globals {
        char *interned_strings_end;
        char *interned_strings_top;
        char *interned_strings_snapshot_top;
+#ifndef ZTS
+       char *interned_empty_string;
+#endif
 
        HashTable interned_strings;
 
index 00209a0ddc81d04177a020e9737d3570466a32d7..6be24f25eb5504b17fc3dd723f27b727703521b3 100644 (file)
@@ -33,7 +33,7 @@
 #define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module TSRMLS_DC
 #define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module TSRMLS_CC
 
-#define ZEND_MODULE_API_NO 20131106
+#define ZEND_MODULE_API_NO 20131226
 #ifdef ZTS
 #define USING_ZTS 1
 #else
index ff7ee3fd81a22e0dc2fc4702b2682f6048b000b3..6ecb42b7ac4a5095c12e4558c5df132f9aaea435 100644 (file)
@@ -61,6 +61,8 @@ void zend_interned_strings_init(TSRMLS_D)
        mprotect(CG(interned_strings_start), CG(interned_strings_end) - CG(interned_strings_start), PROT_READ);
 #endif
 
+    /* interned empty string */
+       CG(interned_empty_string) = zend_new_interned_string_int("", sizeof(""), 0 TSRMLS_CC);
 #endif
 
        zend_new_interned_string = zend_new_interned_string_int;
index ac6ee1e0bdcbe846e5a45c4c0748ca4a8a71b7a6..e12f0b981a6f9fcfd255d6e8525640d5287d2a53 100644 (file)
@@ -387,6 +387,9 @@ static void accel_use_shm_interned_strings(TSRMLS_D)
 {
        Bucket *p, *q;
 
+       /* empty string */
+       CG(interned_empty_string) = accel_new_interned_string("", sizeof(""), 0 TSRMLS_CC);
+
        /* function table hash keys */
        p = CG(function_table)->pListHead;
        while (p) {
index ea53af9ebe15a46bc6dda5bef4dd17db45410654..3f97f7c8307b7922410f6b7a4e1879f13a7fe78f 100644 (file)
@@ -86,7 +86,7 @@ PHP_METHOD(SessionHandler, read)
        }
 
        RETVAL_STRINGL(val, val_len, 1);
-       efree(val);
+       str_efree(val);
        return;
 }
 /* }}} */
index 5b4820a65cfa483507d7a7dbc9a2b199654b2cad..a3d565d895ad888697f0eaeca627b09be54520c2 100644 (file)
@@ -513,9 +513,9 @@ static void php_session_initialize(TSRMLS_D) /* {{{ */
                PHP_MD5Final(PS(session_data_hash), &context);
 
                php_session_decode(val, vallen TSRMLS_CC);
-               efree(val);
+               str_efree(val);
        } else {
-                       memset(PS(session_data_hash),'\0', 16);
+               memset(PS(session_data_hash),'\0', 16);
        }
 
        if (!PS(use_cookies) && PS(send_cookie)) {
index 30532756cb6d614bba6d079004eb7683ed3cddb2..b79312e0194246973a9c62028da502e889e53e42 100644 (file)
@@ -2059,7 +2059,7 @@ SPL_METHOD(RegexIterator, accept)
        }
 
        if (use_copy) {
-               efree(subject);
+               str_efree(subject);
        }
 } /* }}} */