This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch: gcjh bug fix


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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]