Patch: JNI -vs- signatures

Tom Tromey tromey@redhat.com
Fri Jan 26 14:57:00 GMT 2001


JNI defines type signatures to use `/' as name separators in class
names.  However, jni.cc was assuming `.' was used.

This patch fixes the problem.

I'm checking this in because (1) the risk is very low, and (2) without
this patch JNI is substantially less useful.

2001-01-26  Tom Tromey  <tromey@redhat.com>

	* jni.cc (_Jv_JNI_GetAnyMethodID): Rewrite signature from external
	to internal representation.
	(_Jv_JNI_GetAnyFieldID): Likewise.  Also, only use
	_Jv_FindClassFromSignature.

Tom

Index: jni.cc
===================================================================
RCS file: /cvs/gcc/egcs/libjava/jni.cc,v
retrieving revision 1.34
diff -u -r1.34 jni.cc
--- jni.cc	2000/11/01 00:18:03	1.34
+++ jni.cc	2001/01/26 22:42:31
@@ -1,6 +1,6 @@
 // jni.cc - JNI implementation, including the jump table.
 
-/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -593,8 +593,14 @@
       _Jv_InitClass (clazz);
 
       _Jv_Utf8Const *name_u = _Jv_makeUtf8Const ((char *) name, -1);
-      _Jv_Utf8Const *sig_u = _Jv_makeUtf8Const ((char *) sig, -1);
 
+      // FIXME: assume that SIG isn't too long.
+      int len = strlen (sig);
+      char s[len + 1];
+      for (int i = 0; i <= len; ++i)
+	s[i] = (sig[i] == '/') ? '.' : sig[i];
+      _Jv_Utf8Const *sig_u = _Jv_makeUtf8Const ((char *) s, -1);
+
       JvAssert (! clazz->isPrimitive());
 
       using namespace java::lang::reflect;
@@ -1053,14 +1059,12 @@
 
       _Jv_Utf8Const *a_name = _Jv_makeUtf8Const ((char *) name, -1);
 
-      jclass field_class = NULL;
-      if (sig[0] == '[')
-	field_class = _Jv_FindClassFromSignature ((char *) sig, NULL);
-      else
-	{
-	  _Jv_Utf8Const *sig_u = _Jv_makeUtf8Const ((char *) sig, -1);
-	  field_class = _Jv_FindClass (sig_u, NULL);
-	}
+      // FIXME: assume that SIG isn't too long.
+      int len = strlen (sig);
+      char s[len + 1];
+      for (int i = 0; i <= len; ++i)
+	s[i] = (sig[i] == '/') ? '.' : sig[i];
+      jclass field_class = _Jv_FindClassFromSignature ((char *) s, NULL);
 
       // FIXME: what if field_class == NULL?
 


More information about the Java-patches mailing list