OSDN Git Service

* jni.cc (_Jv_JNI_GetAnyFieldID): Handle unresolved fields.
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Mar 2001 19:15:44 +0000 (19:15 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Mar 2001 19:15:44 +0000 (19:15 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40785 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/include/java-interp.h
libjava/include/jvm.h
libjava/java/lang/natClass.cc
libjava/java/lang/reflect/natField.cc
libjava/jni.cc
libjava/resolve.cc

index 0847094..a58e14b 100644 (file)
@@ -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 acc2eb9..ebf958b 100644 (file)
@@ -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_VerifyClassName (_Jv_Utf8Const *name);
 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 006f1d9..50af756 100644 (file)
@@ -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_CheckArrayStore (jobject array, jobject obj);
 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 11f5e50..b934ae7 100644 (file)
@@ -678,7 +678,7 @@ java::lang::Class::finalize (void)
 void
 java::lang::Class::initializeClass (void)
 {
-  // jshort-circuit to avoid needless locking.
+  // short-circuit to avoid needless locking.
   if (state == JV_STATE_DONE)
     return;
 
@@ -713,7 +713,9 @@ java::lang::Class::initializeClass (void)
     wait ();
 
   // Steps 3 &  4.
-  if (state == JV_STATE_DONE || state == JV_STATE_IN_PROGRESS || thread == self)
+  if (state == JV_STATE_DONE
+      || state == JV_STATE_IN_PROGRESS
+      || thread == self)
     {
       _Jv_MonitorExit (this);
       return;
index 57421d6..0aedc4e 100644 (file)
@@ -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 @@ jclass
 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;
 }
 
index a4a12a8..7b682f1 100644 (file)
@@ -1068,8 +1068,13 @@ _Jv_JNI_GetAnyFieldID (JNIEnv *env, jclass clazz,
 
       // 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 @@ _Jv_JNI_GetAnyFieldID (JNIEnv *env, jclass clazz,
                            : 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 4a37365..b0a0565 100644 (file)
@@ -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 @@ details.  */
 #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)
@@ -361,17 +372,6 @@ _Jv_SearchMethodInClass (jclass cls, jclass klass,
   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
     things if compiled classes to know vtable offset, and _Jv_Method had
     a field for this.