aboutsummaryrefslogtreecommitdiff
path: root/libjava/java
diff options
context:
space:
mode:
authorJeff Sturm <jsturm@one-point.com>2003-01-30 23:20:45 +0000
committerJeff Sturm <jsturm@gcc.gnu.org>2003-01-30 23:20:45 +0000
commitae724017fd554d9c49f9ed3bd515dd236e552eef (patch)
tree68e1ce35ce8786bd229d9f2d6e91343074b4bcb2 /libjava/java
parentccf9f10cc3b4e371c34a01b3210b9e3bed0a8868 (diff)
downloadgcc-ae724017fd554d9c49f9ed3bd515dd236e552eef.zip
gcc-ae724017fd554d9c49f9ed3bd515dd236e552eef.tar.gz
gcc-ae724017fd554d9c49f9ed3bd515dd236e552eef.tar.bz2
natClass.cc (initializeClass): Check tables when (state == JV_STATE_IN_PROGRESS).
* java/lang/natClass.cc (initializeClass): Check tables when (state == JV_STATE_IN_PROGRESS). (_Jv_GetInterfaces): Use _Jv_WaitForState to link interface. * java/lang/natClassLoader.cc (_Jv_WaitForState): Handle interpreted classes. (linkClass0): Use _Jv_WaitForState. From-SVN: r62161
Diffstat (limited to 'libjava/java')
-rw-r--r--libjava/java/lang/natClass.cc18
-rw-r--r--libjava/java/lang/natClassLoader.cc14
2 files changed, 22 insertions, 10 deletions
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc
index 0960649..7fea278 100644
--- a/libjava/java/lang/natClass.cc
+++ b/libjava/java/lang/natClass.cc
@@ -766,11 +766,23 @@ java::lang::Class::initializeClass (void)
wait ();
// Steps 3 & 4.
- if (state == JV_STATE_DONE || state == JV_STATE_IN_PROGRESS)
+ if (state == JV_STATE_DONE)
{
_Jv_MonitorExit (this);
return;
}
+ if (state == JV_STATE_IN_PROGRESS)
+ {
+ _Jv_MonitorExit (this);
+
+ /* Initialization in progress. The class is linked now,
+ so ensure internal tables are built. */
+ _Jv_PrepareConstantTimeTables (this);
+ _Jv_MakeVTable(this);
+ _Jv_LinkOffsetTable(this);
+
+ return;
+ }
// Step 5.
if (state == JV_STATE_ERROR)
@@ -1213,6 +1225,10 @@ _Jv_GetInterfaces (jclass klass, _Jv_ifaces *ifaces)
for (int i=0; i < klass->interface_count; i++)
{
jclass iface = klass->interfaces[i];
+
+ /* Make sure interface is linked. */
+ _Jv_WaitForState(iface, JV_STATE_LINKED);
+
if (_Jv_IndexOf (iface, (void **) ifaces->list, ifaces->count) == -1)
{
if (ifaces->count + 1 >= ifaces->len)
diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc
index 176f16a..7ca537c 100644
--- a/libjava/java/lang/natClassLoader.cc
+++ b/libjava/java/lang/natClassLoader.cc
@@ -117,6 +117,10 @@ _Jv_WaitForState (jclass klass, int state)
{
// Must call _Jv_PrepareCompiledClass while holding the class
// mutex.
+#ifdef INTERPRETER
+ if (_Jv_IsInterpretedClass (klass))
+ _Jv_PrepareClass (klass);
+#endif
_Jv_PrepareCompiledClass (klass);
_Jv_MonitorExit (klass);
return;
@@ -141,15 +145,7 @@ _Jv_WaitForState (jclass klass, int state)
void
java::lang::ClassLoader::linkClass0 (java::lang::Class *klass)
{
- if (klass->state >= JV_STATE_LINKED)
- return;
-
-#ifdef INTERPRETER
- if (_Jv_IsInterpretedClass (klass))
- _Jv_PrepareClass (klass);
-#endif
-
- _Jv_PrepareCompiledClass (klass);
+ _Jv_WaitForState (klass, JV_STATE_LINKED);
}
void