Commit 1982388a by Alexandre Petit-Bianco Committed by Alexandre Petit-Bianco

[multiple changes]

1999-03-19  Alexandre Petit-Bianco  <apbianco@cygnus.com>
	* parse.y (find_applicable_accessible_methods_list): Extend the
	search to superinterfaces when relevant.
	(search_applicable_methods_list): New function.
1999-03-18  Alexandre Petit-Bianco  <apbianco@cygnus.com>
	* class.c (unmangle_classname): Implemented stricter testing
	before setting the QUALIFIED_P flag on an identifier.

From-SVN: r25861
parent 8db99db2
1999-03-19 Alexandre Petit-Bianco <apbianco@cygnus.com>
* parse.y (find_applicable_accessible_methods_list): Extend the
search to superinterfaces when relevant.
(search_applicable_methods_list): New function.
1999-03-18 Alexandre Petit-Bianco <apbianco@cygnus.com>
* class.c (unmangle_classname): Implemented stricter testing
before setting the QUALIFIED_P flag on an identifier.
Tue Mar 16 15:15:41 1999 Per Bothner <bothner@cygnus.com> Tue Mar 16 15:15:41 1999 Per Bothner <bothner@cygnus.com>
* parse.y (java_complete_lhs): Call force_evaluation_order * parse.y (java_complete_lhs): Call force_evaluation_order
......
...@@ -142,8 +142,18 @@ unmangle_classname (name, name_length) ...@@ -142,8 +142,18 @@ unmangle_classname (name, name_length)
const char *name; int name_length; const char *name; int name_length;
{ {
tree to_return = ident_subst (name, name_length, "", '/', '.', ""); tree to_return = ident_subst (name, name_length, "", '/', '.', "");
if (to_return != get_identifier ((char *)name)) /* It's not sufficient to compare to_return and get_identifier
QUALIFIED_P (to_return) = 1; (name) to determine whether to_return is qualified. There are
cases in signature analysis where name will be stripped of a
trailing ';'. */
name = IDENTIFIER_POINTER (to_return);
while (*name)
if (*name++ == '.')
{
QUALIFIED_P (to_return) = 1;
break;
}
return to_return; return to_return;
} }
......
...@@ -118,6 +118,8 @@ static tree resolve_no_layout PROTO ((tree, tree)); ...@@ -118,6 +118,8 @@ static tree resolve_no_layout PROTO ((tree, tree));
static int invocation_mode PROTO ((tree, int)); static int invocation_mode PROTO ((tree, int));
static tree find_applicable_accessible_methods_list PROTO ((int, tree, static tree find_applicable_accessible_methods_list PROTO ((int, tree,
tree, tree)); tree, tree));
static void search_applicable_methods_list PROTO ((int, tree, tree, tree,
tree *, tree *));
static tree find_most_specific_methods_list PROTO ((tree)); static tree find_most_specific_methods_list PROTO ((tree));
static int argument_types_convertible PROTO ((tree, tree)); static int argument_types_convertible PROTO ((tree, tree));
static tree patch_invoke PROTO ((tree, tree, tree)); static tree patch_invoke PROTO ((tree, tree, tree));
...@@ -7164,40 +7166,72 @@ find_applicable_accessible_methods_list (lc, class, name, arglist) ...@@ -7164,40 +7166,72 @@ find_applicable_accessible_methods_list (lc, class, name, arglist)
int lc; int lc;
tree class, name, arglist; tree class, name, arglist;
{ {
tree method;
tree list = NULL_TREE, all_list = NULL_TREE; tree list = NULL_TREE, all_list = NULL_TREE;
while (class != NULL_TREE) /* Search interfaces */
if (CLASS_INTERFACE (TYPE_NAME (class)))
{ {
for (method = TYPE_METHODS (class); int i, n;
method != NULL_TREE; method = TREE_CHAIN (method)) tree basetype_vec = TYPE_BINFO_BASETYPES (class);
search_applicable_methods_list
(lc, TYPE_METHODS (class), name, arglist, &list, &all_list);
n = TREE_VEC_LENGTH (basetype_vec);
for (i = 0; i < n; i++)
{ {
if (lc && !DECL_CONSTRUCTOR_P (method)) tree rlist =
continue; find_applicable_accessible_methods_list
else if (!lc && (DECL_CONSTRUCTOR_P (method) (lc, BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)),
|| (GET_METHOD_NAME (method) != name))) name, arglist);
continue; all_list = chainon (rlist, (list ? list : all_list));
if (argument_types_convertible (method, arglist))
{
/* Retain accessible methods only */
if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
method, 0))
list = tree_cons (NULL_TREE, method, list);
else
/* Also retain all selected method here */
all_list = tree_cons (NULL_TREE, method, list);
}
} }
/* When dealing with constructor, stop here, otherwise search
other classes */
class = (lc ? NULL_TREE : CLASSTYPE_SUPER (class));
} }
/* Search classes */
else
while (class != NULL_TREE)
{
search_applicable_methods_list
(lc, TYPE_METHODS (class), name, arglist, &list, &all_list);
class = (lc ? NULL_TREE : CLASSTYPE_SUPER (class));
}
/* Either return the list obtained or all selected (but /* Either return the list obtained or all selected (but
inaccessible) methods for better error report. */ inaccessible) methods for better error report. */
return (!list ? all_list : list); return (!list ? all_list : list);
} }
/* Effectively search for the approriate method in method */
static void
search_applicable_methods_list(lc, method, name, arglist, list, all_list)
int lc;
tree method, name, arglist;
tree *list, *all_list;
{
for (; method; method = TREE_CHAIN (method))
{
/* When dealing with constructor, stop here, otherwise search
other classes */
if (lc && !DECL_CONSTRUCTOR_P (method))
continue;
else if (!lc && (DECL_CONSTRUCTOR_P (method)
|| (GET_METHOD_NAME (method) != name)))
continue;
if (argument_types_convertible (method, arglist))
{
/* Retain accessible methods only */
if (!not_accessible_p (DECL_CONTEXT (current_function_decl),
method, 0))
*list = tree_cons (NULL_TREE, method, *list);
else
/* Also retain all selected method here */
*all_list = tree_cons (NULL_TREE, method, *list);
}
}
}
/* 15.11.2.2 Choose the Most Specific Method */ /* 15.11.2.2 Choose the Most Specific Method */
static tree static tree
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment