aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/gjavah.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@cygnus.com>2000-02-23 20:46:18 +0000
committerTom Tromey <tromey@gcc.gnu.org>2000-02-23 20:46:18 +0000
commitc45c5e092dd08db116ed749332f3b19e96830d22 (patch)
treeb37b5a1811d526e606a007b8b528cbd543f01b3c /gcc/java/gjavah.c
parent9fc336c7e6d480aa219344688a607da4a01eea0a (diff)
downloadgcc-c45c5e092dd08db116ed749332f3b19e96830d22.zip
gcc-c45c5e092dd08db116ed749332f3b19e96830d22.tar.gz
gcc-c45c5e092dd08db116ed749332f3b19e96830d22.tar.bz2
gjavah.c (print_name): In JNI case, correctly quote string.
* gjavah.c (print_name): In JNI case, correctly quote string. (print_method_info): Don't handle overrides in JNI mode. From-SVN: r32124
Diffstat (limited to 'gcc/java/gjavah.c')
-rw-r--r--gcc/java/gjavah.c75
1 files changed, 51 insertions, 24 deletions
diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c
index 10240f0..086ee5a 100644
--- a/gcc/java/gjavah.c
+++ b/gcc/java/gjavah.c
@@ -235,17 +235,6 @@ java_double_finite (d)
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 @@ jni_print_char (stream, ch)
}
}
+/* 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 @@ DEFUN(print_method_info, (stream, jcf, name_index, sig_index, flags),
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)