]> granicus.if.org Git - php/commitdiff
Refactored part of the Traits implementation.
authorStefan Marr <gron@php.net>
Sun, 2 May 2010 16:32:25 +0000 (16:32 +0000)
committerStefan Marr <gron@php.net>
Sun, 2 May 2010 16:32:25 +0000 (16:32 +0000)
# - renamed php_runkit_function_copy_ctor to _duplicate_function
#   REM: runkit does not compile with trunk at the moment, fixing it would introduce even more version #ifs, don't know what the best way is to fix it
# - extracted traits related stuff from destroy_zend_class into _destroy_zend_class_traits_info
#   - need to investigate implementation/handling of internal classes further before enabling internal traits

Zend/zend_compile.c
Zend/zend_opcode.c

index 7a21df99b005fe136e7ebb0c34a40005268cf1c0..249af9a1ad49ba67edaa819c6db92a58646b4ea8 100644 (file)
@@ -3321,9 +3321,9 @@ static int _merge_functions(zend_function *fn TSRMLS_DC, int num_args, va_list a
        else if (IS_EQUAL(mname, mname_len, "unserialize_func"))(ce)->unserialize_func  = (fe); \
 }
 
-/* {{{ php_runkit_function_copy_ctor
+/* {{{ Originates from php_runkit_function_copy_ctor
        Duplicate structures in an op_array where necessary to make an outright duplicate */
-void php_runkit_function_copy_ctor(zend_function *fe, char *newname)
+void _duplicate_function(zend_function *fe, char *newname)
 {
        zend_literal *literals_copy;
        zend_compiled_variable *dupvars;
@@ -3497,7 +3497,7 @@ static int _copy_functions(zend_function *fn TSRMLS_DC, int num_args, va_list ar
                                  fn->common.function_name, fnname_len) == 0)) {
                                if (aliases[i]->alias) {
                                        fn_copy = *fn;
-                                       php_runkit_function_copy_ctor(&fn_copy, estrndup(aliases[i]->alias, aliases[i]->alias_len));
+                                       _duplicate_function(&fn_copy, estrndup(aliases[i]->alias, aliases[i]->alias_len));
 
                                        if (aliases[i]->modifiers) { /* if it is 0, no modifieres has been changed */
                                                fn_copy.common.fn_flags = aliases[i]->modifiers;
@@ -3527,7 +3527,7 @@ static int _copy_functions(zend_function *fn TSRMLS_DC, int num_args, va_list ar
        if (zend_hash_find(exclude_table, lcname, lcname_len, &dummy) == FAILURE) {
                /* is not in hashtable, thus, function is not to be excluded */
                fn_copy = *fn;
-               php_runkit_function_copy_ctor(&fn_copy, estrndup(fn->common.function_name, fnname_len));
+               _duplicate_function(&fn_copy, estrndup(fn->common.function_name, fnname_len));
 
                /* apply aliases which are not qualified by a class name, or which have not alias name, just setting visibility */
                /* TODO: i am still not sure, that there will be no ambigousities... */
@@ -3543,7 +3543,7 @@ static int _copy_functions(zend_function *fn TSRMLS_DC, int num_args, va_list ar
                                                zend_uint lcname2_len;
                                                char* lcname2;
                                                zend_function fn_copy2 = *fn;
-                                               php_runkit_function_copy_ctor(&fn_copy2, estrndup(aliases[i]->alias, aliases[i]->alias_len));
+                                               _duplicate_function(&fn_copy2, estrndup(aliases[i]->alias, aliases[i]->alias_len));
 
                                                if (aliases[i]->modifiers) { /* if it is 0, no modifieres has been changed */
                                                        fn_copy2.common.fn_flags = aliases[i]->modifiers;
index 2734379bcef4797f3905c498d3aa29ad917fefd3..11a846b5fff4ccc852c501d13dec50d6080a279e 100644 (file)
@@ -176,6 +176,55 @@ ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC)
        return 0;
 }
 
+void _destroy_zend_class_traits_info(zend_class_entry *ce)
+{
+       if (ce->num_traits > 0 && ce->traits) {
+               efree(ce->traits);
+       }
+       
+       if (ce->trait_aliases) {
+               size_t i = 0;
+               while (ce->trait_aliases[i]) {
+                       if (ce->trait_aliases[i]->trait_method) {
+                               if (ce->trait_aliases[i]->trait_method->method_name) {
+                                       efree(ce->trait_aliases[i]->trait_method->method_name);
+                               }
+                               if (ce->trait_aliases[i]->trait_method->class_name) {
+                                       efree(ce->trait_aliases[i]->trait_method->class_name);
+                               }
+                               efree(ce->trait_aliases[i]->trait_method);
+                       }
+                       
+                       if (ce->trait_aliases[i]->alias) {
+                               efree(ce->trait_aliases[i]->alias);
+                       }
+                       
+                       efree(ce->trait_aliases[i]);
+                       i++;
+               }
+               
+               efree(ce->trait_aliases);
+       }
+
+       if (ce->trait_precedences) {
+               size_t i = 0;
+               
+               while (ce->trait_precedences[i]) {
+                       efree(ce->trait_precedences[i]->trait_method->method_name);
+                       efree(ce->trait_precedences[i]->trait_method->class_name);
+                       efree(ce->trait_precedences[i]->trait_method);
+
+                       if (ce->trait_precedences[i]->exclude_from_classes) {
+                               efree(ce->trait_precedences[i]->exclude_from_classes);
+                       }
+
+                       efree(ce->trait_precedences[i]);
+                       i++;
+               }
+               efree(ce->trait_precedences);
+       }
+}
+
 ZEND_API void destroy_zend_class(zend_class_entry **pce)
 {
        zend_class_entry *ce = *pce;
@@ -194,49 +243,11 @@ ZEND_API void destroy_zend_class(zend_class_entry **pce)
                        if (ce->num_interfaces > 0 && ce->interfaces) {
                                efree(ce->interfaces);
                        }
-            if (ce->num_traits > 0 && ce->traits) {
-               efree(ce->traits);
-            }
                        if (ce->doc_comment) {
                                efree(ce->doc_comment);
                        }
-                       if (ce->trait_aliases) {
-                               size_t i = 0;
-                               while (ce->trait_aliases[i]) {
-                                       if (ce->trait_aliases[i]->trait_method) {
-                                               if (ce->trait_aliases[i]->trait_method->method_name) {
-                                                       efree(ce->trait_aliases[i]->trait_method->method_name);
-                                               }
-                                               if (ce->trait_aliases[i]->trait_method->class_name) {
-                                                       efree(ce->trait_aliases[i]->trait_method->class_name);
-                                               }
-                                               efree(ce->trait_aliases[i]->trait_method);
-                                       }
-                                       if (ce->trait_aliases[i]->alias) {
-                                               efree(ce->trait_aliases[i]->alias);
-                                       }
-                                       efree(ce->trait_aliases[i]);
-                                       i++;
-                               }
-                               efree(ce->trait_aliases);
-                       }
-                       
-                       if (ce->trait_precedences) {
-                               size_t i = 0;
-                               while (ce->trait_precedences[i]) {
-                                       efree(ce->trait_precedences[i]->trait_method->method_name);
-                                       efree(ce->trait_precedences[i]->trait_method->class_name);
-                                       efree(ce->trait_precedences[i]->trait_method);
-                                       
-                                       if (ce->trait_precedences[i]->exclude_from_classes) {
-                                               efree(ce->trait_precedences[i]->exclude_from_classes);
-                                       }
-                                       
-                                       efree(ce->trait_precedences[i]);
-                                       i++;
-                               }
-                               efree(ce->trait_precedences);
-                       }
+                       
+                       _destroy_zend_class_traits_info(ce);
                        
                        efree(ce);
                        break;