gron Sun, 02 May 2010 16:32:25 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=298877
Log: Refactored part of the Traits implementation. # - 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 Changed paths: U php/php-src/trunk/Zend/zend_compile.c U php/php-src/trunk/Zend/zend_opcode.c Modified: php/php-src/trunk/Zend/zend_compile.c =================================================================== --- php/php-src/trunk/Zend/zend_compile.c 2010-05-02 15:38:31 UTC (rev 298876) +++ php/php-src/trunk/Zend/zend_compile.c 2010-05-02 16:32:25 UTC (rev 298877) @@ -3321,9 +3321,9 @@ 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 @@ 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 @@ 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 @@ 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; Modified: php/php-src/trunk/Zend/zend_opcode.c =================================================================== --- php/php-src/trunk/Zend/zend_opcode.c 2010-05-02 15:38:31 UTC (rev 298876) +++ php/php-src/trunk/Zend/zend_opcode.c 2010-05-02 16:32:25 UTC (rev 298877) @@ -176,6 +176,55 @@ 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,50 +243,12 @@ 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; case ZEND_INTERNAL_CLASS:
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php