Commit 9ea6c4a4 by Keith Seitz Committed by Keith Seitz

link.cc (_Jv_Linker::wait_for_state): Add JVMTI CLASS_PREPARE notification.

        * link.cc (_Jv_Linker::wait_for_state): Add JVMTI
        CLASS_PREPARE notification.

From-SVN: r121157
parent ee411336
2007-01-24 Keith Seitz <keiths@redhat.com> 2007-01-24 Keith Seitz <keiths@redhat.com>
* link.cc (_Jv_Linker::wait_for_state): Add JVMTI
CLASS_PREPARE notification.
2007-01-24 Keith Seitz <keiths@redhat.com>
* interpret.cc: Include gnu/gcj/jvmti/Breakpoint.h, * interpret.cc: Include gnu/gcj/jvmti/Breakpoint.h,
gnu/gcj/jvmti/BreakpointManager.h, jvmti.h, and jvmti-int.h gnu/gcj/jvmti/BreakpointManager.h, jvmti.h, and jvmti-int.h
* interpret-run.cc: Implement insn_breakpoint. * interpret-run.cc: Implement insn_breakpoint.
......
...@@ -33,6 +33,8 @@ details. */ ...@@ -33,6 +33,8 @@ details. */
#include <limits.h> #include <limits.h>
#include <java-cpool.h> #include <java-cpool.h>
#include <execution.h> #include <execution.h>
#include <jvmti.h>
#include "jvmti-int.h"
#include <java/lang/Class.h> #include <java/lang/Class.h>
#include <java/lang/String.h> #include <java/lang/String.h>
#include <java/lang/StringBuffer.h> #include <java/lang/StringBuffer.h>
...@@ -1941,33 +1943,35 @@ _Jv_Linker::wait_for_state (jclass klass, int state) ...@@ -1941,33 +1943,35 @@ _Jv_Linker::wait_for_state (jclass klass, int state)
if (klass->state >= state) if (klass->state >= state)
return; return;
JvSynchronize sync (klass);
// This is similar to the strategy for class initialization. If we
// already hold the lock, just leave.
java::lang::Thread *self = java::lang::Thread::currentThread(); java::lang::Thread *self = java::lang::Thread::currentThread();
while (klass->state <= state
&& klass->thread
&& klass->thread != self)
klass->wait ();
java::lang::Thread *save = klass->thread; {
klass->thread = self; JvSynchronize sync (klass);
// Allocate memory for static fields and constants. // This is similar to the strategy for class initialization. If we
if (GC_base (klass) && klass->fields && ! GC_base (klass->fields)) // already hold the lock, just leave.
{ while (klass->state <= state
jsize count = klass->field_count; && klass->thread
if (count) && klass->thread != self)
{ klass->wait ();
_Jv_Field* fields
= (_Jv_Field*) _Jv_AllocRawObj (count * sizeof (_Jv_Field)); java::lang::Thread *save = klass->thread;
memcpy ((void*)fields, klass->thread = self;
(void*)klass->fields,
count * sizeof (_Jv_Field)); // Allocate memory for static fields and constants.
klass->fields = fields; if (GC_base (klass) && klass->fields && ! GC_base (klass->fields))
} {
} jsize count = klass->field_count;
if (count)
{
_Jv_Field* fields
= (_Jv_Field*) _Jv_AllocRawObj (count * sizeof (_Jv_Field));
memcpy ((void*)fields,
(void*)klass->fields,
count * sizeof (_Jv_Field));
klass->fields = fields;
}
}
// Print some debugging info if requested. Interpreted classes are // Print some debugging info if requested. Interpreted classes are
// handled in defineclass, so we only need to handle the two // handled in defineclass, so we only need to handle the two
...@@ -1981,49 +1985,59 @@ _Jv_Linker::wait_for_state (jclass klass, int state) ...@@ -1981,49 +1985,59 @@ _Jv_Linker::wait_for_state (jclass klass, int state)
++gcj::loadedClasses; ++gcj::loadedClasses;
} }
try try
{ {
if (state >= JV_STATE_LOADING && klass->state < JV_STATE_LOADING) if (state >= JV_STATE_LOADING && klass->state < JV_STATE_LOADING)
{ {
ensure_supers_installed (klass); ensure_supers_installed (klass);
klass->set_state(JV_STATE_LOADING); klass->set_state(JV_STATE_LOADING);
} }
if (state >= JV_STATE_LOADED && klass->state < JV_STATE_LOADED) if (state >= JV_STATE_LOADED && klass->state < JV_STATE_LOADED)
{ {
ensure_method_table_complete (klass); ensure_method_table_complete (klass);
klass->set_state(JV_STATE_LOADED); klass->set_state(JV_STATE_LOADED);
} }
if (state >= JV_STATE_PREPARED && klass->state < JV_STATE_PREPARED) if (state >= JV_STATE_PREPARED && klass->state < JV_STATE_PREPARED)
{ {
ensure_fields_laid_out (klass); ensure_fields_laid_out (klass);
make_vtable (klass); make_vtable (klass);
layout_interface_methods (klass); layout_interface_methods (klass);
prepare_constant_time_tables (klass); prepare_constant_time_tables (klass);
klass->set_state(JV_STATE_PREPARED); klass->set_state(JV_STATE_PREPARED);
} }
if (state >= JV_STATE_LINKED && klass->state < JV_STATE_LINKED) if (state >= JV_STATE_LINKED && klass->state < JV_STATE_LINKED)
{ {
if (gcj::verifyClasses) if (gcj::verifyClasses)
verify_class (klass); verify_class (klass);
ensure_class_linked (klass); ensure_class_linked (klass);
link_exception_table (klass); link_exception_table (klass);
link_symbol_table (klass); link_symbol_table (klass);
klass->set_state(JV_STATE_LINKED); klass->set_state(JV_STATE_LINKED);
} }
} }
catch (java::lang::Throwable *exc) catch (java::lang::Throwable *exc)
{ {
klass->thread = save; klass->thread = save;
klass->set_state(JV_STATE_ERROR); klass->set_state(JV_STATE_ERROR);
throw exc; throw exc;
} }
klass->thread = save;
klass->thread = save; if (klass->state == JV_STATE_ERROR)
throw new java::lang::LinkageError;
}
if (klass->state == JV_STATE_ERROR) if (__builtin_expect (klass->state == JV_STATE_LINKED, false)
throw new java::lang::LinkageError; && state >= JV_STATE_LINKED
&& JVMTI_REQUESTED_EVENT (ClassPrepare))
{
JNIEnv *jni_env = _Jv_GetCurrentJNIEnv ();
_Jv_JVMTI_PostEvent (JVMTI_EVENT_CLASS_PREPARE, self, jni_env,
klass);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment