Commit 4f647d52 by Alexandre Petit-Bianco Committed by Alexandre Petit-Bianco

Fix for PR java/5758, java/5632:

2002-02-28  Alexandre Petit-Bianco  <apbianco@redhat.com>

	Fix for PR java/5758, java/5632:
	* jcf-parse.c (load_class): Renamed local variable, consider `.' an
	inner-class separator too.
	* parse.y (do_resolve_class): New local `decl_result.'
	Progressively build a name for what can have been loaded.

From-SVN: r50228
parent 86855e8c
......@@ -2,6 +2,14 @@
* expr.c (build_java_arraystore_check): Fix formatting.
2002-02-28 Alexandre Petit-Bianco <apbianco@redhat.com>
Fix for PR java/5758, java/5632:
* jcf-parse.c (load_class): Renamed local variable, consider `.' an
inner-class separator too.
* parse.y (do_resolve_class): New local `decl_result.'
Progressively build a name for what can have been loaded.
2002-02-28 Bryce McKinlay <bryce@waitaki.otago.ac.nz>
* expr.c (java_array_data_offset): Removed function.
......
......@@ -669,20 +669,20 @@ load_class (class_or_name, verbose)
saved = name;
while (1)
{
char *dollar;
char *separator;
if ((class_loaded = read_class (name)))
break;
/* We failed loading name. Now consider that we might be looking
for a inner class but it's only available in source for in
its enclosing context. */
if ((dollar = strrchr (IDENTIFIER_POINTER (name), '$')))
for a inner class. */
if ((separator = strrchr (IDENTIFIER_POINTER (name), '$'))
|| (separator = strrchr (IDENTIFIER_POINTER (name), '.')))
{
int c = *dollar;
*dollar = '\0';
int c = *separator;
*separator = '\0';
name = get_identifier (IDENTIFIER_POINTER (name));
*dollar = c;
*separator = c;
}
/* Otherwise, we failed, we bail. */
else
......
......@@ -5745,6 +5745,7 @@ do_resolve_class (enclosing, class_type, decl, cl)
{
tree new_class_decl = NULL_TREE, super = NULL_TREE;
tree saved_enclosing_type = enclosing ? TREE_TYPE (enclosing) : NULL_TREE;
tree decl_result;
struct hash_table _ht, *circularity_hash = &_ht;
/* This hash table is used to register the classes we're going
......@@ -5841,9 +5842,32 @@ do_resolve_class (enclosing, class_type, decl, cl)
if (check_pkg_class_access (TYPE_NAME (class_type), cl, true))
return NULL_TREE;
}
/* 6- Last call for a resolution */
return IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
decl_result = IDENTIFIER_CLASS_VALUE (TYPE_NAME (class_type));
/* The final lookup might have registered a.b.c into a.b$c If we
failed at the first lookup, progressively change the name if
applicable and use the matching DECL instead. */
if (!decl_result && QUALIFIED_P (TYPE_NAME (class_type)))
{
tree name = TYPE_NAME (class_type);
char *separator;
do {
/* Reach the last '.', and if applicable, replace it by a `$' and
see if this exists as a type. */
if ((separator = strrchr (IDENTIFIER_POINTER (name), '.')))
{
int c = *separator;
*separator = '$';
name = get_identifier (IDENTIFIER_POINTER (name));
*separator = c;
decl_result = IDENTIFIER_CLASS_VALUE (name);
}
} while (!decl_result && separator);
}
return decl_result;
}
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