[multiple changes]

2000-03-06  Bryce McKinlay <bryce@albatross.co.nz>

	* typeck.c (lookup_do): Search superinterfaces first
	when looking up an interface method. From Godmar Back
	<gback@cs.utah.edu>

2000-03-02  Alexandre Petit-Bianco  <apbianco@cygnus.com>

	* java-tree.h (lookup_argument_method2): Declared.
	(safe_layout_class): Prototype moved from parse.h.
	* parse.h (safe_layout_class): Prototype moved to java-tree.h.
	* parse.y (java_check_regular_methods): Local `super_class' gone.
	Call lookup_argument_method2 instead of lookup_argument_method.
	Perform modifier match for methods found declared in implemented
	interfaces. Fixed indentation problem. Overriding/hiding error
	report to take place only for methods found in classes.
	* typeck.c (lookup_argument_method): Changed leading
	comment. Re-written by calling lookup_do.
	(lookup_argument_method2): New function.
	(lookup_java_method): Re-written by calling lookup_do.
	(lookup_do): New function.

From-SVN: r32376
This commit is contained in:
Alexandre Petit-Bianco 2000-03-06 22:25:14 -08:00
parent 141b581084
commit 614eaae0a5
5 changed files with 134 additions and 72 deletions

View File

@ -1,3 +1,25 @@
2000-03-06 Bryce McKinlay <bryce@albatross.co.nz>
* typeck.c (lookup_do): Search superinterfaces first
when looking up an interface method. From Godmar Back
<gback@cs.utah.edu>
2000-03-02 Alexandre Petit-Bianco <apbianco@cygnus.com>
* java-tree.h (lookup_argument_method2): Declared.
(safe_layout_class): Prototype moved from parse.h.
* parse.h (safe_layout_class): Prototype moved to java-tree.h.
* parse.y (java_check_regular_methods): Local `super_class' gone.
Call lookup_argument_method2 instead of lookup_argument_method.
Perform modifier match for methods found declared in implemented
interfaces. Fixed indentation problem. Overriding/hiding error
report to take place only for methods found in classes.
* typeck.c (lookup_argument_method): Changed leading
comment. Re-written by calling lookup_do.
(lookup_argument_method2): New function.
(lookup_java_method): Re-written by calling lookup_do.
(lookup_do): New function.
2000-03-06 Tom Tromey <tromey@cygnus.com>
* Make-lang.in (JAVA_SRCS): Added boehm.c, lex.c.

View File

@ -510,6 +510,7 @@ extern tree lookup_class PARAMS ((tree));
extern tree lookup_java_constructor PARAMS ((tree, tree));
extern tree lookup_java_method PARAMS ((tree, tree, tree));
extern tree lookup_argument_method PARAMS ((tree, tree, tree));
extern tree lookup_argument_method2 PARAMS ((tree, tree, tree));
extern tree promote_type PARAMS ((tree));
extern tree get_constant PARAMS ((struct JCF*, int));
extern tree get_name_constant PARAMS ((struct JCF*, int));
@ -665,6 +666,7 @@ extern char* open_class PARAMS ((char *, struct JCF *, int, const char *));
# endif /* JCF_USE_STDIO */
#endif
void java_debug_context PARAMS ((void));
void safe_layout_class PARAMS ((tree));
extern tree get_boehm_type_descriptor PARAMS ((tree));

View File

@ -678,7 +678,6 @@ struct parser_ctxt {
};
#ifndef JC1_LITE
void safe_layout_class PARAMS ((tree));
void java_complete_class PARAMS ((void));
void java_check_circular_reference PARAMS ((void));
void java_fix_constructors PARAMS ((void));

View File

@ -4762,7 +4762,7 @@ check_abstract_method_definitions (do_interface, class_decl, type)
}
}
/* Check that CLASS_DECL somehoow implements all inherited abstract
/* Check that CLASS_DECL somehow implements all inherited abstract
methods. */
static void
@ -4807,7 +4807,6 @@ java_check_regular_methods (class_decl)
int saw_constructor = 0;
tree method;
tree class = CLASS_TO_HANDLE_TYPE (TREE_TYPE (class_decl));
tree super_class = CLASSTYPE_SUPER (class);
tree saved_found_wfl = NULL_TREE, found = NULL_TREE;
tree mthrows;
@ -4859,7 +4858,7 @@ java_check_regular_methods (class_decl)
}
sig = build_java_argument_signature (TREE_TYPE (method));
found = lookup_argument_method (super_class, DECL_NAME (method), sig);
found = lookup_argument_method2 (class, DECL_NAME (method), sig);
/* Nothing overrides or it's a private method. */
if (!found)
@ -4875,12 +4874,25 @@ java_check_regular_methods (class_decl)
saved_found_wfl = DECL_NAME (found);
reset_method_name (found);
/* If `found' is declared in an interface, make sure the
modifier matches. */
if (CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
&& clinit_identifier_node != DECL_NAME (found)
&& !METHOD_PUBLIC (method))
{
tree found_decl = TYPE_NAME (DECL_CONTEXT (found));
parse_error_context (method_wfl, "Class `%s' must override `%s' with a public method in order to implement interface `%s'",
IDENTIFIER_POINTER (DECL_NAME (class_decl)),
lang_printable_name (method, 0),
IDENTIFIER_POINTER (DECL_NAME (found_decl)));
}
/* Can't override a method with the same name and different return
types. */
if (TREE_TYPE (TREE_TYPE (found)) != TREE_TYPE (TREE_TYPE (method)))
{
char *t = xstrdup (lang_printable_name (TREE_TYPE (TREE_TYPE (found)),
0));
char *t = xstrdup
(lang_printable_name (TREE_TYPE (TREE_TYPE (found)), 0));
parse_error_context
(method_wfl,
"Method `%s' was defined with return type `%s' in class `%s'",
@ -4943,12 +4955,15 @@ java_check_regular_methods (class_decl)
- Overriding/hiding protected must be protected or public
- If the overriden or hidden method has default (package)
access, then the overriding or hiding method must not be
private; otherwise, a compile-time error occurs */
if ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
|| (METHOD_PROTECTED (found)
&& !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
|| (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
&& METHOD_PRIVATE (method)))
private; otherwise, a compile-time error occurs. If
`found' belongs to an interface, things have been already
taken care of. */
if (!CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (found)))
&& ((METHOD_PUBLIC (found) && !METHOD_PUBLIC (method))
|| (METHOD_PROTECTED (found)
&& !(METHOD_PUBLIC (method) || METHOD_PROTECTED (method)))
|| (!(aflags & (ACC_PUBLIC | ACC_PRIVATE | ACC_STATIC))
&& METHOD_PRIVATE (method))))
{
parse_error_context
(method_wfl,

View File

@ -37,6 +37,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
static tree convert_ieee_real_to_integer PARAMS ((tree, tree));
static tree parse_signature_type PARAMS ((const unsigned char **,
const unsigned char *));
static tree lookup_do PARAMS ((tree, tree, tree, tree, tree (*)(tree)));
tree * type_map;
extern struct obstack permanent_obstack;
@ -713,106 +714,129 @@ set_java_signature (type, sig)
#endif
}
/* Search in class CLAS (and its superclasses) for a method
matching METHOD_NAME and argument signature METHOD_SIGNATURE.
Return a FUNCTION_DECL on success, or NULL_TREE if none found.
(Contrast lookup_java_method, which takes into account return type.) */
/* Search in class SEARCHED_CLASS (and its superclasses) for a method
matching METHOD_NAME and signature SIGNATURE. If SEARCHED_INTERFACE is
not NULL_TREE then first search its superinterfaces for a similar match.
Return the matched method DECL or NULL_TREE. SIGNATURE_BUILDER is
used on method candidates to build their (sometimes partial)
signature. */
tree
lookup_argument_method (clas, method_name, method_signature)
tree clas, method_name, method_signature;
lookup_argument_method (searched_class, method_name, method_signature)
tree searched_class, method_name, method_signature;
{
tree method;
while (clas != NULL_TREE)
{
for (method = TYPE_METHODS (clas);
method != NULL_TREE; method = TREE_CHAIN (method))
{
tree method_sig = build_java_argument_signature (TREE_TYPE (method));
tree name = DECL_NAME (method);
if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
EXPR_WFL_NODE (name) : name) == method_name
&& method_sig == method_signature)
return method;
}
clas = CLASSTYPE_SUPER (clas);
}
return NULL_TREE;
return lookup_do (searched_class, NULL_TREE, method_name, method_signature,
build_java_argument_signature);
}
/* Search in class CLAS (and its superclasses) for a method
matching METHOD_NAME and signature METHOD_SIGNATURE.
Return a FUNCTION_DECL on success, or NULL_TREE if none found.
(Contrast lookup_argument_method, which ignores return type.) */
/* Search in class SEARCHED_CLASS (and its superclasses and
implemented interfaces) for a method matching METHOD_NAME and
argument signature METHOD_SIGNATURE. Return a FUNCTION_DECL on
success, or NULL_TREE if none found. (Contrast lookup_java_method,
which takes into account return type.) */
tree
lookup_argument_method2 (searched_class, method_name, method_signature)
tree searched_class, method_name, method_signature;
{
return lookup_do (CLASSTYPE_SUPER (searched_class), searched_class,
method_name, method_signature,
build_java_argument_signature);
}
/* Search in class SEARCHED_CLASS (and its superclasses) for a method
matching METHOD_NAME and signature METHOD_SIGNATURE. Return a
FUNCTION_DECL on success, or NULL_TREE if none found. (Contrast
lookup_argument_method, which ignores return type.) If
SEARCHED_CLASS is an interface, search it too. */
tree
lookup_java_method (searched_class, method_name, method_signature)
tree searched_class, method_name, method_signature;
{
tree searched_interface;
/* If this class is an interface class, search its superinterfaces
* first. A superinterface is not an interface's superclass: a super
* interface is implemented by the interface. */
searched_interface = (CLASS_INTERFACE (TYPE_NAME (searched_class)) ?
searched_class : NULL_TREE);
return lookup_do (searched_class, searched_interface, method_name,
method_signature, build_java_signature);
}
/* Search in class SEARCHED_CLASS (an its superclasses) for a method
matching METHOD_NAME and signature SIGNATURE. Also search in
SEARCHED_INTERFACE (an its superinterfaces) for a similar match.
Return the matched method DECL or NULL_TREE. SIGNATURE_BUILDER is
used on method candidates to build their (sometimes partial)
signature. */
static tree
lookup_do (searched_class, searched_interface, method_name, signature, signature_builder)
tree searched_class, searched_interface, method_name, signature;
tree (*signature_builder) PARAMS ((tree));
{
tree method;
tree currently_searched = searched_class;
while (currently_searched != NULL_TREE)
{
for (method = TYPE_METHODS (currently_searched);
method != NULL_TREE; method = TREE_CHAIN (method))
{
tree method_sig = build_java_signature (TREE_TYPE (method));
tree name = DECL_NAME (method);
if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
EXPR_WFL_NODE (name) : name) == method_name
&& method_sig == method_signature)
return method;
}
currently_searched = CLASSTYPE_SUPER (currently_searched);
}
/* If this class is an interface class, search its superinterfaces as
* well. A superinterface is not an interface's superclass: a
* super interface is implemented by the interface.
*/
currently_searched = searched_class;
if (CLASS_INTERFACE (TYPE_NAME (currently_searched)))
if (searched_interface)
{
int i;
int interface_len =
TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (currently_searched)) - 1;
TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (searched_interface)) - 1;
for (i = interface_len; i > 0; i--)
{
tree child =
TREE_VEC_ELT (TYPE_BINFO_BASETYPES (currently_searched), i);
TREE_VEC_ELT (TYPE_BINFO_BASETYPES (searched_interface), i);
tree iclass = BINFO_TYPE (child);
/* If the superinterface hasn't been loaded yet, do so now. */
if (! CLASS_LOADED_P (iclass))
load_class (iclass, 1);
if (CLASS_FROM_SOURCE_P (iclass))
safe_layout_class (iclass);
else if (!CLASS_LOADED_P (iclass))
load_class (iclass, 1);
for (method = TYPE_METHODS (iclass);
method != NULL_TREE; method = TREE_CHAIN (method))
{
tree method_sig = build_java_signature (TREE_TYPE (method));
tree method_sig = (*signature_builder) (TREE_TYPE (method));
tree name = DECL_NAME (method);
if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
EXPR_WFL_NODE (name) : name) == method_name
&& method_sig == method_signature)
&& method_sig == signature)
return method;
}
/* it could be defined in a supersuperinterface */
if (CLASS_INTERFACE (TYPE_NAME (iclass)))
{
method = lookup_java_method (iclass,
method_name,
method_signature);
method = lookup_do (iclass, iclass, method_name,
signature, signature_builder);
if (method != NULL_TREE)
return method;
}
}
}
while (searched_class != NULL_TREE)
{
for (method = TYPE_METHODS (searched_class);
method != NULL_TREE; method = TREE_CHAIN (method))
{
tree method_sig = (*signature_builder) (TREE_TYPE (method));
tree name = DECL_NAME (method);
if ((TREE_CODE (name) == EXPR_WITH_FILE_LOCATION ?
EXPR_WFL_NODE (name) : name) == method_name
&& method_sig == signature)
return method;
}
searched_class = CLASSTYPE_SUPER (searched_class);
}
return NULL_TREE;
}