Browse Source

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
experimental/lemon
Stefan Marr 16 years ago
parent
commit
fe4988241d
  1. 10
      Zend/zend_compile.c
  2. 91
      Zend/zend_opcode.c

10
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;

91
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;

Loading…
Cancel
Save