diff options
author | jsturm <jsturm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-30 23:20:45 +0000 |
---|---|---|
committer | jsturm <jsturm@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-01-30 23:20:45 +0000 |
commit | 2c8f9104ed7a40de2edc83e4a79fe29f0d9884b4 (patch) | |
tree | 68e1ce35ce8786bd229d9f2d6e91343074b4bcb2 /libjava/java | |
parent | f08ad1514ac6a53b68f17fc07fbdb46580cd09f5 (diff) | |
download | ppe42-gcc-2c8f9104ed7a40de2edc83e4a79fe29f0d9884b4.tar.gz ppe42-gcc-2c8f9104ed7a40de2edc83e4a79fe29f0d9884b4.zip |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@62161 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java')
-rw-r--r-- | libjava/java/lang/natClass.cc | 18 | ||||
-rw-r--r-- | libjava/java/lang/natClassLoader.cc | 14 |
2 files changed, 22 insertions, 10 deletions
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index 0960649e71c..7fea278dbe5 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 176f16a7343..7ca537c365f 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 |