]> granicus.if.org Git - php/commitdiff
Use interned strings for class names
authorDmitry Stogov <dmitry@php.net>
Thu, 5 Aug 2010 13:10:15 +0000 (13:10 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 5 Aug 2010 13:10:15 +0000 (13:10 +0000)
Zend/zend_API.h
Zend/zend_compile.c
Zend/zend_iterators.c
Zend/zend_opcode.c

index 5e5a4eab1492cb7f48ff66fc14e9fef62cb6b7fa..2daf500a6eaef3b8d9d12c8afc4c311201527ca0 100644 (file)
@@ -167,7 +167,10 @@ typedef struct _zend_fcall_info_cache {
 #define INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
        {                                                                                                                       \
                int _len = class_name_len;                                                              \
-               class_container.name = zend_strndup(class_name, _len);  \
+               class_container.name = zend_new_interned_string(class_name, _len+1, 0); \
+               if (class_container.name == class_name) {                               \
+                       class_container.name = zend_strndup(class_name, _len);  \
+               }                                                                                                               \
                class_container.name_length = _len;                                             \
                class_container.builtin_functions = functions;                  \
                class_container.constructor = NULL;                                             \
index f8efe8c43e40762f0cd48eb4c4a0d820a4a5c885..dd88c5b31c3cecf404b94aae5722248c5fe90453 100644 (file)
@@ -4486,8 +4486,8 @@ void zend_do_begin_class_declaration(const znode *class_token, znode *class_name
 
        new_class_entry = emalloc(sizeof(zend_class_entry));
        new_class_entry->type = ZEND_USER_CLASS;
-       new_class_entry->name = class_name->u.constant.value.str.val;
-       new_class_entry->name_length = class_name->u.constant.value.str.len;
+       new_class_entry->name = zend_new_interned_string(Z_STRVAL(class_name->u.constant), Z_STRLEN(class_name->u.constant) + 1, 1 TSRMLS_CC);
+       new_class_entry->name_length = Z_STRLEN(class_name->u.constant);
 
        zend_initialize_class_data(new_class_entry, 1 TSRMLS_CC);
        new_class_entry->filename = zend_get_compiled_filename(TSRMLS_C);
index 533cd5384aa2c685377594ddca27ba159e6bc6d6..ba6378d918c6c2707f7da52255316250f50b74bd 100755 (executable)
@@ -51,8 +51,6 @@ static zend_object_handlers iterator_object_handlers = {
 ZEND_API void zend_register_iterator_wrapper(TSRMLS_D)
 {
        INIT_CLASS_ENTRY(zend_iterator_class_entry, "__iterator_wrapper", NULL);
-       free(zend_iterator_class_entry.name);
-       zend_iterator_class_entry.name = "__iterator_wrapper";
 }
 
 static void iter_wrapper_dtor(void *object, zend_object_handle handle TSRMLS_DC)
index a0d82e1963efb7b977b6ae0fa721e5ec1d8d54b0..d33fe98ad20d48d39672b1d450ff881568c789fd 100644 (file)
@@ -301,7 +301,9 @@ ZEND_API void destroy_zend_class(zend_class_entry **pce)
                                efree(ce->default_static_members_table);
                        }
                        zend_hash_destroy(&ce->properties_info);
-                       efree(ce->name);
+                       if (!IS_INTERNED(ce->name)) {
+                               efree(ce->name);
+                       }
                        zend_hash_destroy(&ce->function_table);
                        zend_hash_destroy(&ce->constants_table);
                        if (ce->num_interfaces > 0 && ce->interfaces) {
@@ -335,7 +337,9 @@ ZEND_API void destroy_zend_class(zend_class_entry **pce)
                                free(ce->default_static_members_table);
                        }
                        zend_hash_destroy(&ce->properties_info);
-                       free(ce->name);
+                       if (!IS_INTERNED(ce->name)) {
+                               free(ce->name);
+                       }
                        zend_hash_destroy(&ce->function_table);
                        zend_hash_destroy(&ce->constants_table);
                        if (ce->num_interfaces > 0) {