Patch: JNI `field' fix

Tom Tromey tromey@redhat.com
Thu Mar 22 22:30:00 GMT 2001


This fixes the `field' test which is derived from a bug reported by
Marcus Daniels.

I'll check this in tomorrow unless someone has other ideas about how
field resolution should be done.

Tom

Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.674.2.26
diff -u -r1.674.2.26 ChangeLog
--- ChangeLog	2001/03/23 05:17:06	1.674.2.26
+++ ChangeLog	2001/03/23 06:27:57
@@ -1,3 +1,13 @@
+2001-03-22  Tom Tromey  <tromey@redhat.com>
+
+	* jni.cc (_Jv_JNI_GetAnyFieldID): Handle unresolved fields.
+	* java/lang/reflect/natField.cc (getType): Use _Jv_ResolveField
+	unconditionally.
+	* include/jvm.h (_Jv_ResolveField): Declare.
+	* include/java-interp.h (_Jv_ResolveField): Don't declare.
+	* resolve.cc (_Jv_ResolveField): No longer conditional on
+	INTERPRETER.
+
 2001-03-23  Bryce McKinlay  <bryce@albatross.co.nz>
 
 	Fix for PR libgcj/1736. Thanks to Robert Boehne and Alexandre Oliva
Index: jni.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni.cc,v
retrieving revision 1.36.4.1
diff -u -r1.36.4.1 jni.cc
--- jni.cc	2001/03/22 17:44:38	1.36.4.1
+++ jni.cc	2001/03/23 06:27:58
@@ -1068,8 +1068,13 @@
 
       // FIXME: what if field_class == NULL?
 
+      java::lang::ClassLoader *loader = clazz->getClassLoader ();
       while (clazz != NULL)
 	{
+	  // We acquire the class lock so that fields aren't resolved
+	  // while we are running.
+	  JvSynchronize sync (clazz);
+
 	  jint count = (is_static
 			? JvNumStaticFields (clazz)
 			: JvNumInstanceFields (clazz));
@@ -1078,12 +1083,11 @@
 			    : JvGetFirstInstanceField (clazz));
 	  for (jint i = 0; i < count; ++i)
 	    {
-	      // The field is resolved as a side effect of class
-	      // initialization.
-	      JvAssert (field->isResolved ());
-
 	      _Jv_Utf8Const *f_name = field->getNameUtf8Const(clazz);
 
+	      // The field might be resolved or it might not be.  It
+	      // is much simpler to always resolve it.
+	      _Jv_ResolveField (field, loader);
 	      if (_Jv_equalUtf8Consts (f_name, a_name)
 		  && field->getClass() == field_class)
 		return field;
Index: resolve.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/resolve.cc,v
retrieving revision 1.19
diff -u -r1.19 resolve.cc
--- resolve.cc	2000/10/06 01:49:31	1.19
+++ resolve.cc	2001/03/23 06:27:58
@@ -1,6 +1,6 @@
 // resolve.cc - Code for linking and resolving classes and pool entries.
 
-/* Copyright (C) 1999, 2000  Free Software Foundation
+/* Copyright (C) 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -32,6 +32,17 @@
 #include <java/lang/IncompatibleClassChangeError.h>
 #include <java/lang/reflect/Modifier.h>
 
+void
+_Jv_ResolveField (_Jv_Field *field, java::lang::ClassLoader *loader)
+{
+  if (! field->isResolved ())
+    {
+      _Jv_Utf8Const *sig = (_Jv_Utf8Const*)field->type;
+      field->type = _Jv_FindClassFromSignature (sig->data, loader);
+      field->flags &= ~_Jv_FIELD_UNRESOLVED_FLAG;
+    }
+}
+
 #ifdef INTERPRETER
 
 static void throw_internal_error (char *msg)
@@ -359,17 +370,6 @@
 	}
     }
   return 0;
-}
-
-void
-_Jv_ResolveField (_Jv_Field *field, java::lang::ClassLoader *loader)
-{
-  if (! field->isResolved ())
-    {
-      _Jv_Utf8Const *sig = (_Jv_Utf8Const*)field->type;
-      field->type = _Jv_FindClassFromSignature (sig->data, loader);
-      field->flags &= ~_Jv_FIELD_UNRESOLVED_FLAG;
-    }
 }
 
 /** FIXME: this is a terribly inefficient algorithm!  It would improve
Index: include/java-interp.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/java-interp.h,v
retrieving revision 1.11.4.1
diff -u -r1.11.4.1 java-interp.h
--- java-interp.h	2001/03/03 07:28:00	1.11.4.1
+++ java-interp.h	2001/03/23 06:27:58
@@ -1,6 +1,6 @@
 // java-interp.h - Header file for the bytecode interpreter.  -*- c++ -*-
 
-/* Copyright (C) 1999, 2000  Free Software Foundation
+/* Copyright (C) 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -40,7 +40,6 @@
 bool _Jv_VerifyIdentifier (_Jv_Utf8Const *);
 bool _Jv_ClassNameSamePackage (_Jv_Utf8Const *name1, _Jv_Utf8Const *name2);
 void _Jv_DefineClass (jclass, jbyteArray, jint, jint);
-void _Jv_ResolveField (_Jv_Field *, java::lang::ClassLoader*);
 
 void _Jv_InitField (jobject, jclass, int);
 void * _Jv_AllocMethodInvocation (jsize size);
Index: include/jvm.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/jvm.h,v
retrieving revision 1.31
diff -u -r1.31 jvm.h
--- jvm.h	2000/10/09 01:54:50	1.31
+++ jvm.h	2001/03/23 06:27:59
@@ -1,6 +1,6 @@
 // jvm.h - Header file for private implementation information. -*- c++ -*-
 
-/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -219,6 +219,7 @@
 extern "C" void _Jv_RegisterClass (jclass klass);
 extern "C" void _Jv_RegisterClasses (jclass *classes);
 extern void _Jv_UnregisterClass (_Jv_Utf8Const*, java::lang::ClassLoader*);
+extern void _Jv_ResolveField (_Jv_Field *, java::lang::ClassLoader*);
 
 extern jclass _Jv_FindClass (_Jv_Utf8Const *name,
 			     java::lang::ClassLoader *loader);
Index: java/lang/reflect/natField.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/reflect/natField.cc,v
retrieving revision 1.6
diff -u -r1.6 natField.cc
--- natField.cc	2000/10/06 01:49:31	1.6
+++ natField.cc	2001/03/23 06:27:59
@@ -1,6 +1,6 @@
 // natField.cc - Implementation of java.lang.reflect.Field native methods.
 
-/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -44,17 +44,8 @@
 java::lang::reflect::Field::getType ()
 {
   jfieldID fld = _Jv_FromReflectedField (this);
-  if (! fld->isResolved())
-    {
-      JvSynchronize sync (declaringClass);
-      if (! fld->isResolved())
-	{
-	  fld->type
-	    = _Jv_FindClassFromSignature(((Utf8Const*) (fld->type))->data,
-					 declaringClass->getClassLoader());
-	  fld->flags &= ~_Jv_FIELD_UNRESOLVED_FLAG;
-	}
-    }
+  JvSynchronize sync (declaringClass);
+  _Jv_ResolveField (fld, declaringClass->getClassLoader ());
   return fld->type;
 }
 



More information about the Java-patches mailing list