diff options
author | Andrew Haley <aph@redhat.com> | 2004-10-05 14:55:39 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2004-10-05 14:55:39 +0000 |
commit | 5789147ff0eacd8165a6835b51488502e27ebc93 (patch) | |
tree | dfa978c9ca6c0d813a9768ce5dc831b1f27bf7c7 /gcc | |
parent | 9bb86f4147d6827f4fb1c70a4fda7c118e527471 (diff) | |
download | gcc-5789147ff0eacd8165a6835b51488502e27ebc93.zip gcc-5789147ff0eacd8165a6835b51488502e27ebc93.tar.gz gcc-5789147ff0eacd8165a6835b51488502e27ebc93.tar.bz2 |
[multiple changes]
2004-10-05 Andrew Haley <aph@redhat.com>
PR java/17779
* jcf-parse.c (parse_zip_file_entries): If a class has a
superclass and a TYPE_SIZE of zero, lay it out.
2004-09-30 Andrew Haley <aph@redhat.com>
PR java/17733
* jcf-parse.c (compute_class_name): Rewrite.
From-SVN: r88556
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/java/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/java/jcf-parse.c | 34 |
2 files changed, 39 insertions, 6 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 265f593..5426a7f 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,14 @@ +2004-10-05 Andrew Haley <aph@redhat.com> + + PR java/17779 + * jcf-parse.c (parse_zip_file_entries): If a class has a + superclass and a TYPE_SIZE of zero, lay it out. + +2004-09-30 Andrew Haley <aph@redhat.com> + + PR java/17733 + * jcf-parse.c (compute_class_name): Rewrite. + 2004-10-01 Jan Hubicka <jh@suse.cz> * java.c (java_expand_body): Update call of tree_rest_of_compilation. diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c index 74f45de..32b9d5c 100644 --- a/gcc/java/jcf-parse.c +++ b/gcc/java/jcf-parse.c @@ -1229,13 +1229,22 @@ compute_class_name (struct ZipDirectory *zdir) { char *class_name_in_zip_dir = ZIPDIR_FILENAME (zdir); char *class_name; - int j; + int i; + int filename_length; + + while (strncmp (class_name_in_zip_dir, "./", 2) == 0) + class_name_in_zip_dir += 2; + + filename_length = (strlen (class_name_in_zip_dir) + - strlen (".class")); + class_name = ALLOC (filename_length + 1); + memcpy (class_name, class_name_in_zip_dir, filename_length); + class_name [filename_length] = '\0'; + + for (i = 0; i < filename_length; i++) + if (class_name[i] == '/') + class_name[i] = '.'; - class_name = ALLOC (zdir->filename_length + 1 - 6); - strncpy (class_name, class_name_in_zip_dir, zdir->filename_length - 6); - class_name [zdir->filename_length - 6] = '\0'; - for (j = 0; class_name[j]; ++j) - class_name[j] = class_name[j] == '/' ? '.' : class_name[j]; return class_name; } @@ -1289,6 +1298,19 @@ parse_zip_file_entries (void) current_jcf = TYPE_JCF (class); output_class = current_class = class; + /* This is for a corner case where we have a superclass + but no superclass fields. + + This can happen if we earlier failed to lay out this + class because its superclass was still in the process + of being laid out; this occurs when we have recursive + class dependencies via inner classes. Setting + TYPE_SIZE to null here causes CLASS_LOADED_P to return + false, so layout_class() will be called again. */ + if (TYPE_SIZE (class) && CLASSTYPE_SUPER (class) + && integer_zerop (TYPE_SIZE (class))) + TYPE_SIZE (class) = NULL_TREE; + if (! CLASS_LOADED_P (class)) { if (! CLASS_PARSED_P (class)) |