aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2001-03-23 19:15:44 +0000
committerTom Tromey <tromey@gcc.gnu.org>2001-03-23 19:15:44 +0000
commit83c64db681317c28239f07c5a8e6bb201834f0ba (patch)
tree28774e5e29803dc3ce69073c0dcf0c60c43a6982 /libjava
parente9f4fa71431e33e47b1eab017ee03f937e27b058 (diff)
downloadgcc-83c64db681317c28239f07c5a8e6bb201834f0ba.zip
gcc-83c64db681317c28239f07c5a8e6bb201834f0ba.tar.gz
gcc-83c64db681317c28239f07c5a8e6bb201834f0ba.tar.bz2
jni.cc (_Jv_JNI_GetAnyFieldID): Handle unresolved fields.
* 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. From-SVN: r40785
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog10
-rw-r--r--libjava/include/java-interp.h3
-rw-r--r--libjava/include/jvm.h3
-rw-r--r--libjava/java/lang/natClass.cc6
-rw-r--r--libjava/java/lang/reflect/natField.cc15
-rw-r--r--libjava/jni.cc12
-rw-r--r--libjava/resolve.cc24
7 files changed, 40 insertions, 33 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 0847094..a58e14b 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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
diff --git a/libjava/include/java-interp.h b/libjava/include/java-interp.h
index acc2eb9..ebf958b 100644
--- a/libjava/include/java-interp.h
+++ b/libjava/include/java-interp.h
@@ -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);
diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h
index 006f1d9..50af756 100644
--- a/libjava/include/jvm.h
+++ b/libjava/include/jvm.h
@@ -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);
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc
index 11f5e50..b934ae7 100644
--- a/libjava/java/lang/natClass.cc
+++ b/libjava/java/lang/natClass.cc
@@ -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;
diff --git a/libjava/java/lang/reflect/natField.cc b/libjava/java/lang/reflect/natField.cc
index 57421d6..0aedc4e 100644
--- a/libjava/java/lang/reflect/natField.cc
+++ b/libjava/java/lang/reflect/natField.cc
@@ -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;
}
diff --git a/libjava/jni.cc b/libjava/jni.cc
index a4a12a8..7b682f1 100644
--- a/libjava/jni.cc
+++ b/libjava/jni.cc
@@ -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;
diff --git a/libjava/resolve.cc b/libjava/resolve.cc
index 4a37365..b0a0565 100644
--- a/libjava/resolve.cc
+++ b/libjava/resolve.cc
@@ -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.