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;
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;
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... */
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;
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;
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;