--- a/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp Sat Mar 01 01:36:48 2014 -0800
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp Sat Mar 01 08:05:55 2014 -0800
@@ -29,6 +29,7 @@
#include "prims/jvmtiEnvThreadState.hpp"
#include "prims/jvmtiEventController.hpp"
#include "prims/jvmtiThreadState.hpp"
+#include "prims/jvmtiThreadState.inline.hpp"
#include "runtime/fieldDescriptor.hpp"
#include "runtime/frame.hpp"
#include "runtime/handles.inline.hpp"
@@ -334,6 +335,60 @@
JvmtiEnv* next(JvmtiEnvBase* env) { return env->next_environment(); }
};
+// VM operation to update for pop top frame.
+class VM_UpdateForPopTopFrame : public VM_Operation {
+private:
+ JvmtiThreadState* _state;
+ jvmtiError _result;
+
+public:
+ VM_UpdateForPopTopFrame(JvmtiThreadState* state) {
+ _state = state;
+ _result = JVMTI_ERROR_NONE;
+ }
+ VMOp_Type type() const { return VMOp_UpdateForPopTopFrame; }
+ jvmtiError result() { return _result; }
+ void doit() {
+ JavaThread* jt = _state->get_thread();
+ if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) {
+ _state->update_for_pop_top_frame();
+ } else {
+ _result = JVMTI_ERROR_THREAD_NOT_ALIVE;
+ }
+ }
+};
+
+// VM operation to set frame pop.
+class VM_SetFramePop : public VM_Operation {
+private:
+ JvmtiEnv *_env;
+ JvmtiThreadState* _state;
+ jint _depth;
+ jvmtiError _result;
+
+public:
+ VM_SetFramePop(JvmtiEnv *env, JvmtiThreadState* state, jint depth) {
+ _env = env;
+ _state = state;
+ _depth = depth;
+ _result = JVMTI_ERROR_NONE;
+ }
+ // Nested operation must be allowed for the VM_EnterInterpOnlyMode that is
+ // called from the JvmtiEventControllerPrivate::recompute_thread_enabled.
+ bool allow_nested_vm_operations() const { return true; }
+ VMOp_Type type() const { return VMOp_SetFramePop; }
+ jvmtiError result() { return _result; }
+ void doit() {
+ JavaThread* jt = _state->get_thread();
+ if (Threads::includes(jt) && !jt->is_exiting() && jt->threadObj() != NULL) {
+ int frame_number = _state->count_frames() - _depth;
+ _state->env_thread_state((JvmtiEnvBase*)_env)->set_frame_pop(frame_number);
+ } else {
+ _result = JVMTI_ERROR_THREAD_NOT_ALIVE;
+ }
+ }
+};
+
// VM operation to get monitor information with stack depth.
class VM_GetOwnedMonitorInfo : public VM_Operation {