aboutsummaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorTom Tromey <tromey@cygnus.com>1999-02-26 12:49:52 +0000
committerTom Tromey <tromey@gcc.gnu.org>1999-02-26 12:49:52 +0000
commit686fb236788dd10e553cc60c807067a24542232a (patch)
tree8599c5659cc73a42a87a116ae166ce117808fa9d /gcc/java
parent5f56af5a8d207f088d752e59d855e27a8f39b579 (diff)
downloadgcc-686fb236788dd10e553cc60c807067a24542232a.zip
gcc-686fb236788dd10e553cc60c807067a24542232a.tar.gz
gcc-686fb236788dd10e553cc60c807067a24542232a.tar.bz2
gjavah.c (add_class_decl): Only generate `#include' if outer class is not the name of the class we are...
* gjavah.c (add_class_decl): Only generate `#include' if outer class is not the name of the class we are processing. Correctly append `.h' in #include. (process_file): Clean up newlines around generated `#include's. (decode_signature_piece): Correctly handle inner classes. (struct include): New structure. (all_includes): New global. (print_include): New function. (add_class_decl): Use it. (process_file): Likewise. (add_class_decl): Generate include for java-array.h if array seen. (process_file): Don't generate java-array.h include. From-SVN: r25460
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog14
-rw-r--r--gcc/java/gjavah.c98
2 files changed, 92 insertions, 20 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 432ba03..f066ccf 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,5 +1,19 @@
1999-02-26 Tom Tromey <tromey@cygnus.com>
+ * gjavah.c (add_class_decl): Only generate `#include' if outer
+ class is not the name of the class we are processing. Correctly
+ append `.h' in #include.
+ (process_file): Clean up newlines around generated `#include's.
+ (decode_signature_piece): Correctly handle inner classes.
+ (struct include): New structure.
+ (all_includes): New global.
+ (print_include): New function.
+ (add_class_decl): Use it.
+ (process_file): Likewise.
+ (add_class_decl): Generate include for java-array.h if array
+ seen.
+ (process_file): Don't generate java-array.h include.
+
* gjavah.c (add_namelet): Check for standard package names here.
(add_class_decl): Don't check for standard package names here.
diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c
index 0733373..5ec6a88 100644
--- a/gcc/java/gjavah.c
+++ b/gcc/java/gjavah.c
@@ -650,7 +650,8 @@ decode_signature_piece (stream, signature, limit, need_space)
while (*signature && *signature != ';')
{
int ch = UTF8_GET (signature, limit);
- if (ch == '/')
+ /* `$' is the separator for an inner class. */
+ if (ch == '/' || ch == '$')
fputs ("::", stream);
else
jcf_print_char (stream, ch);
@@ -832,6 +833,52 @@ super_class_name (derived_jcf, len)
+/* We keep track of all the `#include's we generate, so we can avoid
+ duplicates. */
+struct include
+{
+ char *name;
+ struct include *next;
+};
+
+/* List of all includes. */
+static struct include *all_includes = NULL;
+
+/* Generate a #include. */
+static void
+print_include (out, utf8, len)
+ FILE *out;
+ unsigned char *utf8;
+ int len;
+{
+ struct include *incl;
+
+ if (! out)
+ return;
+
+ if (len == -1)
+ len = strlen (utf8);
+
+ for (incl = all_includes; incl; incl = incl->next)
+ {
+ if (! strncmp (incl->name, utf8, len))
+ return;
+ }
+
+ incl = (struct include *) malloc (sizeof (struct include));
+ incl->name = malloc (len + 1);
+ strncpy (incl->name, utf8, len);
+ incl->name[len] = '\0';
+ incl->next = all_includes;
+ all_includes = incl;
+
+ fputs ("#include <", out);
+ jcf_print_utf8 (out, utf8, len);
+ fputs (".h>\n", out);
+}
+
+
+
/* This is used to represent part of a package or class name. */
struct namelet
{
@@ -975,27 +1022,47 @@ add_class_decl (out, jcf, signature)
unsigned char *s = JPOOL_UTF_DATA (jcf, signature);
int len = JPOOL_UTF_LENGTH (jcf, signature);
int i;
+ /* Name of class we are processing. */
+ int name_index = JPOOL_USHORT1 (jcf, jcf->this_class);
+ int tlen = JPOOL_UTF_LENGTH (jcf, name_index);
+ char *tname = JPOOL_UTF_DATA (jcf, name_index);
for (i = 0; i < len; ++i)
{
- int start;
+ int start, saw_dollar;
+
+ /* If we see an array, then we include the array header. */
+ if (s[i] == '[')
+ {
+ print_include (out, "java-array", -1);
+ continue;
+ }
+
/* We're looking for `L<stuff>;' -- everything else is
ignorable. */
if (s[i] != 'L')
continue;
+
+ saw_dollar = 0;
for (start = ++i; i < len && s[i] != ';'; ++i)
{
- if (s[i] == '$' && out)
+ if (! saw_dollar && s[i] == '$' && out)
{
+ saw_dollar = 1;
/* If this class represents an inner class, then
- generate a `#include' for the outer class. */
- fputs ("#include <", out);
- jcf_print_utf8 (out, &s[start], i - start);
- fputs (">\n", out);
+ generate a `#include' for the outer class. However,
+ don't generate the include if the outer class is the
+ class we are processing. */
+ if (i - start < tlen || strncmp (&s[start], tname, i - start))
+ print_include (out, &s[start], i - start);
+ break;
}
}
- add_namelet (&s[start], &s[i], &root);
+ /* If we saw an inner class, then the generated #include will
+ declare the class. So in this case we needn't bother. */
+ if (! saw_dollar)
+ add_namelet (&s[start], &s[i], &root);
}
}
@@ -1082,7 +1149,7 @@ DEFUN(process_file, (jcf, out),
/* We do this to ensure that inline methods won't be `outlined'
by g++. This works as long as method and fields are not
added by the user. */
- fprintf (out, "#pragma interface\n\n");
+ fprintf (out, "#pragma interface\n");
}
if (jcf->super_class && out)
@@ -1090,18 +1157,8 @@ DEFUN(process_file, (jcf, out),
int super_length;
unsigned char *supername = super_class_name (jcf, &super_length);
- fputs ("#include <", out);
- jcf_print_utf8 (out, supername, super_length);
- fputs (".h>\n", out);
-
- /* FIXME: If our superclass is Object, then we include
- java-array.h. The right thing to do here is look at all the
- methods and fields and see if an array is in use. Only then
- would we need to include java-array.h. */
- if (! utf8_cmp (supername, super_length, "java/lang/Object"))
- fputs ("#include <java-array.h>\n", out);
-
fputs ("\n", out);
+ print_include (out, supername, super_length);
}
/* We want to parse the methods first. But we need to find where
@@ -1119,6 +1176,7 @@ DEFUN(process_file, (jcf, out),
if (out)
{
+ fputs ("\n", out);
print_class_decls (out, jcf, jcf->this_class);
for (i = 0; i < prepend_count; ++i)