From fe4988241d560bbf978139652a3ea120154e00ad Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Sun, 2 May 2010 16:32:25 +0000 Subject: [PATCH] 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 --- Zend/zend_compile.c | 10 ++--- Zend/zend_opcode.c | 91 +++++++++++++++++++++++++-------------------- 2 files changed, 56 insertions(+), 45 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7a21df99b0..249af9a1ad 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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; diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 2734379bce..11a846b5ff 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -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; -- 2.40.0