This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch: gcjh bug fix
- To: Gcc Patch List <gcc-patches at gcc dot gnu dot org>
- Subject: Patch: gcjh bug fix
- From: Tom Tromey <tromey at cygnus dot com>
- Date: 23 Feb 2000 13:43:43 -0700
- Reply-To: tromey at cygnus dot com
I'm checking in the appended patch. It fixes gcjh to correctly quote
function names in JNI mode. It also eliminates another lingering bug
related to JNI mode: for JNI we don't care if a method has the same
name as a C++ keyword.
2000-02-23 Tom Tromey <tromey@cygnus.com>
* gjavah.c (print_name): In JNI case, correctly quote string.
(print_method_info): Don't handle overrides in JNI mode.
Tom
Index: gjavah.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/java/gjavah.c,v
retrieving revision 1.47
diff -u -r1.47 gjavah.c
--- gjavah.c 2000/02/18 12:26:50 1.47
+++ gjavah.c 2000/02/23 20:38:12
@@ -235,17 +235,6 @@
return (u.l & D_NAN_MASK) != D_NAN_MASK;
}
-static void
-DEFUN(print_name, (stream, jcf, name_index),
- FILE* stream AND JCF* jcf AND int name_index)
-{
- if (JPOOL_TAG (jcf, name_index) != CONSTANT_Utf8)
- fprintf (stream, "<not a UTF8 constant>");
- else
- jcf_print_utf8 (stream, JPOOL_UTF_DATA (jcf, name_index),
- JPOOL_UTF_LENGTH (jcf, name_index));
-}
-
/* Print a character, appropriately mangled for JNI. */
static void
@@ -278,6 +267,40 @@
}
}
+/* Print a name from the class data. If the index does not point to a
+ string, an error results. */
+
+static void
+DEFUN(print_name, (stream, jcf, name_index),
+ FILE* stream AND JCF* jcf AND int name_index)
+{
+ if (JPOOL_TAG (jcf, name_index) != CONSTANT_Utf8)
+ {
+ fprintf (stream, "<not a UTF8 constant>");
+ found_error = 1;
+ }
+ else if (! flag_jni)
+ jcf_print_utf8 (stream, JPOOL_UTF_DATA (jcf, name_index),
+ JPOOL_UTF_LENGTH (jcf, name_index));
+ else
+ {
+ /* For JNI we must correctly quote each character. */
+ const unsigned char *str = JPOOL_UTF_DATA (jcf, name_index);
+ int length = JPOOL_UTF_LENGTH (jcf, name_index);
+ const unsigned char *limit = str + length;
+ while (str < limit)
+ {
+ int ch = UTF8_GET (str, limit);
+ if (ch < 0)
+ {
+ fprintf (stream, "\\<invalid>");
+ return;
+ }
+ jni_print_char (stream, ch);
+ }
+ }
+}
+
/* Print base name of class. The base name is everything after the
final separator. */
@@ -648,20 +671,24 @@
if (! stream)
return;
- /* We can't generate a method whose name is a C++ reserved word. We
- can't just ignore the function, because that will cause incorrect
- code to be generated if the function is virtual (not only for
- calls to this function for for other functions after it in the
- vtbl). So we give it a dummy name instead. */
- override = cxx_keyword_subst (str, length);
- if (override)
+ /* We don't worry about overrides in JNI mode. */
+ if (! flag_jni)
{
- /* If the method is static or final, we can safely skip it. If
- we don't skip it then we'll have problems since the mangling
- will be wrong. FIXME. */
- if (METHOD_IS_FINAL (jcf->access_flags, flags)
- || (flags & ACC_STATIC))
- return;
+ /* We can't generate a method whose name is a C++ reserved word.
+ We can't just ignore the function, because that will cause
+ incorrect code to be generated if the function is virtual
+ (not only for calls to this function for for other functions
+ after it in the vtbl). So we give it a dummy name instead. */
+ override = cxx_keyword_subst (str, length);
+ if (override)
+ {
+ /* If the method is static or final, we can safely skip it.
+ If we don't skip it then we'll have problems since the
+ mangling will be wrong. FIXME. */
+ if (METHOD_IS_FINAL (jcf->access_flags, flags)
+ || (flags & ACC_STATIC))
+ return;
+ }
}
if (! stubs && ! flag_jni)