php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Return to Bug #64239
Patch bug64239-2.patch revision 2013-03-21 09:06 UTC by dmitry@php.net
revision 2013-03-21 07:55 UTC by dmitry at zend dot com
Patch bug64329.patch revision 2013-03-21 08:18 UTC by laruence@php.net
Patch bug64239.patch revision 2013-03-21 06:04 UTC by laruence@php.net

Patch bug64239-2.patch for *General Issues Bug #64239

Patch version 2013-03-21 09:06 UTC

Return to Bug #64239 | Download this patch
This patch renders other patches obsolete

Obsolete patches:

Patch Revisions: 2013-03-21 09:06 UTC | 2013-03-21 07:55 UTC

Developer: dmitry@php.net

Line 1 (now 1), was 67 lines, now 47 lines

  diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
 index dcb1818..0141056 100644
 index dcb1818..97f1297 100644
  --- a/Zend/zend_builtin_functions.c
  +++ b/Zend/zend_builtin_functions.c
 @@ -1033,6 +1033,80 @@ static int same_name(const char *key, const char *name, zend_uint name_len)
 @@ -1033,6 +1033,60 @@ static int same_name(const char *key, const char *name, zend_uint name_len)
   	return ret;
   }
   
 +static int zend_class_has_aliases(zend_class_entry *ce)
 +{
 +	while (1) {
 +		if (ce) {
 +			if (ce->trait_aliases) {
 +				return 1;
 +			} else {
 +				ce = ce->parent;
 +			}
 +		} else {
 +			return 0;
 +		}
 +	}
 +}
 +
  +static const char* zend_find_alias_name(zend_class_entry *ce, const char *name, zend_uint len)
  +{
  +	zend_trait_alias *alias, **alias_ptr;
  +
 +	do {
 +		alias_ptr = ce->trait_aliases;
 +	alias_ptr = ce->trait_aliases;
 +	alias = *alias_ptr;
 +	while (alias) {
 +		if (alias->alias_len == len &&
 +		    same_name(name, alias->alias, alias->alias_len)) {
 +			return alias->alias;
 +		}
 +		alias_ptr++;
  +		alias = *alias_ptr;
 +		while (alias) {
 +			if (alias->alias_len == len &&
 +			    same_name(name, alias->alias, alias->alias_len)) {
 +				return alias->alias;
 +			}
 +			alias_ptr++;
 +			alias = *alias_ptr;
 +		}
 +	} while ((ce = ce->parent));
 +	}
  +
  +	return name;
  +}
  +
 +ZEND_API const char* zend_resolve_method_name(zend_function *f)
 +ZEND_API const char* zend_resolve_method_name(zend_class_entry *ce, zend_function *f)
  +{
  +	zend_function *func;
  +	HashPosition iterator;
 +	zend_class_entry *ce;
  +	HashTable *function_table;
  +
 +	if (f->common.type != ZEND_USER_FUNCTION || *(f->op_array.refcount) < 2) {
 +		return f->common.function_name;
 +	}
 +
 +	ce = f->common.scope;
 +	if (!zend_class_has_aliases(ce)) {
 +	if (f->common.type != ZEND_USER_FUNCTION ||
 +	    *(f->op_array.refcount) < 2 ||
 +	    !f->common.scope ||
 +	    !f->common.scope->trait_aliases) {
  +		return f->common.function_name;
  +	}
  +
  +	function_table = &ce->function_table;
  +	zend_hash_internal_pointer_reset_ex(function_table, &iterator);
  +	while (zend_hash_get_current_data_ex(function_table, (void **)&func, &iterator) == SUCCESS) {
 +		if (func->op_array.opcodes == f->op_array.opcodes) {
 +		if (func == f) {
  +			char *name;
  +			uint len;
  +			ulong idx;
  +


  +			if (len == strlen(f->common.function_name) &&
  +			    same_name(name, f->common.function_name, len)) {
  +				return f->common.function_name;
  +			}
 +			return zend_find_alias_name(ce, name, len);
 +			return zend_find_alias_name(f->common.scope, name, len);
  +		}
  +		zend_hash_move_forward_ex(function_table, &iterator);
  +	}
  +	return f->common.function_name;


  +
   /* {{{ proto array get_class_methods(mixed class)
      Returns an array of method names for class or class instance. */
   ZEND_FUNCTION(get_class_methods)
 @@ -1092,7 +1166,7 @@ ZEND_FUNCTION(get_class_methods)
 @@ -1092,7 +1146,7 @@ ZEND_FUNCTION(get_class_methods)
   			    	(len != key_len - 1 ||
   			    	 !same_name(key, mptr->common.function_name, len))) {
   					MAKE_STD_ZVAL(method_name);
  -					ZVAL_STRINGL(method_name, key, key_len - 1, 1);
  +					ZVAL_STRINGL(method_name, zend_find_alias_name(mptr->common.scope, key, key_len - 1), key_len - 1, 1);
   					zend_hash_next_index_insert(return_value->value.ht, &method_name, sizeof(zval *), NULL);
   				} else {
   					MAKE_STD_ZVAL(method_name);
 @@ -2118,7 +2192,9 @@ ZEND_FUNCTION(debug_print_backtrace)
 @@ -2118,7 +2172,14 @@ ZEND_FUNCTION(debug_print_backtrace)
   			lineno = 0;
   		}
   
  -		function_name = ptr->function_state.function->common.function_name;
 +		function_name = ptr->function_state.function->common.scope ?
 +			zend_resolve_method_name(ptr->function_state.function) :
 +			ptr->function_state.function->common.function_name;
 +		function_name = (ptr->function_state.function->common.scope &&
 +			ptr->function_state.function->common.scope->trait_aliases) ?
 +				zend_resolve_method_name(
 +					ptr->object ?
 +						Z_OBJCE_P(ptr->object) : 
 +						ptr->function_state.function->common.scope,
 +					ptr->function_state.function) :
 +				ptr->function_state.function->common.function_name;
   
   		if (function_name) {
   			if (ptr->object) {
 @@ -2299,7 +2375,9 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
 @@ -2299,7 +2360,14 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
   			filename = NULL;
   		}
   
  -		function_name = ptr->function_state.function->common.function_name;
 +		function_name = ptr->function_state.function->common.scope ?
 +			zend_resolve_method_name(ptr->function_state.function) :
 +			ptr->function_state.function->common.function_name;
 +		function_name = (ptr->function_state.function->common.scope &&
 +			ptr->function_state.function->common.scope->trait_aliases) ?
 +				zend_resolve_method_name(
 +					ptr->object ?
 +						Z_OBJCE_P(ptr->object) : 
 +						ptr->function_state.function->common.scope,
 +					ptr->function_state.function) :
 +				ptr->function_state.function->common.function_name;
   
   		if (function_name) {
   			add_assoc_string_ex(stack_frame, "function", sizeof("function"), (char*)function_name, 1);
 
PHP Copyright © 2001-2014 The PHP Group
All rights reserved.
Last updated: Sat Apr 19 06:02:27 2014 UTC